Puedes hacerlo filtrando el valor meta para _thumbnail_id
.
add_filter( 'update_post_metadata', 'generate_featured_image_sizes', 10, 5 );
add_filter( 'add_post_metadata', 'generate_featured_image_sizes', 10, 5 );
function generate_featured_image_sizes( $check, $object_id, $meta_key, $meta_value, $unique_or_prev ) {
if ( $meta_key == '_thumbnail_id' ) {
// regenerate previous featured image thumbs if it exists
if ( false !== ( $prev_thumb_id = get_post_meta( $object_id, '_thumbnail_id', true ) ) ) {
$prev_new_metadata = wp_generate_attachment_metadata( $prev_thumb_id, get_attached_file( $prev_thumb_id ) );
if ( ! is_wp_error( $prev_new_metadata ) )
wp_update_attachment_metadata( $prev_thumb_id, $prev_new_metadata );
}
// remove all normal image sizes before we add our filter
cleanup_attachment_images( $meta_value );
// filter image sizes for featured
add_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
// regenerate thumbnails for featured
$new_metadata = wp_generate_attachment_metadata( $meta_value, get_attached_file( $meta_value ) );
if ( ! is_wp_error( $new_metadata ) )
wp_update_attachment_metadata( $meta_value, $new_metadata );
// remove featured sizes from previous featured image
if ( isset( $prev_thumb_id ) && $prev_thumb_id )
cleanup_attachment_images( $prev_thumb_id );
// tidy up
remove_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
}
return $check;
}
function featured_image_sizes( $sizes ) {
return array( 'large', 'featured', 'slider' );
}
function cleanup_attachment_images( $attachment_id ) {
$uploadpath = wp_upload_dir();
$intermediate_sizes = array();
foreach ( get_intermediate_image_sizes() as $size ) {
if ( $intermediate = image_get_intermediate_size( $attachment_id, $size ) )
$intermediate_sizes[] = $intermediate;
}
// remove intermediate and backup images if there are any
foreach ( $intermediate_sizes as $intermediate ) {
/** This filter is documented in wp-admin/custom-header.php */
$intermediate_file = apply_filters( 'wp_delete_file', $intermediate[ 'path' ] );
@ unlink( path_join( $uploadpath[ 'basedir' ], $intermediate_file ) );
}
}
La recreación de las miniaturas es solo un caso de generación y actualización de los metadatos del archivo adjunto, por lo que al regenerar cada vez que se modifica la imagen mostrada, debe obtener el efecto deseado.
Esto funcionará en la carga pero también cuando se cambie la imagen mostrada. Además, volverá a generar los pulgares para la miniatura anterior, por lo que es como una imagen normal con los tamaños normales nuevamente.
La razón para usar los ganchos add_post_metadata
y update_post_metadata
es para que tengamos acceso al valor actual anterior que se actualiza en la base de datos.
NOTA
No hay una diferencia real entre la ventana emergente de agregar medios para la imagen destacada o el editor, esos enlaces simplemente abren la ventana emergente en un estado diferente, por lo que no hay una manera fácil de saber qué estado se solicitó (imagen destacada o editor) cuando se cargan las imágenes. De ahí el enfoque que he mostrado arriba.
ACTUALIZACIÓN
Agregué una función a la que podría llamar para eliminar los conjuntos de miniaturas generadas para un archivo adjunto. Llamarías a esto antes de generar nuevos metadatos adjuntos. Incluso podría filtrar los tamaños de imagen que elimina o modificar la función para que pueda pasarlos como un argumento.