Ini selalu menjadi momok bagi saya - kurangnya ukuran gambar berdasarkan permintaan, dan jumlah file selanjutnya yang bisa Anda dapatkan jika Anda memiliki banyak ukuran!
Saya dapat melihat logika di balik upaya Anda - masalahnya adalah, add_image_size
hanya benar-benar berperan saat pengunggahan. Karena itu, is_page_template(..)
akan selalu ada false
.
Google cepat menggali Aqua Resizer , sebuah skrip yang dirancang untuk mengatasi masalah ini. Daripada menggunakan add_image_size
, Anda menggunakan aq_resize
langsung dalam tema Anda, dan jika ukuran untuk gambar tidak ada, itu dibuat dan di-cache saat itu juga.
Sebenarnya saya telah menggunakan teknik yang serupa, walaupun berbeda, pada beberapa situs dengan banyak ukuran gambar. Anda masih menyimpan overhead WordPress yang menghasilkan setiap ukuran untuk setiap gambar yang diunggah - mereka dihasilkan saat itu juga (& di-cache) saat dan ketika diminta. Perbedaannya adalah, Anda cukup menggunakan semua fungsi gambar standar dan tag templat WP seperti biasa!
Juga, seperti yang disebutkan @Waqas, menggunakan Aqua Resizer akan meninggalkan file yatim ketika Anda menghapus gambar dari perpustakaan media Anda. Dengan teknik saya, semua file akan dihapus, karena disimpan ke database & dikenali oleh 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 );
Dan dalam praktiknya:
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!
Saya bermaksud mengubah ini menjadi sebuah plugin yang secara otomatis akan mengubah semua add_image_size
panggilan menjadi pengubahan ukuran sesuai permintaan, jadi perhatikan ruang ini!