È possibile impostare un'immagine in evidenza con URL di immagine esterna

20 ago 2014, 10:53:53
Visualizzazioni: 42.5K
Voti: 25

So che esistono plugin che recuperano immagini da URL remoti e le memorizzano localmente. Vorrei solo sapere se è possibile utilizzare un'immagine come Immagine in Evidenza senza memorizzarla nella Libreria Media?

4
Commenti

Puoi farlo con un campo personalizzato dove memorizzare l'URL dell'immagine esterna. Potrebbe essere difficile farlo funzionare ogni volta che è presente the_post_thumbnail() (o funzioni simili) o farlo funzionare con diverse dimensioni delle immagini definite dal tema o dal plugin.

cybmeta cybmeta
20 ago 2014 11:21:22

Puoi usare questo plugin per impostare un'immagine esterna come immagine in evidenza: https://wordpress.org/plugins/wp-remote-thumbnail/

Advanced SEO Advanced SEO
20 ago 2014 11:59:27

Archivia l'immagine localmente o la richiama da remoto?

Volatil3 Volatil3
20 ago 2014 13:22:22

@Volatil3 Non l'ho testato, ma leggendo la descrizione del plugin direi che lo chiama in remoto.

Andy Macaulay-Brook Andy Macaulay-Brook
24 mag 2016 10:48:53
Tutte le risposte alla domanda 1
4
40

Sì, è possibile e abbastanza semplice.

Questo è il flusso di lavoro che suggerisco:

  1. Aggiungi un'interfaccia utente per inserire l'URL dell'immagine in evidenza. La scelta migliore è probabilmente utilizzare il filtro 'admin_post_thumbnail_html'
  2. Usa l'azione 'save_post' per salvare l'URL (dopo i controlli di sicurezza e validazione) in una meta personalizzata del post
  3. Usa il filtro 'post_thumbnail_html' per restituire il markup HTML <img> corretto, sovrascrivendo quello predefinito, se il post per cui è richiesta l'immagine in evidenza ha la meta con l'immagine esterna

Per funzionare, questo flusso di lavoro richiede che l'immagine in evidenza venga mostrata nel template utilizzando le funzioni get_the_post_thumnbail() o the_post_thumbnail().

Inoltre, dobbiamo assicurarci che il valore meta '_thumbnail_id' non sia vuoto quando impostiamo la meta per l'URL esterno, altrimenti has_post_thumbnail() restituirà false per i post che hanno solo un'immagine in evidenza esterna.

Infatti, è possibile che un post abbia sia un'immagine in evidenza standard locale che una impostata tramite il nostro flusso di lavoro, e in questo caso verrà utilizzata quella esterna.

Per implementare il nostro flusso di lavoro abbiamo bisogno di una funzione per validare l'URL usato come immagine in evidenza esterna, perché dobbiamo essere sicuri che sia un URL valido per un'immagine.

Ci sono diversi modi per fare questo; qui uso un metodo molto semplice che controlla solo l'URL, senza scaricare l'immagine. Questo funziona solo per URL di immagini statiche e non verifica che l'immagine esista realmente, ma è veloce. Modificalo con qualcosa di più avanzato se necessario (qui trovi qualche aiuto).

function url_is_image( $url ) {
    if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
        return FALSE;
    }
    $ext = array( 'jpeg', 'jpg', 'gif', 'png' );
    $info = (array) pathinfo( parse_url( $url, PHP_URL_PATH ) );
    return isset( $info['extension'] )
        && in_array( strtolower( $info['extension'] ), $ext, TRUE );
}

Abbastanza semplice. Ora aggiungiamo i 3 hook descritti nel flusso di lavoro sopra:

add_filter( 'admin_post_thumbnail_html', 'thumbnail_url_field' );

add_action( 'save_post', 'thumbnail_url_field_save', 10, 2 );

add_filter( 'post_thumbnail_html', 'thumbnail_external_replace', 10, PHP_INT_MAX );

e le relative funzioni. Prima quella che mostra il campo nell'amministrazione:

function thumbnail_url_field( $html ) {
    global $post;
    $value = get_post_meta( $post->ID, '_thumbnail_ext_url', TRUE ) ? : "";
    $nonce = wp_create_nonce( 'thumbnail_ext_url_' . $post->ID . get_current_blog_id() );
    $html .= '<input type="hidden" name="thumbnail_ext_url_nonce" value="' 
        . esc_attr( $nonce ) . '">';
    $html .= '<div><p>' . __('Oppure', 'txtdomain') . '</p>';
    $html .= '<p>' . __( 'Inserisci l\'URL per l\'immagine esterna', 'txtdomain' ) . '</p>';
    $html .= '<p><input type="url" name="thumbnail_ext_url" value="' . $value . '"></p>';
    if ( ! empty($value) && url_is_image( $value ) ) {
        $html .= '<p><img style="max-width:150px;height:auto;" src="' 
            . esc_url($value) . '"></p>';
        $html .= '<p>' . __( 'Lascia vuoto l\'URL per rimuovere.', 'txtdomain' ) . '</p>';
    }
    $html .= '</div>';
    return $html;
}

