В этой статье я бы хотел показать, как удалить оригинал загружаемого изображения при загрузке в WordPress, а его функции назначить самому большому размеру получаемого из этого изображения.

Для начала, разберем, почему и когда может возникнуть в этом необходимость.

Предположим, вы создали сайт на WordPress, который постоянно пополняется новыми материалами и куда постоянно нужно загружать большое количество фотографий. Если вы сами занимаетесь поддержкой сайта, Вы скорее всего, перед загрузкой уменьшаете размер фотографий, чтобы они быстрей загружались и занимали меньше места на сервере. Но, что, если заказчик сайта сам этим заниматься, он понятие не имеет как уменьшать размер фотографий и пытается загружать пяти мегабайтные файлы, а может и большего размера, которые очень быстро заполнят дисковое пространство.

Освободить дисковое пространство, можно простым удалением оригинальных файлов, но это решение, хоть и приносит желаемый результат, является очень сомнительным. Дело в том, что, если потребуется заново сгенерировать новые размеры для изображений это не удастся сделать. Генерация новых изображений может потребоваться, когда на сайте будут использоваться их новые размеры или, например, когда потребуется изменить или добавить водяной знак на фотографии.

Плавно переходим к лучшему решению этой задачи. После загрузки большой фотографии и, после того как WordPress создаст из нее набор меньшего размера, мы удаляем оригинал огромного размера и назначаем самую большую копию в качестве оригинала. Тем самым, мы избавляемся от ненужных больших файлов, но и сохраняем возможность генерации новых размеров при необходимости.

После долгого вступления, ниже находится, непосредственно код, который поможет это сделать. Будет хорошей идеей переопределить размеры для самой большой копии и задать их с запасом.

function rmn_replace_uploaded_image($image_data) {
	// Ничего не делать если изображение маленькое
	if ( !isset( $image_data['sizes']['large'] ) ) return $image_data;

	// Пути к изображениям и большое изображение
	$upload_dir = wp_upload_dir();
	$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];

	//Для новых изображений
	$large_image_location = $upload_dir['path'] . '/' . $image_data['sizes']['large']['file']; 

	// Удалить загруженное изображение
	unlink($uploaded_image_location);

	// Переименование большой копии
	rename($large_image_location,$uploaded_image_location);

	// Обновление метаданных
	$image_data['width'] = $image_data['sizes']['large']['width'];
	$image_data['height'] = $image_data['sizes']['large']['height'];
	unset($image_data['sizes']['large']);

	return $image_data;
}

// Прикрепление функции к необходимому хуку
add_filter( 'wp_generate_attachment_metadata', ' rmn_replace_uploaded_image' );

Парочка небольших ремарок к коду выше. Чтобы он заработал нужно отключить масштабирование больших изображений в WordPress. Для больших фотографий/изображений он создает еще один размер и помечает его суффиксом «_scaled» в имени. Это дополнительное действие нам не нужно, поэтому отключаем:

add_filter( 'big_image_size_threshold', '__return_false' );

В качестве второй ремарки, хотел бы отметить, что код выше работает только для новых изображений. Если нужно, заменить/удалить оригинал для уже загруженных в медиа библиотеку, то строчку $large_image_location = …, нужно заменить следующим кодом.

$current_subdir = substr( $image_data['file'], 0, strrpos( $image_data['file'], '/' ) );
$large_image_location = $upload_dir['basedir'] . '/' . $current_subdir . '/' . $image_data['sizes']['large']['file'];

Таким образом можно заменить загруженное изображение ее копией меньшего размера. Тем самым безопасно удалив оригинальное изображение и оставив вместо него его самую большую копию.

Представленный код не является исключительно моим, я лишь модифицировал и адаптировал его для своих нужд.