Questo è sempre stato un bugbear per me - la mancanza di dimensionamento delle immagini su richiesta e il successivo numero di file che puoi ottenere se hai molte dimensioni!
Riesco a vedere la logica dietro i tuoi sforzi: il problema è add_image_size
che entra in gioco solo al momento del caricamento. Come tale, lo is_page_template(..)
sarà sempre false
.
Un rapido google ha scavato Aqua Resizer , uno script progettato per affrontare questo problema. Invece di usarlo add_image_size
, lo usi aq_resize
direttamente nel tuo tema e, se non esiste una dimensione per l'immagine, viene creata e memorizzata nella cache al volo.
In effetti ho usato una tecnica simile, sebbene diversa, su diversi siti con molte dimensioni di immagine. Risparmia ancora il sovraccarico di WordPress generando ogni dimensione per ogni immagine caricata: vengono generati al volo (e memorizzati nella cache) come e quando vengono richiesti. Dove differisce, è che puoi semplicemente utilizzare tutte le funzioni di immagine standard e i tag modello di WP come faresti normalmente!
Inoltre, come accennato da @Waqas, l'utilizzo di Aqua Resizer lascerà i file orfani quando si elimina un'immagine dalla libreria multimediale. Con la mia tecnica, tutti i file verranno eliminati, poiché vengono salvati nel database e riconosciuti da 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 );
E in pratica:
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!
Ho intenzione di trasformarlo in un plugin che convertirà automaticamente tutte le add_image_size
chiamate in ridimensionamento su richiesta, quindi guarda questo spazio!