Nota che ho usato 'txtdomain' come dominio di testo, ma dovresti usare un dominio di testo appropriato e registrato.

Ecco come appare l'output quando è vuoto:

URL esterno per l'immagine in evidenza: il campo

Ed ecco come appare dopo aver aggiunto un URL immagine e salvato/aggiornato il post:

URL esterno per l'immagine in evidenza: il campo dopo il riempimento e il salvataggio

Ora che la nostra interfaccia di amministrazione è pronta, scriviamo la routine di salvataggio:

function thumbnail_url_field_save( $pid, $post ) {
    $cap = $post->post_type === 'page' ? 'edit_page' : 'edit_post';
    if (
        ! current_user_can( $cap, $pid )
        || ! post_type_supports( $post->post_type, 'thumbnail' )
        || defined( 'DOING_AUTOSAVE' )
    ) {
        return;
    }
    $action = 'thumbnail_ext_url_' . $pid . get_current_blog_id();
    $nonce = filter_input( INPUT_POST, 'thumbnail_ext_url_nonce', FILTER_SANITIZE_STRING );
    $url = filter_input( INPUT_POST,  'thumbnail_ext_url', FILTER_VALIDATE_URL );
    if (
        empty( $nonce )
        || ! wp_verify_nonce( $nonce, $action )
        || ( ! empty( $url ) && ! url_is_image( $url ) )
    ) {
        return;
    }
    if ( ! empty( $url ) ) {
        update_post_meta( $pid, '_thumbnail_ext_url', esc_url($url) );
        if ( ! get_post_meta( $pid, '_thumbnail_id', TRUE ) ) {
            update_post_meta( $pid, '_thumbnail_id', 'by_url' );
        }
    } elseif ( get_post_meta( $pid, '_thumbnail_ext_url', TRUE ) ) {
        delete_post_meta( $pid, '_thumbnail_ext_url' );
        if ( get_post_meta( $pid, '_thumbnail_id', TRUE ) === 'by_url' ) {
            delete_post_meta( $pid, '_thumbnail_id' );
        }
    }
}

La funzione, dopo alcuni controlli di sicurezza, esamina l'URL inviato e, se è corretto, lo salva nella meta del post '_thumbnail_ext_url'. Se l'URL è vuoto e la meta era salvata, viene eliminata, consentendo di rimuovere la meta semplicemente svuotando il campo dell'URL esterno.

Ultima cosa da fare è mostrare il markup dell'immagine in evidenza quando il nostro URL immagine esterna è impostato nella meta:

function thumbnail_external_replace( $html, $post_id ) {
    $url =  get_post_meta( $post_id, '_thumbnail_ext_url', TRUE );
    if ( empty( $url ) || ! url_is_image( $url ) ) {
        return $html;
    }
    $alt = get_post_field( 'post_title', $post_id ) . ' ' .  __( 'anteprima', 'txtdomain' );
    $attr = array( 'alt' => $alt );
    $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, NULL );
    $attr = array_map( 'esc_attr', $attr );
    $html = sprintf( '<img src="%s"', esc_url($url) );
    foreach ( $attr as $name => $value ) {
        $html .= " $name=" . '"' . $value . '"';
    }
    $html .= ' />';
    return $html;
}

Abbiamo finito.

Cosa resta da fare

Nell'output dell'immagine in evidenza non ho usato gli attributi width o height, né le classi che WordPress solitamente aggiunge, come 'attachment-$size'. Questo perché determinare le dimensioni di un'immagine richiede un lavoro extra che rallenterebbe il caricamento della pagina, specialmente se hai più di un'immagine in evidenza nella pagina.

Se hai bisogno di questi attributi, puoi usare il mio codice aggiungendo un callback al filtro wp_get_attachment_image_attributes' (è un hook standard di WordPress) o forse puoi modificare il mio codice per determinare le dimensioni dell'immagine e mostrare gli attributi e le classi relative.

Plugin Gist

Tutto il codice postato qui, con l'eccezione dell'aggiunta di un'inizializzazione appropriata del dominio di testo, è disponibile come plugin funzionante in un Gist qui. Il codice lì usa un namespace, quindi richiede PHP 5.3+.

Note

Ovviamente, dovresti assicurarti di avere la licenza e l'autorizzazione per usare e collegare immagini nel tuo sito da fonti esterne.

20 ago 2014 23:39:57
Commenti

dove devo inserire questo codice

Ankit Agrawal Ankit Agrawal
5 dic 2018 12:14:49

puoi spiegarmi quale codice e in quale pagina dobbiamo scrivere. Sono un principiante in PHP/Wordpress quindi per favore spiegami passo dopo passo. Grazie

Ankit Agrawal Ankit Agrawal
10 dic 2018 15:09:43

@AnkitAgrawal guarda qui

gmazzap gmazzap
10 dic 2018 17:03:46

Non funziona con la versione 5.4 o 5.5.

Ciprian Ciprian
10 lug 2020 18:22:56