Credit : Logo officiel
Optimiser les performances de WordPress
Optimiser les performances de WordPress
Un client e-commerce me contacte en panique : son site WooCommerce charge en 8.4 secondes selon GTmetrix, son taux de conversion s'effondre, et Google le declasse. Je me connecte au VPS Debian 12 et je vois le probleme tout de suite : aucun cache objet, MySQL qui transpire, 4 plugins de cache concurrents installes, des images en PNG de 4 Mo, et un OPcache desactive. En une apres-midi de boulot methodique, on est passe a 1.2 seconde de chargement et un score PageSpeed de 94. Le site marchait pas mieux le lendemain, il marchait dix fois mieux.
Un WordPress lent fait fuir les visiteurs et plombe ton SEO en 2026. Voici les optimisations concretes que j'applique systematiquement, dans l'ordre, sur les sites WP 6.5+ que je gere.
Mesurer avant d'optimiser
Avant toute chose : tu mesures. Sinon tu optimises a l'aveugle.
# TTFB et temps total
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://monsite.fr
# Headers de cache
curl -I https://monsite.fr
Note tes valeurs initiales. Apres chaque optimisation, remesure. Cible : TTFB sous 200ms, temps total sous 1.5s.
Cote outils, j'utilise :
- PageSpeed Insights (Google) : score Web Vitals, ce qui compte pour le SEO
- GTmetrix : waterfall detaille des requetes
- WebPageTest : tests depuis differentes localisations
- WP-CLI :
wp profile stagepour identifier les hooks lents
1. Cache objet avec Redis
Le plus gros gain de perf que tu peux faire. Redis stocke en memoire les resultats des requetes SQL et les options WordPress, evitant les acces disque a la base.
# Installation sur Debian 12
apt install redis-server php8.3-redis -y
systemctl enable --now redis-server
systemctl restart php8.3-fpm
# Verifier
redis-cli ping
# PONG
Configuration Redis dans /etc/redis/redis.conf :
maxmemory 256mb
maxmemory-policy allkeys-lru
bind 127.0.0.1 ::1
requirepass MotDePasseRedisIci
Dans wp-config.php, AVANT la ligne /* That's all, stop editing! */ :
define('WP_CACHE_KEY_SALT', 'monsite.fr:');
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', 'MotDePasseRedisIci');
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
Installe le plugin :
cd /var/www/monsite.fr
wp plugin install redis-cache --activate
wp redis enable
wp redis status
Sortie typique apres activation :
# Status: Connected
# Client: PhpRedis (v6.0.0)
# PhpRedis: 6.0.0
# Predis: Not loaded
# Credis: Not loaded
# PHP Version: 8.3.7
# Plugin Version: 2.5.4
# Redis Version: 7.0.15
# Multisite: No
# Metrics: Enabled
Sur un site WooCommerce que je gere, le TTFB est passe de 1.2s a 0.28s juste avec Redis. Gain immediat.
2. Cache de pages avec WP Super Cache ou cache Nginx
Le cache objet Redis traite les requetes SQL. Le cache de pages va plus loin : il sert directement le HTML statique sans meme demarrer PHP.
Option A : WP Super Cache
wp plugin install wp-super-cache --activate
Pour Nginx, ajoute ces regles dans ton vhost :
set $cache_uri $request_uri;
# Pas de cache pour admin, login, AJAX
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*\.php|/feed/|sitemap(_index)?\.xml") {
set $cache_uri 'null';
}
# Pas de cache pour les utilisateurs connectes
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
set $cache_uri 'null';
}
# Pas de cache pour les requetes POST
if ($request_method = POST) {
set $cache_uri 'null';
}
location / {
try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args;
}
Option B : FastCGI cache Nginx (mon prefere)
Dans /etc/nginx/nginx.conf, bloc http :
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=WORDPRESS:100m max_size=1g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
Dans le vhost :
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*\.php|/feed/|sitemap(_index)?\.xml") { set $skip_cache 1; }
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") { set $skip_cache 1; }
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_valid 404 1m;
add_header X-FastCGI-Cache $upstream_cache_status;
}
Le header X-FastCGI-Cache te permet de verifier dans la console reseau du navigateur si la page vient du cache (HIT) ou non (MISS, BYPASS).
3. Optimisation des images
Les images representent 60 a 80% du poids d'une page WordPress typique. Enorme.
Conversion automatique en WebP/AVIF
WebP economise 25 a 35% par rapport au JPEG. AVIF va encore plus loin (50%) mais a moins de support navigateur.
apt install webp libavif-bin -y
# Plugin de conversion automatique
wp plugin install webp-converter-for-media --activate
# Ou
wp plugin install imagify --activate
Dans Nginx, sers automatiquement le WebP si supporte :
location ~* \.(jpe?g|png)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
# Map en haut du fichier nginx.conf
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
Lazy loading natif
WordPress 5.5+ ajoute loading="lazy" automatiquement. Verifie que c'est actif et n'installe pas de plugin de lazy load supplementaire (double traitement).
// Dans functions.php du theme enfant
add_filter('wp_lazy_loading_enabled', '__return_true');
Tailles adaptatives (srcset)
WP genere automatiquement plusieurs tailles. Verifie qu'elles sont bien servies :
<img src="image-300x200.jpg"
srcset="image-300x200.jpg 300w, image-768x512.jpg 768w, image-1200x800.jpg 1200w"
sizes="(max-width: 768px) 100vw, 50vw" />
4. CDN avec Cloudflare
Un CDN distribue tes fichiers statiques depuis des serveurs proches des visiteurs. Le plan gratuit Cloudflare est largement suffisant pour 90% des sites.
Config en 5 etapes :
- Ajoute ton domaine sur Cloudflare
- Modifie les nameservers chez IONOS pour pointer vers Cloudflare
- Mode SSL : "Full (strict)" (PAS "Flexible", ca casse les redirections)
- Active "Auto Minify" pour CSS/JS
- Active "Brotli" et "Early Hints"
Regles de cache recommandees (dans Page Rules ou Cache Rules) :
monsite.fr/wp-content/* -> Cache Level: Cache Everything, Edge TTL: 1 month
monsite.fr/wp-includes/* -> Cache Level: Cache Everything, Edge TTL: 1 month
monsite.fr/wp-admin/* -> Cache Level: Bypass
Installe aussi le plugin Cloudflare officiel pour purger le cache automatiquement quand tu publies un article.
5. Nettoyage de la base de donnees
Une base WordPress accumule des dechets : revisions, transients, commentaires spam, options orphelines.
cd /var/www/monsite.fr
# Voir le poids actuel
wp db size --tables
# Supprimer toutes les revisions
wp post delete $(wp post list --post_type=revision --format=ids) --force
# Limiter les revisions futures (dans wp-config.php)
# define('WP_POST_REVISIONS', 5);
# Vider la corbeille
wp post delete $(wp post list --post_status=trash --format=ids) --force
# Transients expires
wp transient delete --expired
# Spam
wp comment delete $(wp comment list --status=spam --format=ids) --force
# Optimiser les tables
wp db optimize
# Verifier l'integrite
wp db check
Mets ca dans un cron hebdomadaire :
# /etc/cron.d/wp-cleanup
0 4 * * 0 www-data cd /var/www/monsite.fr && wp transient delete --expired && wp db optimize >> /var/log/wp-cleanup.log 2>&1
6. Optimisations PHP et OPcache
OPcache compile et garde en memoire les fichiers PHP. Sans ca, ton site est ralenti par un facteur 3 a 5.
Dans /etc/php/8.3/fpm/conf.d/10-opcache.ini :
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.fast_shutdown=1
opcache.save_comments=1
opcache.jit=1255
opcache.jit_buffer_size=128M
Regle aussi PHP-FPM dans /etc/php/8.3/fpm/pool.d/www.conf :
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
request_terminate_timeout = 60
systemctl restart php8.3-fpm
Verifie qu'OPcache est actif :
php -i | grep -i opcache.enable
# opcache.enable => On => On
7. Compression et HTTP/2
Dans Nginx, active gzip et Brotli (cf article reverse proxy). Active aussi HTTP/2 :
listen 443 ssl http2;
HTTP/2 multiplexe les requetes sur une seule connexion TCP. Sur un site avec beaucoup de petits assets, le gain est immediat.
Erreurs courantes et leur fix
Redis status: Disconnected apres install
Cause : extension PHP redis non installee, password mal configure, ou Redis pas demarre.
Fix :
php -m | grep redis
systemctl status redis-server
redis-cli -a 'MotDePasseRedisIci' ping
# Doit repondre PONG
Le site reste en cache meme apres modification
Cause : le cache de pages (Nginx ou plugin) sert toujours l'ancienne version.
Fix :
# Vider WP cache + Redis
wp cache flush
wp redis flush
# Vider FastCGI cache Nginx
rm -rf /var/cache/nginx/fastcgi/*
systemctl reload nginx
Internal Server Error apres activation OPcache
Cause : opcache.memory_consumption trop bas, ou conflit avec un autre extension PHP.
Fix : passe a 256M minimum, regarde les logs /var/log/php8.3-fpm.log et journalctl -u php8.3-fpm -n 50.
Mixed content errors apres CDN
Cause : Cloudflare en mode "Flexible SSL" alors que ton serveur est en HTTPS.
Fix : passe en "Full (strict)" dans Cloudflare > SSL/TLS, et execute wp search-replace 'http://' 'https://' --skip-columns=guid pour reparer les URLs en base.
Allowed memory size exhausted dans wp-admin
Cause : limite memoire PHP trop basse pour WP avec plein de plugins.
Fix : dans wp-config.php ajoute define('WP_MEMORY_LIMIT', '256M'); et dans /etc/php/8.3/fpm/php.ini, mets memory_limit = 256M.
8. Optimisation MySQL/MariaDB
La base de donnees est souvent le maillon faible. Sur un site gros consommateur, configure correctement MariaDB dans /etc/mysql/mariadb.conf.d/50-server.cnf :
[mysqld]
# Cache de requetes (deprecated en MySQL 8 mais utile en MariaDB)
query_cache_type = 1
query_cache_size = 64M
query_cache_limit = 2M
# InnoDB (le moteur principal de WP)
innodb_buffer_pool_size = 1G # 50-70% de la RAM dispo
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# Connexions
max_connections = 150
thread_cache_size = 16
# Tables temp
tmp_table_size = 64M
max_heap_table_size = 64M
# Logs
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
systemctl restart mariadb
Le slow query log est super pour identifier les requetes qui plombent ton site. Lis-le regulierement avec pt-query-digest (Percona Toolkit).
9. Limiter la pollution des plugins
Audit regulier des plugins. Sur un site type 25 plugins, en general 5-8 sont desactivables sans rien casser. Chaque plugin ajoute des hooks, des assets CSS/JS, parfois des requetes SQL. Le combo gagnant :
# Lister tous les plugins actifs
wp plugin list --status=active
# Identifier les plugins lourds
wp plugin list --status=active --fields=name,update,version
# Tester en desactivant temporairement
wp plugin deactivate plugin-suspect
# Mesure les gains
wp plugin activate plugin-suspect
Utilise Query Monitor pendant le dev pour voir quels plugins generent le plus de requetes/temps. Souvent c'est un plugin de social sharing ou de related posts qu'on n'utilise meme plus vraiment.
Pour aller plus loin
- Configurer Redis comme cache WordPress : guide detaille pour aller plus loin sur le tuning Redis.
- Mettre en place un CDN gratuit avec Cloudflare : tout sur la config Cloudflare avancee.
- Configurer la compression Gzip avec PHP : details sur la compression cote applicatif.
- Optimiser PrestaShop : performances et SEO : pour comparer les approches WP vs PrestaShop.
- Securiser WordPress : guide complet anti-hack : un site rapide doit aussi etre securise.
Le combo gagnant
Redis pour le cache objet, FastCGI cache Nginx pour les pages, OPcache + JIT pour PHP, images en WebP avec lazy loading natif, Cloudflare devant : c'est la stack qui me permet de mettre quasi systematiquement les sites WordPress sous la seconde de chargement. Pas besoin de migrer vers un truc exotique, WordPress 6.5 sur PHP 8.3 + Nginx, bien configure, c'est rapide. Tres rapide.
MAJ 2026 : surveille aussi du cote des Core Web Vitals avec INP qui a remplace FID dans le score Google. Le tuning FastCGI cache et Redis aide enormement sur cette metrique.