Cambiar set_post_thumbnail_size según el tipo de publicación en la página de administración
Tengo algunos tamaños personalizados para miniaturas y obviamente uno de ellos se usa en set_post_thumbnail_size, lo que afecta directamente a la interfaz en el área de administración.
Lo que estoy intentando hacer es interceptar en qué página de administración (para tipo de publicación) estoy y establecer un tamaño diferente en la función anterior, básicamente me gustaría tener esto:
function setup_the_theme() {
add_theme_support( 'post-thumbnails' );
if ($post_type == 'type_A'){
set_post_thumbnail_size( 298, 167, true ); //retrato
} else {
set_post_thumbnail_size( 192, 108, true ); //paisaje
}
add_image_size( 'top_articles', 298, 167, true ); //retrato
add_image_size( 'article_thumb', 203, 114, true ); //retrato
add_image_size( 'featured_articles', 60, 200, true ); //paisaje
}
add_action( 'after_setup_theme', 'setup_the_theme' );
Sospecho que es demasiado pronto en el ciclo para saber qué tipo de publicación estoy editando.

Forma más sencilla de determinar el tipo de publicación (post type) del elemento que estás editando y al cual estás subiendo medios:
$type = get_post_type($_REQUEST['post_id']);
Como se ha mencionado, el iframe de carga de medios que se muestra en el overlay de lightbox cuando intentas subir algo no indica la publicación padre a la que se adjuntará la nueva carga. Pero la variable $_REQUEST
sigue activa desde la ventana de edición, y todavía contiene el post_id del elemento que estás editando, así que simplemente consulta el tipo para ese ID...
Puedes usar esta técnica en varios hooks y filtros - he usado el filtro intermediate_image_sizes
para el procesamiento de imágenes antes, pero no para este problema en particular, aunque debería funcionar allí también...

No creo que eso funcione... El filtro intermediate_image_sizes se llama en async-upload.php, que no se carga con los parámetros $_REQUEST... por eso tuve que verificarlos antes y encontrar algún lugar para guardar el valor en mi ejemplo.

Existe un filtro intermediate_image_sizes
en la función wp_generate_attachment_metadata. El problema es que no pasa el tipo de publicación como parte del contexto. Aquí hay una forma de solucionar ese problema, estableciendo un transitorio con el valor del tipo de publicación en la ventana emergente de carga de medios:
add_action( 'admin_head-media-upload-popup', 'define_post_type' );
function define_post_type() {
$referring_string = explode('?',$_SERVER['HTTP_REFERER']);
if ($referring_string[1]) parse_str( $referring_string[1] );
else $post_type = 'post';
set_transient('current_upload_parent_type',$post_type);
}
add_filter( 'intermediate_image_sizes_advanced',
'set_thumbnail_size_by_post_type', 10);
function set_thumbnail_size_by_post_type( $sizes ) {
$post_type = get_transient( 'current_upload_parent_type' );
delete_transient( 'current_upload_parent_type' );
switch ($post_type) :
case 'type_A' :
$sizes['post-thumbnail'] = array(
'width' => 298, 'height' => 167, 'crop' => true);
break;
default :
$sizes['post-thumbnail'] = array(
'width' => 192, 'height' => 108, 'crop' => true);
break;
endswitch;
return $sizes;
}
Creo que esto debería funcionar, aunque probablemente haya una forma más elegante de hacerlo que establecer un transitorio (y tal como está, no es infalible: dos cargas de imágenes simultáneas corren el riesgo de cruzar sus tipos de publicación, y las imágenes cargadas a través del panel "Nuevos medios" pueden heredar el tipo de publicación de la última imagen cargada en la pantalla de publicación.
¿Quizás alguien pueda mejorar esto?
Edición:
Sabía que tenía que haber una mejor manera de hacer esto. Ignora la función enganchada en admin_head-media-upload-popup
y sigue la respuesta de @somatic para verificar el tipo de publicación. Todavía puedes establecer el tamaño de la miniatura según el tipo de publicación en intermediate_image_sizes_advanced
.

Mezclé las ideas de Somatic y Goldenapples (¡gracias a ambos!) de la siguiente manera. Funciona perfectamente y es muy sencillo de implementar.
Debe escribirse en functions.php
/* Añadiendo tamaños de imagen */
add_filter( 'intermediate_image_sizes_advanced','set_thumbnail_size_by_post_type', 10);
function set_thumbnail_size_by_post_type( $sizes ) {
$post_type = get_post_type($_REQUEST['post_id']);
switch ($post_type) :
case 'service' :
$sizes['service'] = array(
'width' => 250,
'height' => 155,
'crop' => true
);
break;
case 'post' :
$sizes['post'] = array(
'width' => 250,
'height' => 210,
'crop' => true
);
break;
default :
$sizes['default'] = array(
'width' => 200,
'height' => 200,
'crop' => true
);
endswitch;
return $sizes;
}

Entonces, si subes una imagen directamente desde el área de medios, solo generará los tamaños predeterminados, pero si subes medios en la vista de edición de la publicación, o cambias o agregas una imagen, ¿se generará en todos los formatos para ese tipo de publicación específico? ¿Es correcto?

Repetiré una respuesta anterior a una pregunta similar:
No hay manera de basar los tamaños de las imágenes en el tipo de publicación, ya que las imágenes aún no están adjuntas a una publicación cuando las subes y se crean los tamaños intermedios de imagen (cuando las agregas mediante "Medios nuevos" ni siquiera están adjuntas a ninguna publicación).
Sin embargo, esa respuesta contiene información sobre plugins que escribí que juntos probablemente pueden hacer lo que deseas: usar múltiples tamaños de imagen, pero solo crear las imágenes que realmente utilizas.

En caso de que no sepas cómo implementar la excelente idea de @somatic, aquí te muestro cómo hacerlo.
El código iría en el archivo functions.php de tu tema:
if ( ! function_exists( 'wpse6103_setup' ) )
{
function wpse6103_setup() {
// Otras configuraciones por defecto del tema y funciones de registro
add_theme_support( 'post-thumbnails' );
/*
* Basado en: http://wordpress.stackexchange.com/a/6123
*/
if( ! empty( $_REQUEST[ 'post_id' ] ) && ctype_digit( $_REQUEST[ 'post_id' ] ) ) {
/*
* Verifica si el tipo de publicación es 'book'. Si es así, establece el tamaño del thumbnail
* a 300 x 150. Si no, utiliza los tamaños definidos para thumbnail en
* WordPress Dashboard > Medios > Tamaños de imagen > Tamaño del thumbnail.
*/
if( get_post_type( 'book' == $_REQUEST[ 'post_id' ] ) ) {
set_post_thumbnail_size( 300, 150, false );
}
}
}
}
add_action( 'after_setup_theme', 'wpse6103_setup' );
Luego, para mostrar la imagen destacada en tu plantilla, puedes hacer algo así:
<?php
if ( has_post_thumbnail() ) {
if( 'aahank_book' == get_post_type() ) {
echo wp_get_attachment_image( get_post_thumbnail_id( $post->ID ), array( 300, 150 ), false, array( 'class' => 'img-thumbnail' ) );
} else {
the_post_thumbnail( 'thumbnail', array( 'class' => 'img-thumbnail' ) );
}
}
?>
Desde mi punto de vista, no puedes usar la función habitual the_post_thumbnail()
porque siempre mostrará el tamaño de imagen configurado en Escritorio de WordPress > Medios > Tamaños de imagen > Tamaño del thumbnail y no el tamaño condicional que establecimos anteriormente para el tipo de publicación personalizado.
