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!