Добрый день!
Интересный вопрос. Разобрался.
Вкратце:
1. Действительно, дополнительные размеры для больших картинок генерируются.
2. Оказалось, это новое штатное поведение. Оно появилось в версии 5.3, относительно недавно. Поэтому и «никто не замечал».
3. Можно отключить с помощью фильтров и напильника (теоретически, лично не тестировал).
Теперь подробности.
Первоисточник
Новое поведение картинок описано в статье «Представляем обработку больших изображений в WordPress 5.3» (текст англоязычный). Обосновывается тем, что огромные изображения зачастую загружаются прямо с камер и нуждаются в подгонке под «веб-оптимальный максимальный размер». (Мнение авторов, не моё. Обсуждать само решение здесь не стоит, лучше сделать это в первоисточнике 🙂 Ниже выжимка из статьи и кое-какие заметки.
Как происходит обработка полноразмерных картинок
При загрузке нового изображения WordPresss проверяет его высоту и ширину. Если размер одной из сторон превышает порог big_image
(по умолчанию равный 2560px), изображение считается «большим». Порог можно переопределить новым фильтром big_image_size_threshold
.
Если изображение «большое», автоматически создается его уменьшенная версия. Её максимальная ширина и высота ограничены значением порога. Такая уменьшенная версия используется в качестве наибольшего доступного формата изображения. Оригинал при этом сохраняется в папке загрузок и его имя хранится в массиве мета-данных изображения в ключе original_image
. Путь к оригиналу можно получить с помощью новой функции wp_get_original_image_path()
.
Как отключить всё это
а) [Официальная рекомендация авторов:] Использовать всё тот же фильтр big_image_size_threshold
, возвратив ему false
.
add_filter( 'big_image_size_threshold', '__return_false' );
Пара нюансов есть в комментариях к первоисточнику. И ещё есть вот это замечание, о том, что может понадобиться отдельно вычистить и промежуточные форматы для ретинных изображений.
function filter_image_sizes( $sizes) {
unset( $sizes['1536x1536']); // disable 2x medium-large size
unset( $sizes['2048x2048']); // disable 2x large size
return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'filter_image_sizes');
б) [«Ленивый» пользовательский вариант:] Использовать плагин Disable Big Image Treshold.
в) [Радикально, хардкор:] Перейти на ClassicPress. Тем самым, избавиться от всяких неожиданных сюрпризов, вроде Гутенберга в ядре, внезапно распухающих картинок и прочих сыроватых и неоднозначных идей, которые неконтролируемо навязываются с версии 5.0+.
Дополнительные заметки в помощь
1. Возможно, есть смысл просмотреть все зарегистрированные размеры изображений с помощью get_intermediate_image_sizes()
. Обычно я пользуюсь ей, чтобы исключить подобные сюрпризы (в том числе в ядре, т.к. в последнее время нововведения появляются быстрее, чем успевают нормально документироваться и читаться).
2. В критичных проектах с большой базой картинок иногда проще использовать белый лист разрешенных изображений, примерно так:
function remove_unused_image_sizes() {
$allowed_sizes = array( 'thumbnail', 'medium', 'large' );
$registered_sizes = get_intermediate_image_sizes();
foreach ( $registered_sizes as $size ) {
if ( ! in_array( $size, $allowed_sizes ) ) {
remove_image_size( $size );
}
}
}
add_action('init', 'remove_unused_image_sizes');
Это страхует от распухания папки загрузок, но требует внимательности при подключении плагинов, работающих с изображениями (например, ACF Image Crop и т.п.).
3. После всех манипуляций лучше пройтись по базе каким-нибудь чистильщиком, чтобы повырезать остатки от неиспользуемых форматов и битые ссылки. Плагинов море, я пользуюсь Media Cleaner Pro.
Успехов!