возможно ли заставить WordPress всегда сохранять миниатюры в формате ‘jpg’, а не ‘png’

Вопрос или проблема

Я не вижу никаких настроек и не нахожу много информации в документации 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;
}

Описание кода

  1. Добавление фильтра: Мы добавляем фильтр wp_generate_attachment_metadata, чтобы изменить метаданные изображения, как только оно загружено.

  2. Обработка изображений: Мы проверяем, существует ли миниатюра в формате PNG. Если да, то мы меняем название файла на JPG и его MIME-тип.

  3. Создание JPG-версии: Мы используем стандартные функции GD для создания JPG из PNG, что включает в себя создание пустого фонового изображения и наложение загруженного PNG.

  4. Настройка качества: Устанавливаем качество JPEG, чтобы получить желаемый баланс между качеством и размером файла.

Удаление оригинальных PNG миниатюр

Если вы также хотите удалить оригинальные миниатюры в формате PNG, можно добавить дополнительный код в вышеописанную функцию. Например, вы можете использовать unlink() для удаления файлов после их обработки:

// Удаление оригинальных PNG миниатюр
if (file_exists($file)) {
    unlink($file);
}

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

Заключение

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

Работа с WordPress и изображениями может быть сложной, но с правильными инструментами и методами вы сможете оптимизировать свой процесс и обеспечить отличное качество обновлений.

Оцените материал
Добавить комментарий

Капча загружается...