Agregar imagen a la biblioteca de medios desde la URL en el directorio de subidas

2

El complemento "Video Embed & Thumbnail Generator" hace un gran trabajo al generar miniaturas a partir de videos. Guarda la URL en miniatura como metadatos para el archivo adjunto. La miniatura se agrega al directorio de subidas. ¿Hay alguna forma de tomar esta imagen y agregarla a la biblioteca de medios para que pueda pasar la imagen a través de la función image_downsize para crear una miniatura de un tamaño diferente?

wp_insert_attachment parece que necesita una ruta a un archivo y no una URL, ¿o me equivoco? ¿Cómo puedo agregar una URL a la biblioteca de medios?

este es posiblemente un duplicado de ¿Cómo puedo obtener una imagen del directorio de subidas e ingresarla en la biblioteca de medios? pero nunca obtuve ninguna respuesta.

    
pregunta helgatheviking 06.09.2012 - 03:05

2 respuestas

2

Aquí están las partes pertinentes que cambié de la función kg_video_attachment_fields_to_save() que filtra 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);
    } 

Y el ID personalizado en miniatura del video ahora se almacena en el meta campo: _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;

}

No me gusta el get_attachment_id_from_src() pero no hay una forma integrada de hacerlo. Debo agregar una verificación para que si la fuente actual es la misma que la fuente anterior, esta consulta no tenga que ejecutarse. El complemento incrustador crea muchas miniaturas potenciales para cada video y no hay necesidad de insertarlas todas en la biblioteca de medios ... así que esto se dispara cada vez que se guarda un archivo adjunto de medios y debe cubrir imágenes que ya están en la biblioteca de medios están en el directorio de medios, pero no en la biblioteca ni en las imágenes de otros servidores (que se transfieren y la URL se ajusta a la nueva URL local)

    
respondido por el helgatheviking 07.09.2012 - 15:35
5

Si la imagen está en el origen de contenido, puede extraerla y usar media_sideload_image (); para importarla en el biblioteca de medios.

Este ejemplo de código es de mi complemento Media Tools . Lo que hace esto a través de una página de administración vía ajax. También establece la imagen extraída como la imagen destacada para la publicación. La identificación de la publicación se pasa a esta función a través de ajax Para ver el código completo, consulte: enlace

   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*(["\'])(.*?)#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 );
    }
    
respondido por el Chris_O 06.09.2012 - 05:08

Lea otras preguntas en las etiquetas