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 ?
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 ?
Risposte:
Sì, è possibile e abbastanza facile.
Questo è il flusso di lavoro che suggerisco:
'admin_post_thumbnail_html'
gancio del filtro'save_post'
gancio di azione per salvare l'URL (dopo la routine di sicurezza e convalida) in una meta post personalizzata'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 esternaPer 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:
Ecco come appare dopo aver aggiunto un URL immagine e salvato / aggiornato il post:
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.
Nell'output dell'immagine in primo piano non ho usato width
né height
proprietà, 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.
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+.
Naturalmente, dovresti essere sicuro di avere la licenza e l'autorizzazione per utilizzare e hotlink immagini nel tuo sito da quelle esterne.
the_post_thumnail()
è presente (o funzione simile) o farlo funzionare con dimensioni dell'immagine diverse definite dal tema o dal plug-in.