Cela a toujours été un bug pour moi - le manque de dimensionnement d'image à la demande et le nombre de fichiers que vous pouvez vous retrouver si vous avez beaucoup de tailles!
Je peux voir la logique derrière vos efforts - le problème est add_image_size
que cela n'entre vraiment en jeu qu'au point de téléchargement. En tant que tel, le is_page_template(..)
sera toujours false
.
Un rapide Google a déterré Aqua Resizer , un script conçu pour résoudre ce problème. Plutôt que d'utiliser add_image_size
, vous utilisez aq_resize
directement dans votre thème, et si une taille pour l'image n'existe pas, elle est créée et mise en cache à la volée.
En fait, j'ai utilisé une technique similaire, bien que différente, sur plusieurs sites avec de nombreuses tailles d'image. Vous économisez toujours les frais généraux de WordPress générant toutes les tailles pour chaque image téléchargée - elles sont générées à la volée (et mises en cache) au fur et à mesure qu'elles sont demandées. Là où il diffère, c'est que vous pouvez simplement utiliser toutes les fonctions d'image standard et les balises de modèle de WP comme vous le feriez normalement!
De plus, comme @Waqas l'a mentionné, l'utilisation d'Aqua Resizer laissera des fichiers orphelins lorsque vous supprimez une image de votre bibliothèque multimédia. Avec ma technique, tous les fichiers seront supprimés, car ils sont enregistrés dans la base de données et reconnus par 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 );
Et en pratique:
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!
J'ai l'intention de transformer cela en un plugin qui convertira automatiquement tous les add_image_size
appels en redimensionnement à la demande, alors surveillez cet espace!