Суффикс «-scaled» для изображений: что делает WP с большими изображениями
С версии WordPress 5.3, когда вы загружаете очень большие изображения, создается их уменьшенная копия. Это необходимо для того, чтобы при запросе полноразмерного изображения использовать именно эту копию, а не оригинал. По умолчанию "приемлемым" размером считается изображение не больше 2560 пикселей по ширине или высоте.
Как это работает
Предположим, вы загружаете изображение размером 5000x2000 пикселей. В этом случае WordPress создаст уменьшенную копию этого изображения с размером 2560x1024 пикселя (пропорционально подогнав его под ширину 2560 пикселей) и сохранит ее в папке загрузок с новым именем {IMAGE_NAME}-scaled.{EXT}
.
Далее, WordPress обновит путь к оригинальному изображению в метаданных, так чтобы эта уменьшенная версия считалась оригиналом. Имя оригинального изображения будет сохранено в метаданных под ключом original_image
. Для этого используется функция _wp_image_meta_replace_original()
.
Теперь созданная копия с "приемлемым" размером считается оригинальным изображением, и путь к ней записывается в метаполе _wp_attached_file
. Таким образом, функция, которая обычно возвращает путь к оригинальному изображению get_attached_file()
, или URL оригинала wp_get_attachment_url()
, будет возвращать новый путь с суффиксом "-scaled".
Ограничение для изображений формата PNG
Суффикс "-scaled" не создается для изображений формата .png, поскольку бывают случаи, когда уменьшенное изображение превышает по размеру оригинал. Об этом можно прочитать в тикете #48736.
Оригинальный файл изображения не удаляется и остается в папке загрузок. Путь или URL к нему можно получить с помощью новых функций, добавленных в WP 5.3:
wp_get_original_image_path()
wp_get_original_image_url()
Уменьшенная версия будет создана для любого изображения, ширина или высота которого превышает порог 2560 пикселей.
Изменение порога «приемлемого» размера
Порог (размер, о котором идет речь) можно изменить с помощью фильтра big_image_size_threshold
, возвращающего желаемый размер. Например, чтобы установить максимальный размер в 1600 пикселей:
# Измените размер -scaled
(максимально допустимый размер) изображения по ширине/высоте
add_filter( 'big_image_size_threshold', function( $size, $imagesize, $file, $attachment_id ){
return 1600;
}, 10, 4 );
Если вы хотите полностью отключить логику "-scaled", вы можете вернуть 0 в фильтре:
# Отключить размер -scaled
- ограничить максимальный размер изображения
add_filter( 'big_image_size_threshold', '__return_zero' );
Как удалить оригинальное изображение после загрузки, если создана копия с суффиксом -scaled
При загрузке изображения, если оно большого размера, WordPress сохраняет как оригинал, так и уменьшенную копию с суффиксом "-scaled". Но как сохранить только версию "-scaled", не сохраняя оригинал?
// Удаляет оригинальный файл изображения с диска, если была создана копия -scaled
. Работает только для WP 5.3 и новее.
add_filter( 'wp_generate_attachment_metadata', 'remove_scaled_original_image_file', 10, 3 );
/**
* Удаляет оригинальный файл изображения с диска, если была создана копия -scaled
.
*
* Функция для хука wp_generate_attachment_metadata
.
*
* @param array $image_meta
* @param int $attachment_id
* @param string $context Доступен с WP 5.3+.
*
* @return array
*/
function remove_scaled_original_image_file( $image_meta, $attachment_id, $context = '' ) {
if( $context !== 'create' || empty( $image_meta['original_image'] ) ) {
return $image_meta;
}
// Удаляет оригинальный файл изображения с диска
$image_file = get_attached_file( $attachment_id );
$original_file = path_join( dirname( $image_file ), $image_meta['original_image'] );
$removed = unlink( $original_file );
if( $removed ) {
unset( $image_meta['original_image'] );
} else {
trigger_error( 'Не удалось удалить файл original_image.' );
}
return $image_meta;
}
Заключение
Теперь вы знаете, как WordPress обрабатывает большие изображения, создавая их уменьшенные копии. Вы также можете настроить размеры изображений под ваши нужды и даже полностью избавиться от оригиналов, если они вам не нужны.