Agregar tamaño de imagen si la plantilla de la página

11

Estoy creando un sitio web para miembros con WordPress Multisite. ¿Es posible restringir la cantidad de imágenes que se generan en función de la plantilla seleccionada?

He intentado las siguientes líneas de código para generar ciertas imágenes en la plantilla de la galería:

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

Esto no ha funcionado. He investigado un poco y parece que no puedo encontrar nada sobre el tema. Si pudieras apuntarme en la dirección correcta, realmente te lo agradecería.

    
pregunta Sammy The Salmon 29.03.2014 - 16:48

4 respuestas

12

Esto siempre ha sido un error para mí: ¡la falta de tamaño de imagen a demanda y la cantidad subsiguiente de archivos que puede terminar si tiene muchos tamaños!

Puedo ver la lógica detrás de tus esfuerzos, el problema es que add_image_size solo entra en juego en el punto de carga. Como tal, is_page_template(..) siempre será false .

Un google rápido desenterrado Aqua Resizer , un script diseñado para abordar este problema. En lugar de usar add_image_size , usa aq_resize directamente en su tema, y si no existe un tamaño para la imagen, se crea y se almacena en la memoria caché sobre la marcha.

De hecho, he usado una técnica similar, aunque diferente, en varios sitios con muchos tamaños de imagen. Todavía guarda la sobrecarga de WordPress generando todos los tamaños para cada imagen cargada: se generan sobre la marcha (& caché) cuando se solicitan . Donde difiere, es que simplemente puedes usar todas las funciones de imagen estándar y etiquetas de plantilla de WP como lo harías normalmente.

También, como se mencionó en @Waqas, el uso de Aqua Resizer dejará archivos huérfanos cuando elimines una imagen de tu biblioteca multimedia. Con mi técnica, se eliminarán todos los archivos, ya que se guardan en la base de datos & reconocido por WordPress.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

Y en la práctica:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

Tengo la intención de convertir esto en un complemento que convertirá automáticamente todas las llamadas add_image_size en cambio de tamaño a pedido, ¡así que mira este espacio!

    
respondido por el TheDeadMedic 29.03.2014 - 17:16
5

Descargo de responsabilidad:
  - Este no es en realidad una respuesta.
  - is tiene la intención de ayudarlo con su investigación adicional sobre el tema.
  - Además, está reflejando una aparición al menos más frecuente últimamente de preguntas similares con respecto a problemas similares.

Información adicional sobre este tema en el desarrollo de Wordpress:

Nota: La lista no está ordenada ni completa de ninguna manera.

    
respondido por el Nicolai 29.03.2014 - 17:55
3

Si desea crear pulgares sobre la marcha, puede usar Aqua image resizer , pero hay un inconveniente de este mini guión Los pulgares creados no se eliminarán al eliminar la imagen de la biblioteca. Pero no es un gran problema. Si es necesario, puede hacerlo a través de comandos SHH

    
respondido por el wp student 29.03.2014 - 18:00
1

No es una respuesta directa para su problema. Pero te ayudaré a hacer la imagen de acuerdo a tus necesidades.

Cuando utiliza add_image_size, no cambia el tamaño de las imágenes existentes. solo funciona para las nuevas imágenes que se cargarán después de agregar su función add_image_size.

Por lo tanto, su código no generará nuevas imágenes para la función is_page_template.

Pero puedes usar una clase de php simple para resolver tu problema ... es una clase de php famosa que se usa para una gran cantidad de temas premium para WordPress. Se llama Aqua-Resizer.

Puede encontrar más detalles aquí enlace Wiki: enlace

Problema que puede surgir:

Esta función funciona de esta manera ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

Entonces, cuando no puede recortar (para una imagen pequeña cuya altura o ancho está definida) no muestra nada. Puede superar esta situación comprobando si obtiene un valor nulo después de pasar la URL dentro de esta función muy fácilmente como la mía aquí ...

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

De esta manera, puede asegurarse de que la imagen específica se generará para una plantilla de página específica y de esta manera su sitio web será mucho más limpio.

P.S: esta clase php utiliza el sistema de recorte principal de WordPress para que no haya problemas de seguridad.

    
respondido por el WpMania.Net 01.04.2014 - 23:17

Lea otras preguntas en las etiquetas