Comment afficher des images au format WebP dans WordPress

WebP est un format de fichier pour les images qui offre une compression avec ou sans perte. Si vous utilisez WordPress, vous pouvez facilement servir toutes les images en WebP avec quelques modifications de base.

La plupart des navigateurs prennent en charge WebP

  • Selon les données de Caniuse, WebP est actuellement pris en charge par 94 % des navigateurs, dont Apple Safari, Google Chrome, Opera, Mozilla Firefox, Microsoft Edge et les navigateurs Android.
  • Vous pouvez toujours utiliser le format JPEG/PNG comme solution de repli pour les navigateurs non pris en charge.

Principaux avantages de l’utilisation d’une image au format WebP

  • Par rapport à la taille d’une image normale JPG ou PNG, une image de même dimension WebP peut être servie dans de petits octets. Par conséquent, les images se chargeront plus rapidement. Cela sera particulièrement utile pour les utilisateurs mobiles.
  • Servir des images de qualité en quelques octets, ce qui permet d’économiser considérablement la bande passante.
  • Gardez votre site web à jour avec les dernières tendances. Ne perdez pas de conversation à cause d’un problème de lenteur de chargement du bull-cart.
  • WebP est recommandé par les développeurs de Google. Il vous aide à passer la recommandation « servir les images dans le format next-gen » de Google PageSpeed Insight.

C’est ainsi que vous pouvez servir WebP pour un site WordPress.

Servez WebP dans NGINX en utilisant le plugin ShortPixel

Le plugin ShortPixel peut aider à l’optimisation des images en masse avec la conversion WebP et le service selon le support du navigateur. Le plus intéressant est que ce plugin effectue le traitement sur son serveur, ce qui ne ralentit pas votre site.

shortpixel webp
  • Si votre WordPress est hébergé sur un serveur Apache, vous pouvez utiliser la réécriture .htaccess.
  • Dans le cas de NGINX, vous pouvez utiliser la règle de réécriture ci-dessous avec l’aide du support de l’hébergement.
  • Ce plugin est également compatible avec le plugin WP Rocket cache.

Tout d’abord, ajoutez ce bloc avant la directive serveur :

map $http_accept $webp_suffix {
    default "";
    "~*webp" ".webp";
}

Redémarrer le serveur NGINX

service nginx restart

Ensuite, ajoutez ce bloc à l’intérieur de la directive serveur :

location ~* ^(/wp-content/.+)\.(png|jpe?g)$ {
    set $base $1;
    set $webp_uri $base$webp_suffix;
    set $webp_old_uri $base.$2$webp_suffix;
    set $root "<<CHEMIN COMPLET DU PARENT wp-content>>";
    root $root;
    add_header Vary Accept;
    if ( !-f $root$webp_uri ) {
        add_header X_WebP_SP_Miss $root$webp_uri;
    }
    try_files $webp_uri $webp_old_uri $uri =404;
}

Le placement est important. Alors ajoutez-le soigneusement.

Utilisation du plugin WebP Express dans NGINX

  • Installez et activez WebP Express, un plugin gratuit. Un grand merci au développeur.
  • Mode de fonctionnement : Réponses d’images variées.
  • Portée : Téléchargement seulement.
image
  • Exécuter Bulk Convert
image 2

Pour une meilleure organisation du code, je recommanderais de le placer d’abord dans le répertoire /etc/nginx/ avec le nom webp.conf puis de l’inclure dans le bloc principal du serveur.

Entrez la commande suivante

cd /etc/nginx/ && nano webp.conf
  • Collez le code ci-dessous en faisant un clic droit dans l’éditeur nano du terminal SSH.
# WebP Express rules
# --------------------
location ~* ^/?wp-content/.*\.(png|jpe?g)$ {
  add_header Vary Accept;
  expires 365d;
  if ($http_accept !~* "webp"){
    break;
  }
  try_files
    /wp-content/webp-express/webp-images/doc-root/$uri.webp
    $uri.webp
    /wp-content/plugins/webp-express/wod/webp-on-demand.php?xsource=x$request_filename&wp-content=wp-content
    ;
}

# Route requests for non-existing webps to the converter
location ~* ^/?wp-content/.*\.(png|jpe?g)\.webp$ {
    try_files
      $uri
      /wp-content/plugins/webp-express/wod/webp-realizer.php?wp-content=wp-content
      ;
}
# ------------------- (WebP Express rules ends here)
  • Appuyez sur CTRL+O et sur la touche Entrée pour enregistrer.

