web-dev-qa-db-fra.com

Ajouter une image à la bibliothèque multimédia à partir de l'URL dans le répertoire de téléchargement

Le plugin "Video Embed & Thumbnail Generator" permet de générer des miniatures à partir de vidéos. Il enregistre l'URL de la vignette sous forme de métadonnées pour la pièce jointe. La vignette est ajoutée au répertoire de téléchargement. Y a-t-il un moyen de prendre cette image et de l'ajouter à la médiathèque pour que je puisse la transmettre à travers la fonction image_downsize afin de créer une vignette de taille différente?

wp_insert_attachment semble avoir besoin d'un chemin d'accès à un fichier et non d'une URL, ou est-ce que je me trompe? Comment puis-je ajouter une URL à la médiathèque?

c'est peut-être une copie de Comment puis-je obtenir une image du répertoire uploads et la saisir dans la médiathèque? mais ça n'a jamais eu de réponse.

2
helgatheviking

Voici les parties pertinentes que j'ai modifiées de la fonction kg_video_attachment_fields_to_save() qui permet de filtrer attachment_fields_to_save:

    $thumb_url = $attachment['kgflashmediaplayer-poster'];

    //insert the $thumb_url into the media library if it does not already exist
    if ( ! ($thumb_id = get_attachment_id_from_src( $thumb_url ) ) ) {

        $post_id = $post['ID'];
        $desc = $attachment['post_title'] . ' thumbnail';

        //is image in uploads directory?
        $upload_dir = wp_upload_dir();

        if ( FALSE !== strpos( $url, $upload_dir['baseurl'] ) ) {
            $wp_filetype = wp_check_filetype(basename($thumb_url), null );
            $filename = preg_replace('/\.[^.]+$/', '', basename($thumb_url));

            $attachment = array(
               'guid' => $thumb_url, 
               'post_mime_type' => $wp_filetype['type'],
               'post_title' => $desc,
               'post_content' => '',
               'post_status' => 'inherit'
            );
            $thumb_id = wp_insert_attachment( $attachment, basename($thumb_url), $post_id );
            // you must first include the image.php file
            // for the function wp_generate_attachment_metadata() to work
            require_once(ABSPATH . 'wp-admin/includes/image.php');
            $attach_data = wp_generate_attachment_metadata( $thumb_id, basename($thumb_url) );
            wp_update_attachment_metadata( $thumb_id, $attach_data );
        } else { //not in uploads so we'll have to sideload it
            $tmp = download_url( $thumb_url );

            // Set variables for storage
            // fix file filename for query strings
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $thumb_url, $matches);
            $file_array['name'] = basename($matches[0]);
            $file_array['tmp_name'] = $tmp;

            // If error storing temporarily, unlink
            if ( is_wp_error( $tmp ) ) {
                @unlink($file_array['tmp_name']);
                $file_array['tmp_name'] = '';
            }

            // do the validation and storage stuff
            $thumb_id = media_handle_sideload( $file_array, $post_id, $desc );

            // If error storing permanently, unlink
            if ( is_wp_error($thumb_id) ) {
                @unlink($file_array['tmp_name']);
                return $thumb_id;
            }

            if ( $local_src = wp_get_attachment_url( $thumb_id ) ) {
                update_post_meta($post['ID'], '_kgflashmediaplayer-poster', $local_src);
            }

        } //end sideload

    } //end get_attachment_id_from_src

    if(!is_wp_error($thumb_id)) {
        $thumb_id = intval( $thumb_id );
        update_post_meta($post['ID'], '_kgflashmediaplayer-poster-id', $thumb_id);
    } 

Et l'ID de vignette personnalisé de la vidéo est maintenant stocké dans le champ méta: _kgflashmediaplayer-poster-id

function get_attachment_id_from_src ($image_src) {
    global $wpdb;

    $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
    $id = $wpdb->get_var($query);
    return $id;

}

Je n'aime pas la get_attachment_id_from_src() mais il n'y a pas de moyen intégré de le faire. Je devrais ajouter une vérification pour que, si la source actuelle soit la même que l'ancienne source, cette requête n'a pas besoin de s'exécuter. Le plugin embedder crée de nombreuses miniatures potentielles pour chaque vidéo et il n’est pas nécessaire de toutes les insérer dans la médiathèque .... cela se déclenche dès lors qu’une pièce jointe multimédia est enregistrée et doit couvrir les images déjà présentes dans la médiathèque. sont dans le répertoire des médias mais pas dans la bibliothèque et sur des images sur d'autres serveurs (qui sont chargés de manière indirecte et l'URL est adaptée à la nouvelle URL locale)

2
helgatheviking

Si l'image se trouve dans la source de contenu, vous pouvez l'extraire et utiliser media_sideload_image (); pour l'importer dans la médiathèque.

Cet exemple de code provient de mon plugin Outils multimédia . Ce qui a fait cela via une page d'administrateur via ajax. Il définit également l'image extraite en tant qu'image sélectionnée pour le message. L'identifiant de la publication est transmis à cette fonction via ajax. Pour consulter le code complet, voir: http://plugins.trac.wordpress.org/browser/media-tools/trunk/media-tools.php?rev=581988

   function process_image( $post_id ) {
        $response = '';
        $error = 0;
        $post = get_post( $post_id );
        $img = $this->extract_image( $post );
        if( empty( $img ) ) {
            $response .=  'No images found <br>';
            die( sprintf( $response . '<br>Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error  > 0 ? $error : 'no' ) );
         }
        /** @var $file string or WP_Error of image attached to the post  */
        $file = media_sideload_image( $img, (int)$post->ID );
        if ( is_wp_error( $file ) ) {
            $response .= '<span style="color:red">Upload Error: Could not upload image. Check for malformed img src url</span><br>';
            $error++;
        } else {

         $atts = $this->get_attach( $post->ID );
         foreach ( $atts as $a ) {
             $img = set_post_thumbnail( $post->ID, $a['ID'] );
             if ( $img ) {
                  $thumb = wp_get_attachment_thumb_url( $a['ID'] );
                  $response .= '<img src="'.esc_url( $thumb ).'" /><br>';
                  $response .= '<a href="'.wp_nonce_url( get_edit_post_link( $a['ID'], true ) ).'" >'.get_the_title( $a['ID'] ).'</a>  Set as Featured Image</p><br>';
                        }
                    }
                    unset( $atts );
                    unset( $a );
                }
            die( sprintf( $response.'<br>Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) );
    }


    /**
     * Extracts the first image in the post content
     * @param object $post the post object
     * @return bool|string false if no images or img src
     */
    function extract_image( $post ) {
        $html = $post->post_content;
        if ( stripos( $html, '<img' ) !== false ) {
            $regex = '#<\s*img [^\>]*src\s*=\s*(["\'])(.*?)\1#im';
            preg_match( $regex, $html, $matches );
            unset( $regex );
            unset( $html );
            if ( is_array( $matches ) && ! empty( $matches ) ) {
                return  $matches[2];

            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * Queries for attached images
     * @param int $post_id The post id to check if attachments exist
     * @return array|bool The 1st attached on success false if no attachments
     */
    function get_attach( $post_id ) {
        return get_children( array (
                'post_parent'    => $post_id,
                'post_type'      => 'attachment',
                'post_mime_type' => 'image',
                'posts_per_page'  => (int)1
            ), ARRAY_A );
    }
5
Chris_O