WordPress как на ладони
rgbcode is looking for WordPress developers.

Суффикс «-scaled» у картинки, или что WP делает с большими изображениями

С версии WordPress 5.3 при загрузке очень больших картинок создается её меньшая копия, так чтобы при запросе full размера вместо оригинала использовалась эта копия картинки. Чтобы при загрузке, скажем, картинки размером 5000x2000 на сайте эта картинка нигде не использовалась, а использовалась её уменьшенная до «приличных» размеров копия. По умолчанию «приличным» размером считается картинка не больше 2560 пикселей в ширину или высоту.

Подробнее, как это работает.

Допустим, мы загружаем картинку размером 5000x2000px. WordPress в этом случае, кроме создания прочих миниатюр, создаст из этой картинки копию размером 2560x1024px (пропорционально впишет её в размер 2560) и сохранит её в папку загрузок uploads с новым названием {ИМЯ_КАРТИНКИ}-scaled.{EXT}. Далее, заменит путь оригинальной картинки в метаданных, на этот созданный путь, чтобы эта копия считалась оригиналом. А также, сохранит имя исходной картинки в метаданные под ключом original_image, см. _wp_image_meta_replace_original().

Созданная копия оригинала с «приличным» размером, теперь считается оригинальной картинкой и путь до неё записан в метаполе _wp_attached_file. И теперь функция, которая обычно возвращает оригинальный путь get_attached_file() или оригинальный URL wp_get_attachment_url() и другие функции, которые должны вернуть оригинальную картинку, будут возвращать новый -scaled путь/URL.

-scaled размер НЕ создается для .png картинок, потому что бывают случаи когда уменьшенный размер весит больше оригинала, см. тикет #48736.

Файл исходной картинки не удаляется и находится в папке uploads и путь или URL к ней можно получить через новые для WP 5.3 функции:

Уменьшенная версия будет создаваться для любой картинки ширина или высота которой больше чем указанный порог - 2560px.

Порог («приличный» размер, о котором идет речь) можно изменить через фильтр big_image_size_threshold вернув в нём нужный нам размер:

# Изменим `-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 не сохраняя исходную картинку?

// Removes original image file from disk if `-scaled` size has been created. Works for WP 5.3+ only.
add_filter( 'wp_generate_attachment_metadata', 'remove_scaled_original_image_file', 10, 3 );

/**
 * Removes original image file from disk if `-scaled` size has been created.
 *
 * Function for hook `wp_generate_attachment_metadata`.
 *
 * @param array  $image_meta
 * @param int    $attachment_id
 * @param string $context       Exists from 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;
	}

	// remove original image file from disk

	$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( 'Couldn`t remove original_image file.' );
	}

	return $image_meta;
}

--

8 комментариев
    Войти