web-dev-qa-db-fra.com

Échec du téléchargement d'images dans la bibliothèque multimédia via wp_handle_sideload ()

Mon scénario de base est le suivant:

J'ai un répertoire sur mon serveur qui se remplit d'images via ftp de temps en temps. Je voudrais déplacer ces images vers le répertoire de téléchargement wp, puis les ajouter à la bibliothèque multimédia avec wp_insert_attachment(). Je pensais que wp_handle_sideload() était la fonction correcte pour cela, mais s'il est alimenté avec un chemin absolu vers l'une des images, cela retourne une erreur.

Heres mon code jusqu'à présent:

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 );


    }
}

J'ai examiné des questions similaires, mais aucune des solutions présentées ne semblait avoir un lien avec l'échec de la recharge latérale. Franchement, je crois que je ne transmets pas le bon type de chemin de fichier à wp_handle_sideload(), mais comme il n’est pas documenté dans le codex, je n’ai aucune idée du type de contribution auquel il pourrait s’attendre. Est-ce que quelqu'un sait ce que je dois changer pour que cela fonctionne?

6
Anatol

Votre tableau de fichiers doit imiter le fichier global $ _FILES. Vous devez donc créer une page fictive avec des entrées de fichier qui impriment ou extraient le contenu de $ _FILES pour voir sa structure. Créez une variable qui ressemble à cela avec vos données et transmettez cette wp_handle_sideload().

EDIT:

Cette réponse était correcte au moment de la rédaction et vaut si vous souhaitez utiliser wp_handle_sideload(). media_handle_sideload() vous permet de joindre le support à un message en même temps.

Voir la propre réponse de @ anatol pour une solution complète.

1
sanchothefat

C'est le code étonnamment simple qui a finalement permis de faire ce qu'il est supposé:

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
    }
}
7
Anatol

J'ai utilisé le code d'Anatol, mais j'ai rencontré des problèmes lors de l'extraction d'images à l'aide de HTTP. Pour résoudre ce problème, utilisez d'abord download_url pour obtenir une copie locale de l'image.

Il est également utile de savoir que media_handle_sideload renvoie le numéro attachment_id que vous pouvez utiliser pour afficher l'image après l'avoir téléchargée.

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 '<img src="' . $_src . '" />';
}
5
Charles Jaimet

essayer

    { // 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";
      }
2
Zarar Ansari