Вопрос или проблема
Я не вижу никаких настроек и не нахожу много информации в документации php api по этому поводу?
Например, если оригинальный файл загрузки — это png
, WordPress конвертирует его в jpg
.
Вот что я написал, потому что мои клиенты использовали изображения в очень высоком качестве в формате png, хотя они могли бы использовать более сжатые jpg для веб-сайта. Обратите внимание, что это все еще сохраняет оригинальное изображение, только изменяет миниатюры. Добавьте это в ваш functions.php.
<?php
// Принудительное преобразование миниатюр PNG в JPG
add_filter('wp_generate_attachment_metadata','force_png_to_jpg');
function force_png_to_jpg($image_data) {
$sizes = array('thumbnail','medium','large');
$upload_dir = wp_upload_dir();
$file = $upload_dir['path'] . "https://wordpress.stackexchange.com/" . basename($image_data['file']);
foreach($sizes as $size){
if(isset($image_data['sizes'][$size]))
{
if( $image_data['sizes'][$size]['mime-type'] == "image/png" ){
// Изменение формата и имени файла на jpg
$dest_file = preg_replace('/\.png$/i', '.jpg', $image_data['sizes'][$size]['file']);
$image_data['sizes'][$size]['file'] = $dest_file;
$image_data['sizes'][$size]['mime-type'] = "image/jpg";
// Обработка изображения в jpg с использованием стандартной библиотеки gd
$image = imagecreatefrompng($file);
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
imagealphablending($bg, TRUE);
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
$bg = imagescale($bg, $image_data['sizes'][$size]['width'], $image_data['sizes'][$size]['height'] );
imagedestroy($image);
// Установка качества и сохранение
$quality = 80; // 0 = худший / меньше файл, 100 = лучший / больше файл
imagejpeg($bg, $upload_dir['path'] . "https://wordpress.stackexchange.com/" . $dest_file, $quality);
imagedestroy($bg);
}
}
}
return $image_data;
}
Миниатюры будут сохраняться с использованием mime типа файла.
Вам необходимо будет создать свои собственные функции с использованием php расширения или библиотеки. WordPress использует GD, но надеюсь, что это будет перенесено на ImageMagick к версии 3.5. Используя API, доступный в расширении, вы можете добавлять хуки и фильтры для конвертации изображений. Хорошей отправной точкой будет изучение функций media_handle_download и media_sideload_image.
Очень хороший скрипт! Спасибо за то, что поделились! Изначально созданные миниатюры PNG не удаляются. Есть ли способ добавить код для удаления этих слишком больших миниатюр PNG? Я не программист, просто дизайнер с большим количеством технических знаний, поэтому я не знаю, как это сделать…
Почему стоит использовать этот скрипт?
Я загружаю PNG файлы в WordPress (где это возможно), которые были уменьшены по размеру файла до 66% с помощью tinypng.com. WordPress создает миниатюры без “бессмертного сжатия” tinypng.com, что приводит к тому, что миниатюра 640×360 оказывается значительно больше по размеру, чем оригинальная загрузка с 1920×1080 пикселями. Поэтому совершенно необходимо, чтобы WordPress сохранял каждую миниатюру в формате JPG.
Ответ или решение
Да, возможно заставить WordPress всегда сохранять миниатюры в формате JPG, а не PNG. Это решение может быть особенно полезным для дизайнеров и разработчиков, которые работают с изображениями, и хотят уменьшить размер файла, сохраняя при этом приемлемое качество изображения.
Как это реализовать: Пошаговое руководство
Для достижения этой цели можно использовать фильтр wp_generate_attachment_metadata
в вашем файле functions.php
. Вот подробный код, который позволяет конвертировать все загруженные изображения PNG в JPG для миниатюр, сохраняя оригинальные изображения в их исходном формате.
// Принудительное сохранение миниатюр PNG в JPG
add_filter('wp_generate_attachment_metadata', 'force_png_to_jpg');
function force_png_to_jpg($image_data) {
$sizes = array('thumbnail', 'medium', 'large');
$upload_dir = wp_upload_dir();
$file = $upload_dir['path'] . "/" . basename($image_data['file']);
foreach($sizes as $size) {
if (isset($image_data['sizes'][$size]) && $image_data['sizes'][$size]['mime-type'] == "image/png") {
// Изменение формата и названия файла для JPG
$dest_file = preg_replace('/\.png$/i', '.jpg', $image_data['sizes'][$size]['file']);
$image_data['sizes'][$size]['file'] = $dest_file;
$image_data['sizes'][$size]['mime-type'] = "image/jpeg";
// Обработка изображения PNG в JPG с помощью стандартной библиотеки GD
$image = imagecreatefrompng($file);
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
imagealphablending($bg, TRUE);
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
$bg = imagescale($bg, $image_data['sizes'][$size]['width'], $image_data['sizes'][$size]['height']);
imagedestroy($image);
// Установка качества и сохранение
$quality = 80; // 0 = худшее / меньший файл, 100 = лучшее / больший файл
imagejpeg($bg, $upload_dir['path'] . "/" . $dest_file, $quality);
imagedestroy($bg);
}
}
return $image_data;
}
Описание кода
-
Добавление фильтра: Мы добавляем фильтр
wp_generate_attachment_metadata
, чтобы изменить метаданные изображения, как только оно загружено. -
Обработка изображений: Мы проверяем, существует ли миниатюра в формате PNG. Если да, то мы меняем название файла на JPG и его MIME-тип.
-
Создание JPG-версии: Мы используем стандартные функции GD для создания JPG из PNG, что включает в себя создание пустого фонового изображения и наложение загруженного PNG.
-
Настройка качества: Устанавливаем качество JPEG, чтобы получить желаемый баланс между качеством и размером файла.
Удаление оригинальных PNG миниатюр
Если вы также хотите удалить оригинальные миниатюры в формате PNG, можно добавить дополнительный код в вышеописанную функцию. Например, вы можете использовать unlink()
для удаления файлов после их обработки:
// Удаление оригинальных PNG миниатюр
if (file_exists($file)) {
unlink($file);
}
Обратите внимание, что это действие нельзя отменить, поэтому используйте его осторожно.
Заключение
Использование данной функции позволит существенно снизить размер миниатюр, улучшив производительность вашего сайта и ускорив загрузку страниц. Этот подход особенно полезен, если ваши клиенты загружают изображения высокого качества, которые не всегда необходимы в их оригинальном формате.
Работа с WordPress и изображениями может быть сложной, но с правильными инструментами и методами вы сможете оптимизировать свой процесс и обеспечить отличное качество обновлений.