Pendekatan
Saya pikir pendekatan terbaik adalah membuat ukuran gambar "on the fly", tepat sebelum gambar diubah ukurannya.
Anda dapat melakukannya menggunakan 'intermediate_image_sizes_advanced'
kait filter. Itu memungkinkan Anda untuk mengedit ukuran yang akan dihasilkan, tetapi menyadari ukuran gambar saat ini, yang disimpan dalam array yang $metadata
dilewatkan oleh filter sebagai argumen kedua.
Matematika
Pertama-tama mari kita menulis kelas yang mengembalikan ukuran terbesar untuk rasio tertentu.
class ImageRatio {
private $ratio;
function __construct($ratioW = 4, $ratioH = 3) {
$this->ratio = array($ratioW, $ratioH);
}
function getLargestSize($imgW, $imgH) {
$inverse = false;
// let's try to keep width and calculate new height
$newSize = round(($this->ratio[1] * $imgW) / $this->ratio[0]);
if ($newSize > $imgH) {
$inverse = true;
// if the calculated height is bigger than actual size
// let's keep current height and calculate new width
$newSize = round(($this->ratio[0] * $imgH) / $this->ratio[1]);
}
return $inverse ? array( $newSize, $imgH ) : array( $imgW, $newSize );
}
}
Penggunaan kelas
Penggunaan kelas cukup mudah:
$ratio = new ImageRatio(4, 3)
$ratio->getLargestSize(1000, 500); // return: array(667, 500)
$ratio->getLargestSize(1000, 800); // return: array(1000, 750)
Beraksi
Pada titik ini, kita dapat menggunakan kelas untuk menghitung dengan cepat ukuran gambar baru, berdasarkan gambar yang sedang diunggah
add_filter( 'intermediate_image_sizes_advanced', function( $sizes, $metadata ) {
if (! empty( $metadata['width'] ) && ! empty( $metadata['height'] ) ) {
// calculate the max width and height for the ratio
$ratio = new ImageRatio( 4, 3 );
list($width, $height) = $ratio->getLargestSize(
$metadata['width'],
$metadata['height']
);
// let's add our custom size
$sizes['biggest-4-3'] = array(
'width' => $width,
'height' => $height,
'crop' => true
);
}
return $sizes;
}, 10, 2 );
Menggunakan Ukuran Baru
$image = wp_get_attachment_image( $attachment_id, 'biggest-4-3' );
Catatan
Tentu saja, ini berfungsi untuk semua gambar yang Anda unggah setelah kode terpasang. Untuk gambar yang lebih tua, Anda harus membuat ulang thumbnail, dengan cepat saat digunakan, atau secara massal menggunakan salah satu plugin yang tersedia di web.