Este posibil să setezi o imagine reprezentativă folosind URL-ul unei imagini externe
Știu că există plugin-uri care preiau imagini de la URL-uri externe și le stochează local. Aș vrea doar să știu dacă este posibil să nu stochez imaginea în Biblioteca Media și totuși să o folosesc ca Imagine Reprezentativă?

Da, este posibil și destul de ușor.
Acesta este fluxul de lucru pe care îl sugerez:
- Adăugați o interfață de utilizator unde se poate introduce URL-ul imaginii reprezentative. Cea mai bună opțiune este să folosiți cârligul de filtrare
'admin_post_thumbnail_html'
- Folosiți cârligul de acțiune
'save_post'
pentru a salva URL-ul (după verificări de securitate și validare) într-un meta-câmp personalizat al postării - Folosiți cârligul de filtrare
'post_thumbnail_html'
pentru a afișa marcajul corect<img>
, suprascriind cel implicit, dacă postarea pentru care este necesară imaginea reprezentativă are meta-câmpul cu URL-ul extern
Pentru a funcționa, acest flux necesită ca imaginea reprezentativă să fie afișată în șablon folosind funcțiile get_the_post_thumnbail()
sau the_post_thumbnail()
.
Mai mult, trebuie să ne asigurăm că valoarea meta-câmpului '_thumbnail_id'
nu este goală atunci când setăm meta-câmpul pentru URL-ul extern, altfel has_post_thumbnail()
va returna fals pentru postările care au doar o imagine reprezentativă externă.
De fapt, este posibil ca o postare să aibă atât o imagine reprezentativă locală standard, cât și una setată prin fluxul nostru, iar în acest caz va fi folosită cea externă.
Pentru a implementa fluxul nostru, avem nevoie de o funcție care să valideze URL-ul folosit ca imagine reprezentativă externă, deoarece trebuie să ne asigurăm că este un URL valid de imagine.
Există diferite modalități de a face acest lucru; aici folosesc o metodă foarte simplă care verifică doar URL-ul, fără a descărca imaginea. Aceasta funcționează doar pentru URL-uri statice de imagini și nu verifică dacă imaginea există de fapt, dar este rapidă. Modificați-o la ceva mai avansat dacă aveți nevoie (aici este câteva ajutoare).
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 );
}
Destul de ușor. Acum să adăugăm cele 3 cârlige descrise în fluxul de mai sus:
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 );
și funcțiile aferente. Mai întâi cea care afișează câmpul în administrare:
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>' . __('Sau', 'txtdomain') . '</p>';
$html .= '<p>' . __( 'Introduceți URL-ul pentru imaginea externă', '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>' . __( 'Lăsați URL-ul gol pentru a elimina.', 'txtdomain' ) . '</p>';
}
$html .= '</div>';
return $html;
}
Rețineți că am folosit 'txtdomain'
ca domeniu de text, dar ar trebui să folosiți un domeniu de text propriu, înregistrat.
Așa arată ieșirea când este goală:
Și așa arată după ce ați adăugat un URL de imagine și ați salvat/actualizat postarea:
Deci, acum interfața noastră de administrare este gata, să scriem rutina de salvare:
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' );
}
}
}
Funcția, după câteva verificări de securitate, verifică URL-ul trimis și dacă este corect, îl salvează în meta-câmpul '_thumbnail_ext_url'
. Dacă URL-ul este gol și meta-câmpul a fost salvat, acesta este șters, permițând eliminarea meta-câmpului pur și simplu prin golirea câmpului URL extern.
Ultimul lucru de făcut este afișarea marcajului imaginii reprezentative atunci când URL-ul extern este setat în meta-câmp:
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;
}
Am terminat.
Ce mai rămâne de făcut
În afișarea imaginii reprezentative nu am folosit proprietăți width
sau height
, nici clase pe care WordPress le adaugă de obicei, cum ar fi 'attachment-$size'
. Acest lucru se datorează faptului că detectarea dimensiunii unei imagini necesită lucrări suplimentare care vor încetini încărcarea paginii, mai ales dacă aveți mai multe imagini reprezentative în pagină.
Dacă aveți nevoie de acele atribute, puteți folosi codul meu adăugând un callback la filtrul wp_get_attachment_image_attributes'
(este un cârlig standard WordPress) sau puteți modifica codul meu pentru a detecta dimensiunea imaginii și a afișa atributele și clasele corespunzătoare.
Plugin Gist
Tot codul postat aici, cu excepția adăugării unei inițializări corecte a domeniului de text, este disponibil ca un plugin funcțional complet într-un Gist aici. Codul de acolo folosește un namespace, așa că necesită PHP 5.3+.
Note
Desigur, trebuie să vă asigurați că aveți licența și autorizația de a utiliza și de a face legături către imagini de pe site-ul dvs. din cele externe.

poți, te rog, să explici care cod și pe ce pagină trebuie să-l scriem. Sunt începător în PHP/Wordpress, așa că te rog să explici pas cu pas. Mulțumesc
