Cum să obții imagini programatic după URL și să le salvezi în directorul uploads
Sunt implicat într-o migrare majoră de la un alt CMS la WordPress. Avem o copie a bazei de date și am stabilit cum să extragem conținutul și să creăm programatic postări WordPress folosind o instanță a clasei wpdb
.
Totuși, există câteva mii de imagini pe care am dori să le transferăm automat, să generăm diferite dimensiuni și apoi să le atașăm postărilor, pentru a economisi aproximativ o săptămână de muncă!
Există vreo metodă prin care pot obține o imagine de pe un site extern prin URL și să o salvez în directorul wp-uploads? Presupun că aceasta folosește wp_http
, dar nu sunt familiarizat cu aceasta.
Odată ce am obținut imaginea și am salvat-o, sunt ok, deoarece pot folosi apoi wp_generate_attachment_metadata
pentru a crea diferite dimensiuni și wp_insert_attachment
pentru a o atașa la o postare.
Mulțumesc, Simon

Există de fapt o funcție excelentă care face toate aceste trei lucruri pentru tine:
media_sideload_image( $url, $post_id, $description );
Primul argument este URL-ul de la distanță al imaginii pe care dorești să o descarci. Al doilea argument este ID-ul postării căreia dorești să atașezi imaginea. Al treilea argument este opțional, dar va fi o descriere dacă este inclus.
Aș sugera să găsești o metodă de a limita descărcările astfel încât să nu ai probleme de timeout, cum ar fi limitarea numărului de imagini descărcate pe fiecare încărcare și setarea importatorului să se reîmprospăteze între descărcări, sau folosirea AJAX pentru a le face una câte una asincron.

este absolut fantastic john, mulțumesc foarte mult - funcționează perfect. limitarea nu este o problemă, deoarece am setat-o să aștepte o apăsare de tastă după fiecare import de postare pentru a ne oferi ocazia să verificăm manual detaliile și să notăm orice probleme.

doar pentru că aveam nevoie de ID-ul atașamentului să fie conectat la o altă postare, iată o metodă bună de a face asta

Aceasta funcționează excelent, dar putem face același lucru cu un fișier care nu este imagine. De exemplu, cu un PDF. Dacă încerc să rulez aceeași funcție cu un PDF, primesc acest mesaj de eroare: array(1) { ["image_sideload_failed"]=> array(1) { [0]=> string(18) "Invalid image URL." } }

@MarcelloPerri cel mai rapid mod de a face asta ar fi să adaugi extensiile de fișiere necesare la filtrul pentru funcția de sideload înainte de a rula funcția: add_filter( 'image_sideload_extensions', fn( $exts ) => array_merge( $exts, [ 'pdf' ] ) );
. Din câte pot să-mi dau seama, nu există nimic în funcție care să necesite ca fișierele să fie imagini.

Răspunsul lui John este corect referitor la utilizarea media_sideload_image
, doar rețineți că poate fi necesar să includeți aceste scripturi înainte dacă nu faceți acest lucru în contextul 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');
Consultați https://codex.wordpress.org/Function_Reference/media_sideload_image#Notes
