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

13

Estoy construyendo un sitio web para miembros con WordPress Multisite. ¿Es posible restringir cuántas imágenes se generan dependiendo 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 pudiera señalarme en la dirección correcta, realmente lo agradecería.

Sam
fuente
1
También está el Dynamic Image Resizer de Otto, que le permite definir tantos tamaños de imagen como desee, pero solo genera una imagen en un tamaño particular cuando es necesario. Entonces, para su ejemplo, las miniaturas de la galería solo se generarían para las imágenes que aparecen en la plantilla page-gallery.php.
helgatheviking
2
Solo quiero mencionar otras dos excelentes opciones: el cambio dinámico de imagen de @ kaiser y el servicio Photon en JetPack.
Birgire

Respuestas:

13

Esto siempre ha sido un problema para mí: la falta de tamaño de imagen a pedido y el número posterior de archivos con los que puede terminar si tiene muchos tamaños.

Puedo ver la lógica detrás de sus esfuerzos: el problema es que add_image_sizesolo entra en juego realmente en el punto de carga. Como tal, is_page_template(..)siempre lo será false.

Un rápido google desenterró Aqua Resizer , un script diseñado para abordar este problema. En lugar de usar add_image_size, lo usa aq_resizedirectamente en su tema, y ​​si no existe un tamaño para la imagen, se crea y almacena en 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 cada tamaño para cada imagen cargada: se generan sobre la marcha (y en caché) cuando y cuando se solicitan. En lo que difiere, es que simplemente puede usar todas las funciones de imagen estándar de WP y etiquetas de plantilla como lo haría normalmente.

Además, como mencionó @Waqas, el uso de Aqua Resizer dejará archivos huérfanos cuando elimine una imagen de su biblioteca de medios. Con mi técnica, todos los archivos se eliminarán, ya que se guardan en la base de datos y son reconocidos 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 add_image_sizellamadas en cambio de tamaño a pedido, ¡así que mira este espacio!

TheDeadMedic
fuente
Gracias por tomarse el tiempo para dejar una respuesta tan excelente. Ciertamente lo intentaré. Es importante que haga esto bien antes de abrir mi servidor a múltiples usuarios. Te gritaré si tengo más preguntas.
Sam
2
Le di una oportunidad con the_post_thumbnail (); Y funciona perfectamente. Un problema: cuando elimino la imagen, deja atrás la que ha modificado su script. ¿Algunas ideas?
Sam
5


Descargo de responsabilidad:
- Esto no es realmente una respuesta.
- Se está destinado a ayudarle con su investigación adicional sobre el tema.
- Además, está reflejando una - al menos sentida - últimamente más frecuente ocurrencia de preguntas similares con respecto a problemas similares.


Información adicional sobre este tema en Wordpress Development:

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

Nicolai
fuente
3

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

wp estudiante
fuente
1
Buen punto sobre los archivos que no se eliminan. ¡Mi solución no sufrirá de esto! (Ver respuesta actualizada).
TheDeadMedic
1

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

Cuando usa 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 puede usar una clase php simple para resolver su problema ... es una clase php famosa que se está utilizando para muchos temas premium para WordPress. Se llama Aqua-Resizer.

Puede encontrar más detalles aquí https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

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 que su altura o anchura definieron) 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.

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

WpMania.Net
fuente