Come importare gli allegati di un sito in WordPress usando le REST API

Come importare gli allegati di un sito in WordPress usando le REST API

L'importazione di allegati da un'installazione di WordPress a un'altra può sembrare un compito arduo, ma grazie alle REST API di WordPress, questo processo può essere automatizzato e reso più efficiente. In questo articolo, vedremo passo dopo passo su come eseguire questa operazione.

Prima di tutto, è necessario ottenere una chiave API per l'installazione di WordPress sorgente per autenticarsi durante le chiamate API.

  1. Accedi alla tua dashboard di WordPress.
  2. Vai su Utenti > Il tuo profilo.
  3. Scorri verso il basso fino a trovare la sezione delle Applicazioni.
  4. Crea una nuova applicazione e annota la chiave API generata.

Possiamo quindi scrivere:


$per_page = 100; // Numero di elementi per pagina, regolabile in base alle esigenze
$page = 1;
$all_attachments = [];
$source_url = 'https://example.com/wp-json/wp/v2/media';
$api_key = 'YOUR_API_KEY';
$total_pages = 1; // Inizialmente impostato a 1 per entrare nel ciclo

do {
    $response = wp_remote_get($source_url . '?per_page=' . $per_page . '&page=' . $page, [
        'headers' => [
            'Authorization' => 'Bearer ' . $api_key,
        ],
    ]);

    if (is_wp_error($response)) {
        break; // Interrompe il ciclo se si verifica un errore
    }

    $headers = wp_remote_retrieve_headers($response);
    $body = wp_remote_retrieve_body($response);
    $attachments = json_decode($body, true);

    if (empty($attachments)) {
        break; // Interrompe il ciclo se non ci sono più allegati
    }

    $all_attachments = array_merge($all_attachments, $attachments);
    
    // Aggiorna il numero totale di pagine

    if (isset($headers['x-wp-totalpages'])) {
        $total_pages = intval($headers['x-wp-totalpages']);
    }

    $page++;
} while ($page <= $total_pages); // Continua fino a quando non abbiamo recuperato tutte le pagine

// Importa gli allegati nel sito di destinazione

foreach ($all_attachments as $attachment) {
     $attachment_url = $attachment['source_url'];
     if (!function_exists( 'download_url')) {
	require_once ABSPATH . 'wp-admin/includes/file.php';
     }
     $file = download_url($attachment_url);
     $filename = basename($attachment_url);

    $upload = wp_upload_bits($filename, null, $file);

    if (!$upload['error']) {
        $wp_filetype = wp_check_filetype($filename, null);
        $attachment_post = [
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name($filename),
            'post_content' => '',
            'post_status' => 'inherit',
        ];
        $attach_id = wp_insert_attachment($attachment_post, $upload['file']);
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata($attach_id, $upload['file']);
        wp_update_attachment_metadata($attach_id, $attach_data);
    } 
    wp_delete_file($file);  
}

Spiegazione del codice:

  1. Configurazione Iniziale:

    • per_page è impostato a 100 per recuperare 100 allegati per ogni chiamata API.
    • page è inizializzato a 1 per iniziare dalla prima pagina.
    • all_attachments è un array vuoto che memorizzerà tutti gli allegati recuperati.
    • total_pages è inizialmente impostato a 1 per entrare nel ciclo.
  2. Richiesta Paginata:

    • Viene eseguita una richiesta API utilizzando wp_remote_get con l'header di autenticazione Bearer.
    • Le intestazioni della risposta sono recuperate utilizzando wp_remote_retrieve_headers.
    • Il corpo della risposta viene decodificato da JSON a un array associativo PHP.
  3. Controllo e Memorizzazione degli Allegati:

    • Se la risposta non contiene allegati (empty($attachments)), il ciclo si interrompe.
    • Gli allegati ottenuti dalla risposta corrente vengono aggiunti a all_attachments utilizzando array_merge.
  4. Aggiornamento delle Pagine Totali:

    • L'header X-WP-TotalPages viene letto dalle intestazioni della risposta e convertito in un intero.
    • Il ciclo continua fino a quando tutte le pagine non sono state recuperate ($page <= $total_pages).
  5. Importazione degli Allegati:

    • Iteriamo su tutti gli allegati ottenuti e scarichiamo il file usando download_url.
    • Carichiamo il file nel sistema di WordPress del sito di destinazione usando wp_upload_bits.
    • Inseriamo l'allegato nel database di WordPress e generiamo i metadati necessari.

Conclusione

Importare gli allegati da un'installazione di WordPress a un'altra può essere semplificato utilizzando le REST API di WordPress. Questo metodo non solo risparmia tempo ma garantisce anche che tutti i dati vengano trasferiti in modo sicuro e accurato. Con un po' di codice e alcuni strumenti, puoi automatizzare questo processo e concentrarti su altre attività importanti.

Ricorda di eseguire sempre un backup completo dei tuoi siti prima di eseguire qualsiasi operazione di importazione o esportazione per evitare la perdita di dati.

Torna su