Maintenant, visitez le bloc du serveur principal.

cd /etc/nginx/sites-available && ls

Editez votre fichier de configuration, et mettez include webp.conf ; comme indiqué ci-dessous.

# General
server {
    listen         80;
    server_tokens off;
    return 301 https://$host$request_uri;
}
server {
server_tokens off;
root /var/www/html;
index index.php index.html index.htm;
server_name .gulshankumar.net;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/comodo/cert.pem;
        ssl_certificate_key /etc/comodo/private.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AES128';

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;


# La règle WebP Express va ici

include webp.conf;

# WebP Rule end

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

Rechargez ou redémarrez le NGINX.

service nginx reload

Points à noter

  • Si vous utilisez BunnyCDN, vous devez activer Vary Cache.
bunnycdn vary cache
  • Cloudflare ne prend pas en charge Vary Cache. Essayez l’approche alternative ci-dessous.

Utiliser WebP en utilisant Cloudflare CDN (sans plugin)

Si vous êtes un utilisateur de Cloudflare Pro, vous pouvez simplement activer WebP en un clic depuis l’onglet Vitesse.

cloudflare webp

Servez WebP en utilisant BunnyCDN Optimizer (sans plugin)

BunnyCDN offre des services d’optimisation qui comprennent une solution de service WebP à la volée. C’est une solution en un clic pour un coût supplémentaire de 9,5 $/mois.

bunnycdn webp

Servez WebP en utilisant le plugin JetPack

  • Il suffit d’installer et d’activer le plugin JetPack
  • Activez l’accélérateur de site.
jetpack webp

Vous pouvez remarquer une baisse de la qualité de l’image qui peut être corrigée en utilisant le filtre ci-dessous.

Servez WebP en utilisant Imagify

Imagify est un plugin d’optimisation d’image offert par WP Media, les gens derrière WP Rocket.

  • Installez et activez le plugin Imagify
  • Entrez la clé API
  • Dans les paramètres, choisissez le mode Picture tags pour une configuration rapide.
  • Alternativement, vous pouvez utiliser la règle de réécriture avec une certaine configuration du serveur comme décrit ici. Avec Apache, le processus d’ajout de code .htaccess sera automatique mais avec NGINX, vous devez le faire manuellement.
imagify plugin webp settings

WebP à JPG

WebP peut dégrader un peu la qualité de l’image dans certains cas. Si vous souhaitez revenir de WebP à JPG, il vous suffit de suivre les étapes suivantes.

  • Désactiver et supprimer le plugin relatif à WebP.
  • Suppression de son paramétrage dans le fichier de configuration (.htaccess)
  • Supprimez en masse les fichiers .webp et économisez de l’espace disque.
find . -type f -name "*.webp*" -delete

Si vous souhaitez convertir un fichier WebP en JPG, vous pouvez utiliser l’outil disponible sur CloudConvert.


Méthode manuelle sans plugin

Cette section n’a qu’un but informatif.

Étape 1 : Ajouter le format WebP dans un document HTML

Tout d’abord, vous devez convertir toutes vos images en WebP et conserver votre ancien format d’image comme solution de repli. Il existe un plugin comme Optimus qui peut faire ce travail automatiquement. Mais, je vais vous montrer une autre façon facile de le faire manuellement.

  1. Allez sur ce site image.online-convert.com/convert-to-webp
  2. Collez votre lien d’image et cliquez sur convertir. Vos images au format WebP seront téléchargées
  3. Maintenant, éditez le code HTML brut où votre image normale apparaît.c

Disons qu’au début, le code HTML de votre image était le suivant

<img src="https://www.gulshankumar.net/wp-content/uploads/2016/09/webplogo.png" alt="gulshan kumar" width="186" height="66" />

Vous devez envelopper le code ci-dessus avec un peu plus de balises HTML.

<picture>
	<source srcset="https://www.gulshankumar.net/wp-content/uploads/2016/09/webplogo.webp" type="image/webp" />
	<img src="https://www.gulshankumar.net/wp-content/uploads/2016/09/webplogo.png" alt="gulshan kumar" width="186" height="66" />
</picture>

Maintenant, votre document HTML est prêt à servir des images au format WebP.
Étape 2 : Configurer les paramètres du serveur
Encore une étape, vous devez configurer certains paramètres du serveur web Apache via .htacccess afin que le navigateur et le serveur web puissent traiter cette image comme toutes les autres.

Votre serveur d’hébergement Web peut ne pas savoir de quel type mime ce type de format d’image il doit servir. Il doit donc ajouter le type mime approprié. En outre, il serait utile de configurer l’en-tête d’expiration pour la mise en cache.

# Serve Images with correct Mime Type
AddType image/webp .webp

# Setup Cache
ExpiresActive On
ExpiresByType image/webp A2592000

Remarque : assurez-vous que vous utilisez WordPress 5.8 ou une version ultérieure.

Si vous utilisez WordPress avant la version 5.8, il ne prend pas en charge le téléchargement d’images au format WebP. Vous pouvez obtenir l’erreur « Ce type de fichier n’est malheureusement pas autorisé pour des raisons de sécurité » lors du téléchargement d’images .webp.

Vous devez donc résoudre ce problème en ajoutant ce code dans le fichier functions.php de votre thème. Il serait utile de télécharger vos images directement depuis le tableau de bord de WordPress > option Media.

function webp_upload_mimes( $existing_mimes ) {
	// add webp to the list of mime types
	$existing_mimes['webp'] = 'image/webp';

	// return the array back to the function with our added mime type
	return $existing_mimes;
}
add_filter( 'mime_types', 'webp_upload_mimes' );

Terminé.

Si vous avez besoin d’aide, veuillez consulter la section des commentaires. Je me ferai un plaisir de vous aider.

Notes supplémentaires

  • Si vous êtes un utilisateur de Cloudways, vous ne pouvez pas fournir WebP avec une réécriture .htaccess car ils utilisent NGINX spécifiquement pour les fichiers statiques. Dans ce cas, vous avez deux possibilités. Demandez à l’équipe d’hébergement de modifier le fichier de configuration pour vous ou utilisez JavaScript ou une solution CDN tierce partie telle que Bunny ou CF.

Autres lectures
Si vous êtes curieux d’en savoir plus sur WebP, veuillez consulter ces liens.

Merci.

Laisser un commentaire

38 réflexions au sujet de “Comment afficher des images au format WebP dans WordPress”

  1. The problem with the suggested HTML implementation is that Chrome will make two requests, one for WEBP and another one for JPEG resulting in double requests and increasing the page load time.

    Répondre
    • Hey dear,

      It doesn’t create two requests(as you are saying) instead it automatically serve only one type image format either WebP or JPEG according to HTTP accept type.

      I’d suggest please try one more time and look carefully at Network Timeline in the browser console. If you see there are double requests, please email me your HTML code and timeline screenshot also. I’d love to review it. I believe it should work fine for you too.

      Thanks & Regards,
      Gulshan

      Répondre
      • I installed the code into the functions.php. And as you said it did allow me to upload in my WP theme. The problem is that the image doesn’t allow cropping so it won’t allow me to use it on the site.

        Répondre
  2. I haven’t added anything except the last code from your post in function.php to support Webp format on all of future media uploads. Do I need to add any thing else ? or will it create any kind of issue for users whose browsers are yet unsupported to this format?
    anyway keep up the good work 😉

    Répondre
    • That’s all. Now you can easily upload webp directly in your WordPress Dashboard. No extra things to do. Just feel free to use it with picture HTML tag. So, it will support for all browsers, without any issues. Thanks

      Répondre
  3. Hi Gulshan,

    Even after putting the code snippet in the function.php file.

    I still have the same error message when I try to upload webp format. The message is « sorry this file type is not permitted for security reasons ».

    Can you help fix this?

    Thanks.

    Martin

    Répondre
    • Hello Martin,

      At my end it’s working fine. For a demo, I have sent a quick video on your email. Please check and revert back if I can help with any thing else.

      Thanks

      Répondre
  4. Hi..Just wondering if i need to edit each image tag or is there somewhere in my theme templates this could be done.
    Any guidence would be great.
    Thanks
    Mark

    Répondre
  5. Hello Gulshan,

    Thanks for sharing this article.

    I did follow the steps mentioned in here in this format.

    But the image is not appearing on Firfox, and IE. Did I miss any thing in here.

    Please suggest.

    Répondre
  6. Hi,

    I am not quite clear on where this needs to be inserted. I am looking to Optimise my header image to Webp. Is there a video or screenshot based write up on how I can include this?

    Would really appreciate the help

    Regards
    Shwetha

    Répondre
  7. I have tried this method to enable WebP format images on my site, but I am encountering some unknown error. My site showing a low score on google page speed insight.

    Répondre
    • May I know please which specific method you have tried? Also, please share the screenshot of error. I will try my best to help you.

      Répondre
  8. Hey Gulshan Kumar ,

    Awesome post with good information. It is my first time commenting on your blog post and am glad to say that you have done a fabulous work and provided helpful & easy tips to serve webp format images in WordPress. I really like and appreciate the way you have explained the things in such a step-by-step process making the concept very clear and easy to understand. while scrolling through your blog post i have noticed that you have also discussed about the major benefits of using webp format image that are also providing good understanding. You have explained all the vital things in an easy language that are true enough to understand and educate the readers.

    After going through this complete guide i really gain ideas and am sure that this post is definitely going to help lots of people & especially WordPress-users to sort out their query. Good work and keep sharing more similar post.

    Eventually thanks for sharing your knowledge, ideas and such an informative post.

    Regards
    -Aadarsh

    Répondre
  9. Hi, this is a good article, but
    It is better to install the plugin or put the code directly for webp
    This way, each image does not create two urls. Does it cause a problem in the SEO site?

    Répondre
  10. I have a question about ShortPixel method.

    I use Plesk panel with NGINX
    There is a section called Additional nginx directives
    Here you can specify the settings for the nginx reverse proxy server that runs in front of Apache. Your directives will override the server-wide nginx configuration. For example, you may want to change the connection timeout or to pack requests with gzip. Use the same syntax as you use for nginx.conf. For example, if you want to pack all the proxied requests with gzip, add the line: ‘gzip_proxied any;’.

    https://i.imgur.com/OLWu9bJ.png

    can i add codes there i dont know?

    map $http_accept $webp_suffix {
    default «  »;
    « ~*webp » « .webp »;
    }

    location ~* ^(/wp-content/.+).(png|jpe?g)$ {
    set $base $1;
    set $webp_uri $base$webp_suffix;
    set $webp_old_uri $base.$2$webp_suffix;
    set $root « <> »;
    root $root;
    add_header Vary Accept;
    if ( !-f $root$webp_uri ) {
    add_header X_WebP_SP_Miss $root$webp_uri;
    }
    try_files $webp_uri $webp_old_uri $uri =404;

    You used these sentences!
    before the server directive and inside directive.
    I read your Installing WordPress at NGINX topic so
    If i try to add these from codes is this right?

    map $http_accept $webp_suffix {
    default «  »;
    « ~*webp » « .webp »;
    }
    server {
    listen 80;
    return 301 https://$host$request_uri;
    }
    server {

    location ~* ^(/wp-content/.+).(png|jpe?g)$ {
    set $base $1;
    set $webp_uri $base$webp_suffix;
    set $webp_old_uri $base.$2$webp_suffix;
    set $root « <> »;
    root $root;
    add_header Vary Accept;
    if ( !-f $root$webp_uri ) {
    add_header X_WebP_SP_Miss $root$webp_uri;
    }
    try_files $webp_uri $webp_old_uri $uri =404;
    }
    # Document Root
    root /var/www/html;
    index index.php index.html index.htm;
    server_name .example.com;
    client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 20m;
    ssl_ciphers ‘TLS13+AESGCM+AES128:EECDH+AES128’;

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location / {
    try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* .php$ {
    if ($uri !~ « ^/uploads/ ») {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }
    location = /favicon.ico {
    log_not_found off;
    access_log off;
    }

    location = /robots.txt {
    log_not_found off;
    access_log off;
    allow all;
    }

    location ~* .(css|gif|svg|ico|jpeg|jpg|js|png)$ {
    expires 1y;
    log_not_found off;
    }

    # Enable Gzip compression.
    gzip on;

    # Disable Gzip on IE6.
    gzip_disable « msie6 »;

    # Allow proxies to cache both compressed and regular version of file.
    # Avoids clients that don’t support Gzip outputting gibberish.
    gzip_vary on;

    # Compress data, even when the client connects through a proxy.
    gzip_proxied any;

    # The level of compression to apply to files. A higher compression level increases
    # CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
    gzip_comp_level 5;

    # Compress the following MIME types.
    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rss+xml
    application/vnd.geo+json
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/bmp
    image/svg+xml
    image/x-icon
    text/cache-manifest
    text/css
    text/plain
    text/vcard
    text/vnd.rim.location.xloc
    text/vtt
    text/x-component
    text/x-cross-domain-policy;
    }

    Is this right?
    And what do you think about plesk how i use webp at plesk?
    Thanks

    Répondre
  11. I didn’t try the webp format as of now in WordPress. But now after reading this post I will try to implement it. I will compare the image quality from other formats as well. Thank you for sharing this article.

    Répondre