Establecer el post thumbnail de forma automática WordPress
Algunos themes para WordPress basan buena parte de su diseño en las imágenes destacadas de los posts, también conocidas como post thumbnails. Si se te olvidó establecer la imagen destacada en muchos de tus posts o no lo hacías por cualquier motivo pero ahora lo necesitas, aquí te dejo un pequeño snippet que puedes utilizar para dos cosas:
- Establecer la imagen destacada para posts antiguos que no disponen de una
- Establecer la imagen destacada para nuevos posts de forma automática si se te vuelve a olvidar hacerlo manualmente
// El siguiente hook actúa cuándo un post es publicado (o actualizado)
add_action( 'transition_post_status', 'cyb_auto_featured_image', 10, 3 );
function cyb_auto_featured_image( $new_status, $old_status, $post ) {
if ( $new_status == "publish" ) {
// No importa el status anterior, así también corre si el post es actualizado
// Comprobar si el post ya dispone de una imagen destacada
if ( ! has_post_thumbnail( $post->ID ) ) {
// Obtener la primera imagen subida al post
$args = array(
'post_parent' => $post->ID,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'post_status' => 'inherit',
'numberposts' => 1
);
$attached_image = get_children( $args );
if( $attached_image ) {
foreach( $attached_image as $attachment_id => $attachment ) {
// Establecer la imagen encontrada como post thumbnail
set_post_thumbnail( $post->ID, $attachment_id );
}
}
}
}
}
// Utiliza el action the_post para establecer "al vuelo" el post thumbnail en posts antiguos
add_action('the_post', 'cyb_auto_featured_image_old_posts');
function cyb_auto_featured_image_old_posts( $post ) {
cyb_auto_featured_image( 'publish', '', $post );
}
Hay que tener en cuenta que la imagen utilizada es la primera imagen encontrada subida al post. Se podría implementar un método similar pero elegir la imagen a utilizar de otra forma, sientéte libre de experimentar.
El action the_post
se utiliza para establecer el thumbnail en posts antiguos que no disponen de una. Este action ocurre cuándo un post se muestra en el frontend y puedes dejar de utilizarlo si no hay post antiguos que actualizar. Alternativamente también puedes utilizar el siguiente snippet una sola vez para actualizar todos los posts antiguos que no tienen asignada la imagen destacada:
// Elimina este snippet después de utilizarlo una vez
add_action('init','cyb_run_once');
function cyb_run_once(){
// Obtener todos los posts de tipo "post" sin thumbnail asignado.
$posts = get_posts( array(
'numberposts' => -1,
'post_type' => 'post',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'NOT EXISTS',
)
)
)
);
foreach( $posts as $post ) {
// llamar a la función que asigna la imagen destacada
cyb_auto_featured_image( 'publish', '', $post );
}
}
Como siempre, espero que te sea útil y si tienes alguna duda, pregunta 😉