Я потратил довольно много времени на оптимизацию работы этого сайта, и в рамках текущей работы я слежу за новыми технологиями, которые могут помочь увеличить скорость для посетителей. Некоторое время я отслеживал внедрение графических форматов следующего поколения, и с учетом того, что веб-браузеры теперь широко распространены, пришло время выяснить, как использовать эти новые форматы в wordpress..
Требуется несколько шагов, которые я разбил на заголовки ниже.
Включить поддержку в nginx
Первый шаг - включить ваш веб-сервер (в моем случае nginx) распознавать типы пантомимы новых форматов. Для этого вам нужно отредактировать mime.types, который, вероятно, находится в /etc/nginx/mime.types.. Я добавил следующий раздел
/ content нарушают правила нарушают правила; изображение / heif heif; изображение / heic-sequence heics; изображение / heif-sequence heifs; изображение / avif avif; просмотр изображения / avif-последовательности; изображение / jxl jxl;
Автоматически обслуживать файлы там, где они доступны
Следующим шагом является указание nginx автоматически обслуживать файлы, когда они существуют. (и вернуться к старым форматам, где нет файла нового формата)
Для этого сначала отредактируйте основной файл конфигурации nginx (обычно /etc/nginx/nginx.conf) и добавьте следующий раздел в http{} раздел конфига
карта $ http_accept $ img_ext { ~ изображение / jxl '.jxl'; ~ изображение / avif '.avif'; ~ изображение / webp '.webp'; По умолчанию ''; }
Обратите внимание, что я пытаюсь обслуживать только jxl (JPEG-XL) или файлы avif, вы могли бы добавить больше опций (в порядке предпочтения!) если хочешь.
Следующий, вам нужно добавить следующее под сервером{} раздел конфигурации nginx (который может быть в основном файле конфигурации или может быть в отдельном файле конфигурации, в зависимости от того, как вы настроили структуру конфигурации nginx)
расположение ~ * ^. + .(PNG|jpg|JPEG)$ { add_header Vary Accept; try_files $ uri $ img_ext $ uri = 404; }
Теперь nginx будет искать image.jpg.jxl, а затем image.jpg.avif, а затем image.jpg.webp и, наконец, image.jpg, когда он запрашивает image.jpg любыми браузерами, поддерживающими новые форматы.. Далее нам нужно включить их в wordpress
включить форматы следующего поколения в wordpress
Добавьте следующий код в свой functions.php (в идеале сделайте это в дочерней теме, чтобы при обновлении темы ваши изменения не перезаписывались)
/***************************************************\ * Включить SVG поддержка и других современных форматов изображений * \***************************************************/ функция cc_mime_types( $мимы ) { $мимы['svg'] = 'изображение / svg + xml'; $мимы['webp'] = 'изображение / webp'; $мимы["Нарушить"] = "Изображение / неопытный '; $мимы['телка'] = 'изображение / heif'; $мимы[шестнадцатеричный] = "Изображение / нарушение последовательности правил"; $мимы[телки] = 'изображение / heif-последовательность'; $мимы[avif] = 'изображение / avif'; $мимы['уведомление'] = 'изображение / avif-последовательность'; $мимы['jxl'] = 'изображение / jxl'; вернуть $ мимы; } add_filter( 'upload_mimes', 'cc_mime_types' );
Обратите внимание, что я также включил поддержку для SVG изображения одновременно
Теперь вы можете загружать изображения в формате следующего поколения и использовать их непосредственно в wordpress, если хотите, но я не рекомендую это, так как многие старые браузеры еще не поддерживают их - и мы уже настроили nginx для их интеллектуального обслуживания, поэтому мы должны использовать это. Мы хотим автоматически генерировать новые форматы при загрузке изображений. (есть плагины, которые уже делают это для webp, но еще ничего, что делает это для jxl или avif).
Установить libheif
Этот шаг требует доступа к командной строке вашего веб-хостинга., что очень просто, если вы запустите VPS, но может быть не так просто, если вы используете общий хостинг, и в этом случае вам может потребоваться обратиться за поддержкой к своему хосту.
Выполните следующие команды bash (они выбраны для Centos 8, другие дистрибутивы могут немного отличаться)
dnf -y install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm dnf -y установить libheif
Добавить пользовательскую функцию в wordpress functions.php для сжатия всех загруженных изображений (и их миниатюры) в формат avif
Как и в предыдущем шаге functions.php, я рекомендую добавить его в дочернюю тему.
/*****************************\ * Преобразование png и jpg в avif * \*****************************/ add_filter( 'wp_generate_attachment_metadata', 'jps_compress_img', 10, 2 ); функция jps_compress_img( $метаданные, $attachment_id ) { // получить путь к файлу из идентификатора $ filepath = get_attached_file($attachment_id); // это файл png или jpeg если(pathinfo($Путь файла, PATHINFO_EXTENSION)=="jpg" || pathinfo($Путь файла, PATHINFO_EXTENSION)=="JPEG" || pathinfo($Путь файла, PATHINFO_EXTENSION)=="PNG") { // Если так, запустить сжатие основного файла в avif shell_exec("heif-enc $ путь к файлу -o $ путь к файлу.avif -q 50 -A"); $parts = preg_split('~ /(?=[^ /]*$)~ ', $Путь файла); // Затем запустите сжатие миниатюр в avif $ thumbpaths = $ метаданные['размеры']; для каждого ($пути для большого пальца как $ key => $большой палец руки) { $thumbpath = $ thumb['файл']; $thumbfullpath = $ parts[0] . "/" . $дорожка; shell_exec("heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -A"); } } // вернуть то, что у нас есть вернуть метаданные $; } //не забудьте удалить avifs, если вложения удалены функция jps_delete_avif($attachment_id) { $all_images = get_intermediate_image_sizes($attachment_id); для каждого($all_images как $ each_img) { $each_img_det = wp_get_attachment_image_src($attach_id,$each_img); $each_img_path = ABSPATH.'wp-content'.substr($each_img_det[0],strpos($each_img_det[0],"/загружает /")).'.avif'; shell_exec("rm -f $ each_img_path"); } } add_action( 'delete_attachment', 'jps_delete_avif' );
На данный момент это все - все изображения, которые вы загружаете, будут преобразованы в копии в формате avif. (с сохранением оригиналов). Вы можете регенерировать все свои изображения для создания файлов avif с помощью плагина. Примечание. Я еще не настроил JPEG-Сжатие XL, поскольку его поддержка пока недоступна в основных браузерах. (хотя он находится в предварительных версиях браузеров, так что он скоро появится).
Пока я рассказываю о форматах и оптимизации следующего поколения, у меня есть еще один последний совет - сжимать SVG изображения с gzip (или даже лучше zopfli и brotli). Для этого требуется еще одна настраиваемая функция…
Бонус: SVG компрессия
/*************************************************\ * Компресс SVG изображения больше с brotli и zopfli * \*************************************************/ add_filter( 'wp_generate_attachment_metadata', 'jps_compress_vectors', 10, 2 ); функция jps_compress_vectors( $метаданные, $attachment_id ) { // получить путь к файлу из идентификатора $ filepath = get_attached_file($attachment_id); // это файл svg если(pathinfo($Путь файла, PATHINFO_EXTENSION)=="SVG") { // Если так, запустите сжатие с помощью zopfli и brotli shell_exec("zopfli --gzip $ путь к файлу"); shell_exec("brotli --best --output = $ filepath.br $ путь к файлу"); } // вернуть то, что у нас есть вернуть метаданные $; }
Обратите внимание, что вам понадобятся gzip_static и brotli_static, включенные в вашей конфигурации nginx..
Самостоятельная компиляция для новой версии
Я обнаружил, что на Centos последняя версия heif-enc 1.7 который имеет довольно много ошибок при создании avif-файлов. Поэтому я решил собрать свою новую версию (1.12) построить и использовать это вместо. Сделать это было немного сложно, так как требовался кодек aom в качестве разделяемой библиотеки.. Для этого выполните следующие команды bash. Обязательно запускайте их как обычный пользователь, не как пользователь root. Также обратите внимание, что некоторые из этих команд могут не понадобиться., мне потребовалось время, чтобы заставить его работать, и я просто записал, что сработало - я ни в коем случае не эксперт по Linux!
dnf установить x265 x265-devel svt-av1 экспорт CXXFLAGS ="$CXXFLAGS -fPIC" cd ~ git clone https://aomedia.googlesource.com/aom mkdir -p aom_build cd aom_build cmake ~ / aom -DBUILD_SHARED_LIBS = истина делать sudo make install cp ./libaom.so.3 /usr/bin/local/libaom.so.3 cd ~ экспорт PKG_CONFIG_PATH = ~ / aom_build / LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:~ / aom_build / экспорт LD_LIBRARY_PATH git clone --recurse-submodules --recursive https://github.com/strukturag/libheif.git cd libheif ./autogen.sh ./configure делать sudo make install LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/USR / местные / бен / экспорт LD_LIBRARY_PATH
Как только вы это сделаете, убедитесь, что он работает, запустив php -a
и выполнив следующую команду
shell_exec("/usr / местный / bin / heif-enc -A");
Вы должны получить полный вывод, не просто 1 ошибка линии. Предполагая, что это работает нормально, вы можете изменить свой functions.php так, чтобы каждая из ссылок shell-exec указывала на / usr / local / bin / heif-enc, а не только на heif-enc.
/*****************************\ * Преобразование png и jpg в avif * \*****************************/ add_filter( 'wp_generate_attachment_metadata', 'jps_compress_img', 10, 2 ); функция jps_compress_img( $метаданные, $attachment_id ) { // получить путь к файлу из идентификатора $ filepath = get_attached_file($attachment_id); // это файл png или jpeg если(pathinfo($Путь файла, PATHINFO_EXTENSION)=="jpg" || pathinfo($Путь файла, PATHINFO_EXTENSION)=="JPEG" || pathinfo($Путь файла, PATHINFO_EXTENSION)=="PNG") { // Если так, запустить сжатие основного файла в avif shell_exec("/usr / local / bin / heif-enc $ путь к файлу -o $ путь к файлу.avif -q 50 -A"); $parts = preg_split('~ /(?=[^ /]*$)~ ', $Путь файла); // Затем запустите сжатие миниатюр в avif $ thumbpaths = $ метаданные['размеры']; для каждого ($пути для большого пальца как $ key => $большой палец руки) { $thumbpath = $ thumb['файл']; $thumbfullpath = $ parts[0] . "/" . $дорожка; shell_exec("/usr / local / bin / heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -A"); } } // вернуть то, что у нас есть вернуть метаданные $; }
“Hi James I realise it has been a long while, but I just checked this on windows 11 (build 23H2)…”