È possibile impostare un'immagine in evidenza con URL di immagine esterna
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?

Sì, è possibile e abbastanza semplice.
Questo è il flusso di lavoro che suggerisco:
- Aggiungi un'interfaccia utente per inserire l'URL dell'immagine in evidenza. La scelta migliore è probabilmente utilizzare il filtro
'admin_post_thumbnail_html'
- Usa l'azione
'save_post'
per salvare l'URL (dopo i controlli di sicurezza e validazione) in una meta personalizzata del post - 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:
Ed ecco come appare dopo aver aggiunto un URL immagine e salvato/aggiornato il post:
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.

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