Sé que hay complementos que recuperan imágenes desde una URL remota y se almacenan localmente. Solo quiero saber si es posible que no almacene la imagen en la Biblioteca de medios y la use como Imagen destacada ?
Sé que hay complementos que recuperan imágenes desde una URL remota y se almacenan localmente. Solo quiero saber si es posible que no almacene la imagen en la Biblioteca de medios y la use como Imagen destacada ?
Sí, es posible y bastante fácil.
Este es el flujo de trabajo que sugiero:
'admin_post_thumbnail_html'
filter hook 'save_post'
gancho de acción para guardar la URL (después de la rutina de seguridad y validación) en una costumbre publicar meta 'post_thumbnail_html'
para obtener un margen de marca apropiado de <img>
, anulación predeterminada, si la publicación para lo que se requiere la imagen destacada tiene el meta de publicación con la imagen destacada externa Para funcionar, este flujo de trabajo necesita que la imagen mostrada se muestre en la plantilla usando get_the_post_thumnbail()
o the_post_thumbnail()
funciones.
Además, debemos estar seguros de que el valor meta '_thumbnail_id'
tiene un valor no vacío cuando configuramos el metadatos para la URL externa, de lo contrario has_post_thumbnail()
devolverá false para las publicaciones que solo tengan una imagen externa destacada.
De hecho, es posible que una publicación tenga una imagen destacada local estándar y un conjunto a través de nuestro flujo de trabajo, y en este caso se usará la externa.
Para implementar nuestro flujo de trabajo, necesitamos una función para validar la URL utilizada como imagen destacada externa, porque debemos asegurarnos de que sea una URL de imagen válida.
Hay diferentes maneras de hacer esta tarea; Aquí utilizo una forma muy simple que solo mira la URL, sin descargar la imagen. Esto funciona solo para URL de imágenes estáticas y no verifica que la imagen exista realmente, pero es rápida. Modifíquelo a algo más avanzado si necesita ( here es un poco de ayuda).
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 );
}
Bastante fácil. Ahora agreguemos los 3 ganchos descritos en el flujo de trabajo anterior:
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 );
y las funciones relacionadas. Primero el que da salida al campo en el administrador:
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;
}
Ten en cuenta que he usado 'txtdomain'
como dominio de texto, pero deberías usar un dominio de texto registrado adecuado.
Así es como se ve el resultado cuando está vacío:
YasíescomosevedespuésdehaberagregadounaURLdeimagenyguardado/actualizadolapublicación:
Por lo tanto, ahora que nuestra IU de administración está lista, escribamos la rutina de guardado:
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 función, después de algunas comprobaciones de seguridad, examina la URL publicada y, si está bien, la guarda en '_thumbnail_ext_url'
post meta. Si la URL está vacía y el meta se guardó, se elimina, lo que permite eliminar la meta simplemente vaciando el campo de la URL externa.
Lo último que debe hacer es generar el marcado de la imagen destacada cuando nuestra URL de imagen externa está configurada en 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;
}
Hemos terminado.
En la salida de la imagen destacada no he usado width
o height
, ni clases que WordPress generalmente agrega, como 'attachment-$size'
. Esto se debe a que detectar el tamaño de una imagen requiere un trabajo adicional que ralentizará la carga de la página, especialmente si tiene más de una imagen destacada en la página.
Si necesita esos atributos, puede usar mi código para agregar una devolución de llamada a wp_get_attachment_image_attributes'
filter (es un WordPress estándar hook ) o quizás pueda modificar mi código para detectar el tamaño de la imagen y generar clases y atributos relacionados.
Todo el código publicado aquí, con la excepción de agregar una inicialización de dominio de texto adecuada, está disponible como un complemento de trabajo completo en un Gist aquí . El código allí usa un espacio de nombres, por lo que requiere PHP 5.3+.
Por supuesto, debe asegurarse de contar con una licencia y autorización para usar e incluir enlaces a imágenes en su sitio desde otras externas.
Lea otras preguntas en las etiquetas images