Cambiar set_post_thumbnail_size según el tipo de publicación en la página de administración

29 dic 2010, 23:35:28
Vistas: 6.3K
Votos: 7

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.

2
Comentarios

¿Puedes editar tu pregunta para describir tu objetivo final? Lo que estás pidiendo parece una idea de implementación, en lugar de un resultado final. Puede que haya una manera de lograr lo que buscas sin modificar set_post_thumbnail_size().

Chip Bennett Chip Bennett
20 oct 2013 18:01:14

@ChipBennett pregunta bastante antigua, creo que probablemente quería una imagen destacada personalizada por tipo de publicación en el lado del administrador al editar un custom_post_type. Tal vez algo como set_post_thumbnail_size(ancho, altura, recorte, post_type)..

Amit Amit
20 nov 2013 03:15:25
Todas las respuestas a la pregunta 5
2
11

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...

30 dic 2010 06:25:14
Comentarios

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.

goldenapples goldenapples
30 dic 2010 07:46:28

En realidad, tienes razón. Está ahí. Muy astuto... Verifiqué los parámetros GET antes pero no me detuve a pensar que podrían enviarse por POST.

goldenapples goldenapples
30 dic 2010 19:47:53
0

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.

30 dic 2010 00:54:04
2

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;
}
22 oct 2015 09:35:01
Comentarios

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?

Luca Reghellin Luca Reghellin
15 ago 2017 14:46:18

Necesitas subir los medios mientras estás en la página de edición de la publicación. Cambiar la imagen y guardarla nuevamente no parece generar los tamaños esperados.

TheTrueTDF TheTrueTDF
16 ago 2017 04:32:17
0

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.

29 dic 2010 23:49:18
0

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.

20 oct 2013 17:58:34