I have spent quite a lot of time optimising the performance of this site, and as part of ongoing work I monitor new technologies that could help improve the speed for visitors. I’ve been tracking the adoption of next-generation image formats for a while and with support by web browsers now fairly widespread it was time to figure out how to make use of these new formats in wordpress.
There are multiple steps required which I have broken down into headings below
nginx میں مدد کو فعال کریں
The first step is to enable your web server (میرے معاملے میں) to recognise the mime types of the new formats. ایسا کرنے کے ل you آپ کو mime.types میں ترمیم کرنے کی ضرورت ہے جو /etc/nginx/mime.tyype پر ملنے کا امکان ہے۔. I added the following section
/ مشمولات قواعد کی خلاف ورزی کرتے ہیں; تصویر / heif heif; امیج / ہییک تسلسل ہیکس; شبیہہ / heif- ترتیب heifs; تصویر / avif avif; تصویری / avif-sequence جائزہ; تصویر / 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 { ~ شبیہ / jxl '.jxl'; ~ شبیہ / avif '.avif'; ~ تصویری / ویبپ '.webp'; پہلے سے طے شدہ ''; }
Note that I am only trying to serve jxl (JPEG-ایکس ایل) یا 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)
مقام ~ * ^. + .(PNG|JPG|jpeg)$ { add_ ہیڈر مختلف قبول کریں; 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 سپورٹ اور دیگر جدید تصویری شکلیں * \***************************************************/ فنکشن سی سی_مائیم_ٹائپس( $mimes ) { $mimes['ایس جی جی'] = 'امیج / ایس جی جی + ایکس ایم ایل'; $mimes['ویبپ'] = 'امیج / ویبپ'; $mimes["سرقہ"] = "امیج / غیر ہنر '; $mimes['heif'] = 'امیج / ہیف'; $mimes['ہیکس'] = "اصول / ترتیب کی شبیہہ / خلاف ورزی '; $mimes['heifs'] = 'شبیہہ / ہیف تسلسل'; $mimes['avif'] = 'شبیہہ / avif'; $mimes['نوٹس'] = 'شبیہہ / avif-sequence'; $mimes['jxl'] = 'تصویر / jxl'; واپس $ mimes; } 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://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
dnf -y install libheif
ورڈپریس فنکشنس میں اپنی مرضی کے مطابق فنکشن شامل کریں (اور ان کے تمبنےل) 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( $میٹا ڈیٹا, $منسلک_اید ) { // get filepath from id $filepath= get_attached_file($منسلک_اید); // is the file a png or jpeg if(pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="JPG" || pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="jpeg" || pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="PNG") { // اگر ایسا ہے, run compression of the main file to avif shell_exec("heif-enc $ filepath -o $ filepath.avif -q 50 -ایک"); $حصوں = preg_split('~ /(?=[^ /]*$)', $فائل پاتھ); // Then run compression of the thumbnails to avif $thumbpaths = $metadata['سائز']; ہر ایک کے لئے ($thumbpaths as $key => $انگوٹھے) { $thumbpath = $ انگوٹھا['فائل']; $thumbfullpath = $ حصے[0] . "/" . $انگوٹھے; شیل_کسیک("heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -ایک"); } } // give back what we got return $metadata; } //dont forget to delete the avifs if the attachments are deleted function jps_delete_avif($منسلک_اید) { $all_images = get_interedia_image_s سائز($منسلک_اید); ہر ایک کے لئے($all_images بطور $ Every_img) { $ہر ایک_مگ_ڈیٹ = ڈبلیو پی پی_جیٹ_ٹیچمنٹ_ییمج_ ایس سی آر($Att_id,$ہر_میگ); $Every_img_path = ABSPATH.'wp-content'.substr($ہر_میگ_ڈیٹ[0],strpos($ہر_میگ_ڈیٹ[0],"/اپ لوڈز /")).'.avif'; شیل_کسیک("rm -f $ ہر_میگ_پاتھ"); } } ADD_ACTION( 'ڈیلیٹ_ٹچمنٹ', '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( $میٹا ڈیٹا, $منسلک_اید ) { // get filepath from id $filepath= get_attached_file($منسلک_اید); // is the file an svg if(pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="SVG") { // اگر ایسا ہے, run compression of it using zopfli and brotli shell_exec("zopfli --gzip $ filepath"); شیل_کسیک("brotli --best --output = $ filepath.br $ filepath"); } // give back what we got return $metadata; }
نوٹ کہ آپ کو اپنے نینگس تشکیل میں gzip_static اور brotli_static فعال کرنے کی ضرورت ہوگی.
ایک نئے ورژن کیلئے خود مرتب کریں
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!
dnf install x265 x265-devel svt-av1 export CXXFLAGS="$CXXFLAGS -FPIC" cd ~ git clone https://aomedia.googlesource.com/aom mkdir -p aom_build cd aom_build cmake ~/aom -DBUILD_SHARED_LIBS=true make sudo make install cp ./libaom.so.3 /usr/bin/local/libaom.so.3 cd ~ export PKG_CONFIG_PATH=~/aom_build/ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/aom_build/ export LD_LIBRARY_PATH git clone --recurse-submodules --recursive https://github.com/strukturag/libheif.git cd libheif ./autogen.sh ./configure make sudo make install LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/bin/ export LD_LIBRARY_PATH
ایک بار جب آپ یہ کرلیتے ہیں, make sure it works by running php -a
and running the following command
شیل_کسیک("/usr / مقامی / بن / 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( $میٹا ڈیٹا, $منسلک_اید ) { // get filepath from id $filepath= get_attached_file($منسلک_اید); // is the file a png or jpeg if(pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="JPG" || pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="jpeg" || pathinfo($فائل پاتھ, PATHINFO_EXTENSION)=="PNG") { // اگر ایسا ہے, run compression of the main file to avif shell_exec("/usr / مقامی / بن / heif-enc $ filepath -o $ filepath.avif -q 50 -ایک"); $حصوں = preg_split('~ /(?=[^ /]*$)', $فائل پاتھ); // Then run compression of the thumbnails to avif $thumbpaths = $metadata['سائز']; ہر ایک کے لئے ($thumbpaths as $key => $انگوٹھے) { $thumbpath = $ انگوٹھا['فائل']; $thumbfullpath = $ حصے[0] . "/" . $انگوٹھے; شیل_کسیک("/usr / مقامی / بن / heif-enc $ thumbfullpath -o $ thumbfullpath.avif -q 50 -ایک"); } } // give back what we got return $metadata; }
“Hi James I realise it has been a long while, but I just checked this on windows 11 (build 23H2)…”