Суффикс «-scaled» для изображений: обработка больших изображений в WordPress

Суффикс «-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 обрабатывает большие изображения, создавая их уменьшенные копии. Вы также можете настроить размеры изображений под ваши нужды и даже полностью избавиться от оригиналов, если они вам не нужны.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *