Ottenere immagini tramite URL e salvarle nella cartella uploads in modo programmatico
Sto lavorando a una migrazione di grandi dimensioni da un altro CMS a WordPress. Abbiamo una copia del database e abbiamo capito come estrarre il contenuto e creare post WordPress in modo programmatico utilizzando un'istanza della classe wpdb
.
Tuttavia, ci sono un paio di migliaia di immagini che vorremmo trasferire automaticamente, generare le varie dimensioni e poi allegare ai post, per risparmiare circa una settimana di lavoro!
Esiste un modo per ottenere un'immagine da un sito remoto tramite URL e salvarla nella mia cartella wp-uploads? Immagino che questo utilizzi wp_http
ma non ho familiarità con questa funzione.
Una volta che ho ottenuto l'immagine e l'ho salvata, sono a posto perché posso poi usare wp_generate_attachment_metadata
per creare le varie dimensioni e wp_insert_attachment
per allegarla a un post.
Grazie Simon

In realtà esiste una funzione molto utile che fa tutte e tre queste cose per te:
media_sideload_image( $url, $post_id, $descrizione );
Il primo argomento è l'URL remoto dell'immagine che vuoi scaricare. Il secondo argomento è l'ID del post a cui vuoi allegare l'immagine. Il terzo argomento è opzionale, ma se incluso sarà utilizzato come descrizione.
Suggerirei di trovare un modo per limitare i download in modo da evitare timeout, ad esempio limitando il numero di immagini scaricate per ogni caricamento e impostando l'importazione in modo che si aggiorni tra un download e l'altro, oppure utilizzando AJAX per eseguirle una alla volta in modo asincrono.

è assolutamente fantastico John, grazie mille - funziona perfettamente. Il throttling non è un problema perché ho impostato l'attesa per una pressione di tasto dopo ogni importazione di post per darci la possibilità di verificare manualmente i dettagli e annotare quelli problematici.

solo perché avevo bisogno dell'ID dell'allegato per collegarlo a un altro post, ecco un buon modo per farlo

Funziona benissimo, ma possiamo fare la stessa cosa con un file non immagine? Con un PDF per esempio. Se provo a eseguire la stessa funzione con un PDF ottengo questo messaggio di errore: array(1) { ["image_sideload_failed"]=> array(1) { [0]=> string(18) "Invalid image URL." } }

@MarcelloPerri il modo più veloce per farlo sarebbe aggiungere le estensioni dei file di cui hai bisogno al filtro per la funzione sideload prima di eseguire la funzione sideload: add_filter( 'image_sideload_extensions', fn( $exts ) => array_merge( $exts, [ 'pdf' ] ) );
. Per quanto ne so, non c'è nulla nella funzione che richieda che i file siano immagini.

La risposta di John è corretta riguardo all'uso di media_sideload_image
, tieni presente che potresti aver bisogno di includere questi script prima se non stai operando nel contesto di WP Admin:
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
Vedi https://codex.wordpress.org/Function_Reference/media_sideload_image#Notes
