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_size
solo 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_resize
directamente 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_size
llamadas en cambio de tamaño a pedido, ¡así que mira este espacio!