Das Hochladen von Bildern in die Medienbibliothek über wp_handle_sideload () schlägt fehl

Mein grundlegendes Szenario ist folgendes:

Ich habe ein Verzeichnis auf meinem Server, das ab und zu mit Bildern über FTP gefüllt wird. Ich würde diese Bilder in das Wp-Upload-Verzeichnis verschieben und sie dann mit wp_insert_attachment() zur Medienbibliothek wp_insert_attachment() . Ich dachte, dass wp_handle_sideload() die richtige function dafür ist, aber wenn mit einem absoluten Pfad zu einem der Bilder gefüttert wird, gibt es einen Fehler zurück.

Heres mein Code so weit:

 function oo_attach_images($images, $id){ //$images is an array of anbsolute image paths, $id is the id of a post I want the images to be attached to. require_once(ABSPATH . '/wp-admin/includes/file.php'); require_once(ABSPATH . '/wp-admin/includes/image.php'); foreach($images as $image){ $override = array('test_form' => FALSE); $file = wp_handle_sideload($image, $override); print_r($file); //returns: Array ( [error] => ) $attachment = array( 'post_mime_type' => $file['type'], 'post_title' => basename($image), 'post_content' => ' ', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $file['file'], $id ); $attach_data = wp_generate_attachment_metadata( $attach_id, $file['file'] ); wp_update_attachment_metadata( $attach_id, $attach_data ); } } 

Ich habe ähnliche Fragen untersucht, aber keine der hier beschriebenen Lösungen schien etwas damit zu tun zu haben, dass das Sideload selbst versagte. Ehrlich gesagt glaube ich, dass ich nicht den richtigen Dateipfad an wp_handle_sideload() , aber da es im Codex nicht dokumentiert ist, habe ich keine Ahnung, welche Art von Eingabe es erwarten könnte. Weiß jemand, was ich ändern muss, damit dies funktioniert?

Solutions Collecting From Web of "Das Hochladen von Bildern in die Medienbibliothek über wp_handle_sideload () schlägt fehl"

Ihr Dateiarray muss das $ _FILES global nachahmen, daher müssen Sie eine Dummy-Seite mit einigen Dateieingaben erstellen, die den Inhalt von $ _FILES ausdruckt oder ablegt, um zu sehen, wie er strukturiert ist. Machen Sie eine Variable, die so aussieht, mit Ihren Daten und übergeben Sie diese wp_handle_sideload() .

BEARBEITEN:

Diese Antwort war zum Zeitpunkt des Schreibens korrekt und ist, wenn Sie wp_handle_sideload() verwenden wp_handle_sideload() . media_handle_sideload() können Sie das Medium gleichzeitig an einen Post anhängen.

Siehe @ Anatols eigene Antwort für eine vollständige Lösung.

Dies ist der überraschend einfache Code, der letztendlich dazu führte, das zu tun, was er eigentlich sein sollte:

 function oo_attach_images($images, $id){ //$images is an array of image urls, $id is the ID of the post I want the images to be attached to require_once(ABSPATH . '/wp-admin/includes/file.php'); require_once(ABSPATH . '/wp-admin/includes/media.php'); require_once(ABSPATH . '/wp-admin/includes/image.php'); foreach($images as $image){ $array = array( //array to mimic $_FILES 'name' => basename($image), //isolates and outputs the file name from its absolute path 'type' => wp_check_filetype($image), // get mime type of image file 'tmp_name' => $image, //this field passes the actual path to the image 'error' => 0, //normally, this is used to store an error, should the upload fail. but since this isnt actually an instance of $_FILES we can default it to zero here 'size' => filesize($image) //returns image filesize in bytes ); media_handle_sideload($array, $id); //the actual image processing, that is, move to upload directory, generate thumbnails and image sizes and writing into the database happens here } } 

Ich habe den Code von Anatol verwendet, bin aber beim Ziehen von Bildern mit HTTP in Schwierigkeiten geraten. Um dies zu beheben, verwenden Sie zuerst download_url, um eine lokale Kopie des Bildes zu erhalten.

Es ist auch nützlich zu wissen, dass media_handle_sideload die attachment_id-Nummer zurückgibt, mit der Sie das Bild anzeigen können, nachdem Sie es hochgeladen haben.

 foreach($images as $image){ $tmp_name = download_url( $image ); // get the image and save it locally temporarily $array = array( 'name' => basename( $image ), 'type' => 'image/jpeg', 'tmp_name' => $tmp_name, 'error' => 0, 'size' => filesize( $tmp_name ) ); $_image_id = media_handle_sideload($array, $id); $_src = wp_get_attachment_url( $_image_id ); echo ''; } 

Versuchen

  { // only need these if performing outside of admin environment require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); // example image $image = $review['image']; // magic sideload image returns an HTML image, not an ID $media = media_sideload_image($image, $new_post_id); // therefore we must find it so we can set it as featured ID if(!empty($media) && !is_wp_error($media)){ $args = array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_status' => 'any', 'post_parent' => $new_post_id ); // reference new image to set as featured $attachments = get_posts($args); if(isset($attachments) && is_array($attachments)){ foreach($attachments as $attachment){ // grab source of full size images (so no 300x150 nonsense in path) $image = wp_get_attachment_image_src($attachment->ID, 'full'); // determine if in the $media image we created, the string of the URL exists if(strpos($media, $image[0]) !== false){ // if so, we found our image. set it as thumbnail set_post_thumbnail($new_post_id, $attachment->ID); // only want one image break; } } } } } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; }