Adăugare imagine în biblioteca media din URL în directorul uploads

6 sept. 2012, 04:05:09
Vizualizări: 16.8K
Voturi: 2

Plugin-ul "Video Embed & Thumbnail Generator" face o treabă excelentă generând thumbnail-uri din videoclipuri. Acesta salvează URL-ul thumbnail-ului ca metadate pentru atașament. Thumbnail-ul este adăugat în directorul uploads. Există vreo metodă prin care să pot lua această imagine și să o adaug în biblioteca media, astfel încât să o pot procesa prin funcția image_downsize pentru a crea thumbnails de dimensiuni diferite?

Funcția wp_insert_attachment pare să necesite o cale către un fișier și nu un URL, sau greșesc? Cum pot adăuga un URL în biblioteca media?

Această întrebare este posibil un duplicat al Cum pot obține o imagine din directorul uploads și să o introduc în biblioteca media? dar acea întrebare nu a primit niciun răspuns.

0
Toate răspunsurile la întrebare 2
6

Dacă imaginea se află în sursa conținutului, o puteți extrage și utiliza media_sideload_image(); pentru a o importa în biblioteca media.

Acest exemplu de cod este din plugin-ul meu Media Tools, care face acest lucru printr-o pagină de administrare via ajax. De asemenea, setează imaginea extrasă ca imagine reprezentativă pentru articol. ID-ul articolului este transmis acestei funcții prin ajax. Pentru a vedea codul complet, accesați: 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 .=  'Nu au fost găsite imagini <br>';
            die( sprintf( $response . '<br>Media tool complete (Post ID %1$s) în %2$s secunde. %3$d erori', esc_html( $post->ID ), timer_stop(), $error = $error  > 0 ? $error : 'niciuna' ) );
         }
        /** @var $file string sau WP_Error a imaginii atașate postării  */
        $file = media_sideload_image( $img, (int)$post->ID );
        if ( is_wp_error( $file ) ) {
            $response .= '<span style="color:red">Eroare la încărcare: Nu s-a putut încărca imaginea. Verificați URL-ul src img pentru erori</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>  Setată ca Imagine Reprezentativă</p><br>';
                        }
                    }
                    unset( $atts );
                    unset( $a );
                }
            die( sprintf( $response.'<br>Media tool complete (Post ID %1$s) în %2$s secunde. %3$d erori', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'niciuna' ) );
    }


    /**
     * Extrage prima imagine din conținutul postării
     * @param object $post obiectul post
     * @return bool|string false dacă nu există imagini sau src img
     */
    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;
        }
    }

    /**
     * Interoghează pentru imaginile atașate
     * @param int $post_id ID-ul postării pentru a verifica dacă există atașamente
     * @return array|bool Primul atașament în caz de succes, false dacă nu există atașamente
     */
    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 );
    }
6 sept. 2012 06:08:37
Comentarii

media_sideload_image() pare promițătoare, dar cum obții ID-ul atașamentului pentru imaginea încărcată lateral?

helgatheviking helgatheviking
6 sept. 2012 21:41:15

Uită-te la funcția get_attach. Rulează după media_sideload_image.

Chris_O Chris_O
6 sept. 2012 22:00:08

te referi la get_attachment? asta are nevoie de ID-ul pe care încă nu îl am. o să mă uit la media_handle_sideload()

helgatheviking helgatheviking
6 sept. 2012 22:32:31

de asemenea, încărcarea laterală a fișierelor media nu este chiar corectă pentru că duplică imaginile care sunt deja în folderul wp-uploads (unde plugin-ul video embedder le adaugă)

helgatheviking helgatheviking
6 sept. 2012 22:58:21

Ei bine, video embedder ar trebui să le adauge în biblioteca ta media în loc să le depună pur și simplu în directorul de încărcări.

Chris_O Chris_O
7 sept. 2012 00:11:41

sunt de acord. am ajuns să modific plugin-ul pentru a face exact asta. am trimis noul meu cod autorului, așa că poate va fi inclus într-o versiune viitoare.

helgatheviking helgatheviking
7 sept. 2012 16:25:09
Arată celelalte 1 comentarii
4

Iată părțile relevante pe care le-am modificat din funcția kg_video_attachment_fields_to_save() care filtrează attachment_fields_to_save:

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

    //inserează $thumb_url în biblioteca media dacă nu există deja
    if ( ! ($thumb_id = get_attachment_id_from_src( $thumb_url ) ) ) {

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

        //imaginea este în directorul uploads?
        $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 );
            // trebuie să incluzi mai întâi fișierul image.php
            // pentru ca funcția wp_generate_attachment_metadata() să funcționeze
            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 { //nu este în uploads, așa că va trebui să-l încărcăm manual (sideload)
            $tmp = download_url( $thumb_url );

            // Setează variabilele pentru stocare
            // corectează numele fișierului pentru 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;

            // Dacă apare o eroare la stocarea temporară, șterge fișierul
            if ( is_wp_error( $tmp ) ) {
                @unlink($file_array['tmp_name']);
                $file_array['tmp_name'] = '';
            }

            // face validarea și stocarea
            $thumb_id = media_handle_sideload( $file_array, $post_id, $desc );

            // Dacă apare o eroare la stocarea permanentă, șterge fișierul
            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);
            }

        } //final sideload

    } //final 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);
    } 

Iar ID-ul thumbnail-ului personalizat al videoclipului este acum stocat în câmpul meta: _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;

}

Nu sunt încântat de funcția get_attachment_id_from_src() dar nu există o metodă integrată pentru a face acest lucru. Ar trebui să adaug o verificare, astfel încât dacă src-ul curent este același cu cel vechi, această interogare să nu mai fie necesară. Plugin-ul de embedare creează multe thumbnail-uri potențiale pentru fiecare videoclip și nu este nevoie să le introducem pe toate în biblioteca media.... așadar, acest cod se execută de fiecare dată când un atașament media este salvat și ar trebui să acopere imaginile care sunt deja în biblioteca media, imaginile care sunt în directorul media dar nu în bibliotecă și imaginile de pe alte servere (care sunt încărcate manual, iar URL-ul este ajustat la noul URL local)

7 sept. 2012 16:35:50
Comentarii

Funcție minunată... a necesitat puțină ajustare dar a funcționat excelent pentru nevoile mele ;)

Sagive Sagive
29 sept. 2015 02:22:12

Deoarece această soluție are 3 ani, aș presupune că acum există o metodă mult mai bună de a face asta.

helgatheviking helgatheviking
29 sept. 2015 12:17:39

încă a funcționat pentru mine - ceea ce era tot ce aveam nevoie ;) - un cod rapid, gata de utilizat și detaliat. mulțumesc.

Sagive Sagive
1 oct. 2015 07:55:36

funcție frumoasă get_attachment_id_from_src, nu prea elegantă, dar foarte eficientă!

Magico Magico
5 ian. 2017 12:59:18