لقد قضيت الكثير من الوقت في تحسين أداء هذا الموقع, وكجزء من العمل المستمر ، أراقب التقنيات الجديدة التي يمكن أن تساعد في تحسين سرعة الزوار. لقد كنت أتتبع اعتماد تنسيقات الصور من الجيل التالي لفترة من الوقت وبدعم من متصفحات الويب الآن على نطاق واسع إلى حد ما ، فقد حان الوقت لمعرفة كيفية الاستفادة من هذه التنسيقات الجديدة في Wordpress.
There are multiple steps required which I have broken down into headings below
تفعيل الدعم في nginx
The first step is to enable your web server (في حالتي nginx) to recognise the mime types of the new formats. للقيام بذلك ، تحتاج إلى تحرير mime.types الذي يمكن العثور عليه على الأرجح في /etc/nginx/mime.types. I added the following section
/ محتوى ينتهك القواعد ينتهك القواعد; صورة / هيف; صورة / تسلسل heic heics; صورة / تسلسل هيف; صورة / avif avif; مراجعة تسلسل الصورة / AVIF; صورة / jxl jxl;
خدمة الملفات تلقائيًا حيثما كانت متاحة
The next step is to tell nginx to serve files automatically whenever they exist (and to fall back to older formats where a new format file doesn’t exist)
To do this first edit the main nginx config file (usually /etc/nginx/nginx.conf) and add the following section inside the http{} section of the config
الخريطة $ http_accept $ img_ext { ~ image / jxl ".jxl"; ~ صورة / avif ".avif"; ~ صورة / ويب ".webp"; إفتراضي ''; }
Note that I am only trying to serve jxl (JPEG-XL) أو ملفات avif, يمكنك إضافة المزيد من الخيارات (in order of preference!) لو كنت تريد.
التالي, you need to add the following under the server{} section of the nginx config (which may be in the main config file or may be in a separate config file depending how you’ve set up your nginx config structure)
الموقع ~ * ^. + .(بابوا نيو غينيا|JPG|الحياة السياسية في فرنسا)$ { add_header متنوع القبول; try_files $ uri $ img_ext $ uri = 404; }
Now nginx will look for image.jpg.jxl and then image.jpg.avif and then image.jpg.webp and finally image.jpg when it is asked for image.jpg by any browsers that support the newer formats. بعد ذلك نحتاج إلى تمكينهم في وورد
تمكين تنسيقات الجيل التالي في وورد
Add the following code to your functions.php (من الأفضل إجراء ذلك في مظهر فرعي بحيث لا تتم كتابة تغييراتك بشكل زائد عند تحديث المظهر)
/***************************************************\ * تمكين SVG الدعم وتنسيقات الصور الحديثة الأخرى * \***************************************************/ وظيفة cc_mime_types( $التمثيل الصامت ) { $التمثيل الصامت['svg'] = 'صورة / svg + xml'; $التمثيل الصامت["ويب"] = "صورة / ويب"; $التمثيل الصامت["ينتهك"] = "صورة / غير مهارة"; $التمثيل الصامت["هيف"] = 'صورة / هيف'; $التمثيل الصامت['عرافة'] = "صورة / انتهاك تسلسل القواعد"; $التمثيل الصامت["هيفس"] = "صورة / تسلسل هيف"; $التمثيل الصامت["عفيف"] = 'صورة / avif'; $التمثيل الصامت['تنويه'] = "صورة / تسلسل AVIF"; $التمثيل الصامت["jxl"] = 'صورة / jxl'; إرجاع التمثيل الصامت بالدولار; } add_filter( "upload_mimes", "cc_mime_types" );
Note that I also enabled support for SVG الصور في نفس الوقت
Now you can actually upload next gen format images and use them directly in wordpress if you want to, but I don’t recommend this as many older browsers don’t support them yet — and we’ve already set up nginx to serve them intelligently so we should make use of that. What we want to do is to automatically generate the new formats when we upload images (there are plugins that do this for webp already, but nothing that does it for jxl or avif yet).
تثبيت libheif
This step does require access to the command line of your web host, which is straight-forward if you run a VPS, but may not be so simple if you’re on shared hosting in which case you might need to ask your host for support
Run the following bash commands (these are selected for سينت أو إس 8, other distributions may be a little different)
dnf -y install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://تم اختيار هذه ل
أضف وظيفة مخصصة إلى وظائف wordpress.php لضغط جميع الصور التي تم تحميلها (وصورهم المصغرة) إلى تنسيق avif
As with the earlier functions.php step I recommend adding this in a child theme
/*****************************\
* تحويل png و jpg إلى avif *
\*****************************/
add_filter( "wp_generate_attachment_metadata", 'jps_compress_img', 10, 2 );
وظيفة jps_compress_img( $البيانات الوصفية, $attachment_id )
{
// تم اختيار هذه ل($attachment_id);
// تم اختيار هذه ل(معلومات($مسار الملف, PATHINFO_EXTENSION)=="JPG" || معلومات($مسار الملف, PATHINFO_EXTENSION)=="الحياة السياسية في فرنسا" || معلومات($مسار الملف, PATHINFO_EXTENSION)=="بابوا نيو غينيا")
{
// لو ذلك, تم اختيار هذه ل("heif-enc $ filepath -o $ filepath.avif -q 50 -ا");
$أجزاء = preg_split('~ /(?=[^ /]*$)~ ', $مسار الملف);
// تم اختيار هذه ل["الأحجام"];
foreach ($thumbpaths as $key => $إبهام اليد)
{
$مسار الإبهام = الإبهام['ملف'];
$thumbfullpath = أجزاء $[0] . "/" . $إبهام;
shell_exec("heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -ا");
}
}
// تم اختيار هذه ل;
}
//تم اختيار هذه ل($attachment_id)
{
$all_images = get_intermediate_image_sizes($attachment_id);
foreach($all_images كـ $ each_img)
{
$each_img_det = wp_get_attachment_image_src($attach_id,$كل صورة);
$each_img_path = ABSPATH.'wp-content'.substr($كل صورة[0],strpos($كل صورة[0],"/تحميلات /")).".avif";
shell_exec("rm -f $ each_img_path");
}
}
ADD_ACTION( "delete_attachment", "jps_delete_avif" );
At present that is it — all images you upload will be converted to avif copies (with the originals retained). You can regenerate all of your images to create the avif files by using a plugin. Note — I haven’t yet set up JPEG-XL compression as support for it isn’t available in mainstream browsers yet (although it is in prerelease browsers so it is coming very soon).
Whilst I’m covering next gen formats and optimisation though I have one final tip — To compress SVG الصور مع gzip (or even better zopfli and brotli). To do that requires another custom function…
علاوة: SVG ضغط
/*************************************************\ * ضغط SVG الصور أكثر مع brotli و zopfli * \*************************************************/ add_filter( "wp_generate_attachment_metadata", "jps_compress_vectors", 10, 2 ); دالة jps_compress_vectors( $البيانات الوصفية, $attachment_id ) { // تم اختيار هذه ل($attachment_id); // تم اختيار هذه ل(معلومات($مسار الملف, PATHINFO_EXTENSION)=="SVG") { // لو ذلك, تم اختيار هذه ل("zopfli --gzip $ filepath"); shell_exec("brotli --best --output = $ filepath.br $ filepath"); } // تم اختيار هذه ل; }
لاحظ أنك ستحتاج إلى تمكين gzip_static و brotli_static في تهيئة nginx.
الترجمة الذاتية لنسخة أحدث
I found that on Centos the latest version of heif-enc is 1.7 which has quite a few bugs when creating avifs. So I opted to compile my own newer (1.12) بناء واستخدام ذلك بدلا من ذلك. Doing so was a little complicated as it required the aom codec as a shared library. To do so run the following bash commands. Make sure to run them as a normal user, ليس كمستخدم جذر. Also note some of these commands may not be strictly needed, it took me a while to get it working and I just made a note of what worked — I am by no means a linux expert!
تم اختيار هذه ل"$CXXFLAGS -fPIC" تم اختيار هذه ل://aomedia.googlesource.com/aom mkdir -p aom_build قرص مضغوط aom_build cmake ~ / aom -DBUILD_SHARED_LIBS = صحيح صنع sudo جعل التثبيت cp ./libaom.so.3 /usr/bin/local/libaom.so.3 مؤتمر نزع السلاح ~ تصدير PKG_CONFIG_PATH = ~ / aom_build / LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:aomedia.googlesource.com/aom mkdir -p aom_build قرص مضغوط aom_build cmake ~ / aom -DBUILD_SHARED_LIBS = صحيح صنع sudo جعل التثبيت cp ./libaom.so.3 /usr/bin/local/libaom.so.3 مؤتمر نزع السلاح ~ تصدير PKG_CONFIG_PATH = ~ / aom_build / LD_LIBRARY_PATH = $ LD_LIBRARY_PATH://aomedia.googlesource.com/aom mkdir -p aom_build قرص مضغوط aom_build cmake ~ / aom -DBUILD_SHARED_LIBS = صحيح صنع sudo جعل التثبيت cp ./libaom.so.3 /usr/bin/local/libaom.so.3 مؤتمر نزع السلاح ~ تصدير PKG_CONFIG_PATH = ~ / aom_build / LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/aomedia.googlesource.com/aom mkdir -p aom_build قرص مضغوط aom_build cmake ~ / aom -DBUILD_SHARED_LIBS = صحيح صنع sudo جعل التثبيت cp ./libaom.so.3 /usr/bin/local/libaom.so.3 مؤتمر نزع السلاح ~ تصدير PKG_CONFIG_PATH = ~ / aom_build / LD_LIBRARY_PATH = $ LD_LIBRARY_PATH
بمجرد القيام بذلك, make sure it works by running php -a
and running the following command
shell_exec("/usr / local / bin / heif-enc -A");
You should get a full output, ليس فقط أ 1 خطأ في الخط. Assuming that works ok you can modify your functions.php so that each of the shell-exec references points to /usr/local/bin/heif-enc instead of just heif-enc
/*****************************\
* تحويل png و jpg إلى avif *
\*****************************/
add_filter( "wp_generate_attachment_metadata", 'jps_compress_img', 10, 2 );
وظيفة jps_compress_img( $البيانات الوصفية, $attachment_id )
{
// تم اختيار هذه ل($attachment_id);
// تم اختيار هذه ل(معلومات($مسار الملف, PATHINFO_EXTENSION)=="JPG" || معلومات($مسار الملف, PATHINFO_EXTENSION)=="الحياة السياسية في فرنسا" || معلومات($مسار الملف, PATHINFO_EXTENSION)=="بابوا نيو غينيا")
{
// لو ذلك, تم اختيار هذه ل("/usr / local / bin / heif-enc $ filepath -o $ filepath.avif -q 50 -ا");
$أجزاء = preg_split('~ /(?=[^ /]*$)~ ', $مسار الملف);
// تم اختيار هذه ل["الأحجام"];
foreach ($thumbpaths as $key => $إبهام اليد)
{
$مسار الإبهام = الإبهام['ملف'];
$thumbfullpath = أجزاء $[0] . "/" . $إبهام;
shell_exec("/usr / local / bin / heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -ا");
}
}
// تم اختيار هذه ل;
}
“Hi James I realise it has been a long while, but I just checked this on windows 11 (build 23H2)…”