È possibile impostare un'immagine in primo piano con un URL di immagine esterno


20

So che ci sono plugin che recuperano immagini dall'URL remoto e lo memorizzano localmente. Voglio solo sapere se è possibile non archiviare l'immagine nella Libreria multimediale ma utilizzarla come Immagine in primo piano ?


Potresti farlo con un campo personalizzato in cui memorizzi l'URL dell'immagine esterna. Potrebbe essere difficile farlo funzionare ogni volta che the_post_thumnail()è presente (o funzione simile) o farlo funzionare con dimensioni dell'immagine diverse definite dal tema o dal plug-in.
cybmeta,

1
Puoi utilizzare questo plugin per impostare l'URL dell'immagine esterna come immagine in primo piano: wordpress.org/plugins/wp-remote-thumbnail
SEO avanzato

Memorizza l'immagine localmente o chiama in remoto?
Volatil3,

@ Volatil3 Non ho ancora testato ma leggendo la descrizione del plugin direi che lo chiama da remoto.
Andy Macaulay-Brook,

Risposte:


35

Sì, è possibile e abbastanza facile.

Questo è il flusso di lavoro che suggerisco:

  1. Inserisci da qualche parte un'interfaccia utente per inserire l'URL dell'immagine in primo piano. Probabilmente la scelta migliore è quella di utilizzare il 'admin_post_thumbnail_html'gancio del filtro
  2. Utilizzare il 'save_post'gancio di azione per salvare l'URL (dopo la routine di sicurezza e convalida) in una meta post personalizzata
  3. Utilizza l' 'post_thumbnail_html'hook del filtro per generare un <img>markup corretto , ignorando l'impostazione predefinita, se il post per il quale è richiesta l'immagine in primo piano ha il meta meta con l'immagine in primo piano esterna

Per funzionare, questo flusso di lavoro necessita che l'immagine in primo piano sia mostrata nel modello usando get_the_post_thumnbail()o le the_post_thumbnail()funzioni.

Inoltre, dobbiamo essere sicuri che il '_thumbnail_id'meta valore abbia un valore non vuoto quando impostiamo il meta per l'URL esterno, altrimenti has_post_thumbnail()restituirà false per i post che hanno solo un'immagine in primo piano esterna.

In effetti, è possibile che un post abbia sia un'immagine standard locale in evidenza che una impostata tramite il nostro flusso di lavoro, e in questo caso verrà utilizzato l'esterno.

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

Esistono diversi modi per eseguire questa attività; qui uso un modo molto semplice che guarda solo l'URL, senza scaricare l'immagine. Funziona solo con URL di immagini statiche e non verifica che l'immagine esista effettivamente, ma è veloce. Modificalo in qualcosa di più avanzato se necessario ( ecco 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 );
}

Molto facile. 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. Innanzitutto quello che genera il campo nell'amministratore:

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>' . __('Or', 'txtdomain') . '</p>';
    $html .= '<p>' . __( 'Enter the url for external image', '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>' . __( 'Leave url blank to remove.', 'txtdomain' ) . '</p>';
    }
    $html .= '</div>';
    return $html;
}

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

Ecco come appare l'output quando è vuoto:

URL esterno per l'immagine in primo piano: il campo

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

URL esterno per l'immagine in primo piano: il campo dopo aver riempito e salvato

Quindi, ora la nostra interfaccia utente di amministrazione è terminata, 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 pubblicato e, se va bene, lo salva in '_thumbnail_ext_url'meta meta. Se l'URL è vuoto e il meta è stato salvato, viene eliminato, consentendo di rimuovere il meta semplicemente svuotando il campo URL esterno.

L'ultima cosa da fare è generare il markup dell'immagine in primo piano quando il nostro URL dell'immagine esterna è impostato in 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 ) . ' ' .  __( 'thumbnail', '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 chiuso.

Cosa resta da fare

Nell'output dell'immagine in primo piano non ho usato widthheightproprietà, né classi che WordPress di solito aggiunge, come 'attachment-$size'. Questo perché annusare le dimensioni di un'immagine richiede un lavoro extra che rallenterà il caricamento della pagina, specialmente se nella pagina sono presenti più immagini in primo piano.

Se hai bisogno di quegli attributi, puoi usare il mio codice aggiungendo un callback per wp_get_attachment_image_attributes'filtrare (è un hook standard di WordPress ) o forse puoi modificare il mio codice per annusare la dimensione dell'immagine e generare attributi e classi.

Plugin Gist

Tutto il codice pubblicato qui, ad eccezione dell'aggiunta di una corretta inizializzazione del dominio di testo, è disponibile come plugin funzionante in un Gist qui . Il codice lì utilizza uno spazio dei nomi, quindi richiede PHP 5.3+.

Appunti

Naturalmente, dovresti essere sicuro di avere la licenza e l'autorizzazione per utilizzare e hotlink immagini nel tuo sito da quelle esterne.


dove devo inserire questo codice
Ankit Agrawal,

puoi per favore spiegare quale codice, su quale pagina dobbiamo scrivere. Sono un principiante in PHP / Wordpress, quindi per favore spiega passo dopo passo. Grazie
Ankit Agrawal il

@AnkitAgrawal guarda qui
gmazzap
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.