Pourquoi votre site WordPress est lent et comment Next.js le résout
Traduire l'article markdown en français
J'ai audité des centaines de sites WordPress au fil des années, et la conversation commence toujours de la même manière : « Nous avons installé un plugin de mise en cache mais nos scores sont toujours terribles. » La vérité que personne dans l'écosystème WordPress ne veut admettre, c'est que la plupart des problèmes de performance ne sont pas résolus par les plugins. Ils sont architecturaux. WordPress a été construit en 2003 pour afficher des articles de blog avec PHP. Nous sommes en 2025, et nous lui demandons d'alimenter des sites marketing complexes, des plateformes de commerce électronique et des applications web — tout en voyant les Core Web Vitals de Google déterminer de plus en plus si quelqu'un trouve réellement votre contenu.
Cet article explique précisément pourquoi les sites WordPress sont lents, relie chaque problème aux métriques Core Web Vitals qui en souffrent, et vous montre comment une architecture headless Next.js les résout à la racine. Pas avec des pansements. À la racine.
Table des matières
- Comprendre les Core Web Vitals en 2025
- Pourquoi WordPress est architecturalement lent
- Plugin Bloat : le tueur de performance silencieux
- Problèmes de requête de base de données que les plugins ne peuvent pas résoudre
- Hébergement WordPress : vous payez probablement trop cher pour la médiocrité
- Comment Next.js corrige chaque Core Web Vital
- L'architecture headless : WordPress en tant que CMS, Next.js en tant que frontend
- Repères de performance réels : WordPress vs Next.js
- Chemin de migration : de WordPress monolithique à Next.js headless
- FAQ

Comprendre les Core Web Vitals en 2025
Google a mis à jour ses Core Web Vitals en mars 2024, remplaçant le délai jusqu'à la première entrée (FID) par le délai jusqu'à la prochaine peinture d'interaction (INP). Ce changement est plus important que la plupart des gens ne le réalisent. Voici les quatre métriques qui déterminent la note de performance de votre site :
| Métrique | Ce qu'elle mesure | Bon | Nécessite une amélioration | Mauvais |
|---|---|---|---|---|
| LCP (Largest Contentful Paint) | Vitesse de chargement de votre contenu principal | ≤ 2,5 s | 2,5 s – 4,0 s | > 4,0 s |
| INP (Interaction to Next Paint) | Réactivité aux entrées de l'utilisateur | ≤ 200 ms | 200 ms – 500 ms | > 500 ms |
| CLS (Cumulative Layout Shift) | Stabilité visuelle pendant le chargement | ≤ 0,1 | 0,1 – 0,25 | > 0,25 |
| TTFB (Time to First Byte) | Temps de réponse du serveur | ≤ 800 ms | 800 ms – 1800 ms | > 1800 ms |
Selon le rapport Chrome UX de début 2025, seulement 42 % des origines WordPress franchissent tous les seuils des trois Core Web Vitals. Comparez cela à 67 % pour les origines alimentées par Next.js. Ce n'est pas une différence marginale — c'est une ligue différente.
Pourquoi ces métriques comptent réellement
Google a été clair : les Core Web Vitals sont un signal de classement. Mais au-delà du SEO, ces métriques sont directement corrélées aux taux de conversion. Vodafone a découvert qu'une amélioration de 31 % du LCP a entraîné une augmentation de 8 % des ventes. Les données internes de Shopify montrent que chaque réduction de 100 ms du temps de chargement augmente la conversion de 1,3 %.
Votre site WordPress n'est pas seulement lent. Il vous fait perdre de l'argent.
Pourquoi WordPress est architecturalement lent
Laissez-moi vous expliquer ce qui se passe quand quelqu'un visite une page WordPress typique :
- Recherche DNS → résout votre domaine
- Établissement d'une poignée de main TCP/TLS → établit une connexion sécurisée
- La requête atteint le serveur → Apache/Nginx la reçoit
- PHP amorce WordPress → charge
wp-config.php, initialise le noyau de WordPress - Initialisation des plugins → chaque plugin actif se raccorde à
init,wp_loaded, etc. - Le thème se charge →
functions.phps'exécute, la hiérarchie des modèles se résout - Les requêtes de base de données s'exécutent → WP_Query s'exécute, souvent 30-100+ requêtes par page
- PHP affiche le HTML → les fichiers de modèle génèrent la page complète
- HTML envoyé au navigateur → enfin, la réponse commence
- Le navigateur analyse le HTML → découvre CSS, JS, polices, images
- Les ressources bloquant le rendu se chargent → les feuilles de style de 15 plugins différents
- La page se rend enfin → l'utilisateur voit le contenu
Les étapes 4 à 9 se produisent sur chaque requête non mise en cache. C'est PHP qui analyse 200+ fichiers, exécute des dizaines de requêtes de base de données et génère du HTML — tout avant que le navigateur n'obtienne un seul octet.
Le problème de PHP
PHP 8.3 est nettement plus rapide que PHP 7.x, et la plupart des hébergeurs WordPress le supportent maintenant. Mais même avec PHP 8.3 et OPcache activé, vous exécutez toujours un processus synchrone et bloquant. Le noyau de WordPress seul charge environ 100 000 lignes de code PHP à chaque requête. Ajoutez WooCommerce et vous êtes au-delà de 400 000 lignes.
Voici le truc : les plugins de mise en cache comme WP Super Cache ou W3 Total Cache fonctionnent en court-circuitant ce processus — ils servent à la place un fichier HTML pré-généré. Mais ils introduisent leur propre complexité, cassent le contenu personnalisé, et ne peuvent toujours pas corriger ce qui se passe dans le navigateur.
Le problème du thème
La plupart des thèmes WordPress sont construits pour la flexibilité, pas la performance. Un thème comme Avada, Divi ou Elementor charge son framework CSS et JavaScript entier sur chaque page, que vous utilisiez ces fonctionnalités ou non. J'ai vu des sites Elementor charger 2,5 Mo de CSS et 1,8 Mo de JavaScript sur un simple article de blog.
<!-- Head typique de WordPress sur un site page-builder -->
<link rel="stylesheet" href="/wp-content/plugins/elementor/assets/css/frontend.min.css">
<link rel="stylesheet" href="/wp-content/plugins/elementor-pro/assets/css/frontend.min.css">
<link rel="stylesheet" href="/wp-content/themes/hello-elementor/style.css">
<link rel="stylesheet" href="/wp-content/themes/hello-elementor/theme.min.css">
<link rel="stylesheet" href="/wp-content/plugins/contact-form-7/includes/css/styles.css">
<link rel="stylesheet" href="/wp-content/plugins/woocommerce/assets/css/woocommerce.css">
<!-- ... 12 autres feuilles de style -->
Chacune d'elles est une ressource bloquant le rendu. Votre LCP ne peut pas se produire tant que tout cela n'est pas téléchargé et analysé.
Plugin Bloat : le tueur de performance silencieux
Le site WordPress moyen exécute 20-30 plugins. J'en ai vu avec 70+. Chaque plugin peut potentiellement :
- Ajouter ses propres fichiers CSS et JS (souvent sur chaque page, même où ils ne sont pas utilisés)
- Enregistrer des crochets WordPress qui s'exécutent à chaque requête
- Exécuter ses propres requêtes de base de données
- Charger ses propres fichiers PHP lors de la phase d'amorçage
- Ajouter des scripts et des styles en ligne au
<head>
Un exemple concret
J'ai récemment audité un site marketing exécutant WordPress avec 34 plugins actifs. Voici à quoi ressemblait le filigrane du réseau :
- 47 fichiers CSS chargés sur la page d'accueil
- 38 fichiers JavaScript chargés sur la page d'accueil
- Poids total de la page : 4,7 Mo
- Requêtes totales : 127
- LCP : 6,8 secondes sur 4G
- TTFB : 2,1 secondes
Le client avait déjà installé un plugin d'optimisation (Autoptimize) et un plugin de mise en cache (LiteSpeed Cache). Même avec les deux actifs, le LCP était de 4,2 secondes. Toujours en train d'échouer.
Le problème fondamental ? Vous ne pouvez pas optimiser le problème fondamental de charger du code que vous n'utilisez pas. Minifier et combiner 47 fichiers CSS laisse toujours une énorme charge CSS qui bloque le rendu.
Le piège de la dépendance des plugins
Voici ce qui rend cela pire : les plugins dépendent d'autres plugins. Vous installez WooCommerce, puis vous avez besoin d'un plugin de passerelle de paiement, puis d'un plugin de calculatrice d'expédition, puis d'un plugin de filtre de produit. Chacun ajoute du poids. Vous ne pouvez supprimer aucun d'eux sans casser la fonctionnalité.
C'est le piège de WordPress. L'architecture encourage l'ajout de plugins pour tout, et il n'existe aucun mécanisme pour éliminer le code inutilisé.

Problèmes de requête de base de données que les plugins ne peuvent pas résoudre
WordPress utilise une seule base de données MySQL avec un schéma notoirement plat. La table wp_options est remplie d'entrées autoload='yes' à chaque requête. J'ai vu des tables wp_options avec 3 000+ lignes chargées au démarrage totalisant 8 Mo de données.
-- Vérifiez la taille de vos options chargées au démarrage
SELECT SUM(LENGTH(option_value)) as autoload_size
FROM wp_options
WHERE autoload = 'yes';
-- Si cela retourne > 1 Mo, vous avez un problème
La table wp_postmeta est un autre cauchemar. Elle stocke tout sous forme de paires clé-valeur, ce qui signifie que WordPress ne peut pas effectuer de requêtes efficaces. Vous voulez trouver tous les produits sous 50 € ? C'est une JOIN sur wp_postmeta avec une comparaison de chaîne sur un champ de texte qui stocke un nombre. Aucun index ne peut vous sauver.
Vérification du nombre de requêtes
Installez le plugin Query Monitor sur votre site WordPress et regardez le nombre de requêtes. Une page de produit WooCommerce « simple » exécute généralement 150-300 requêtes de base de données. Un article de blog avec des articles connexes, une barre latérale d'articles populaires et des miettes de pain ? Généralement 80-120 requêtes.
Comparez cela à une approche headless où votre frontend Next.js fait exactement un appel API (ou zéro, si vous utilisez la génération statique) pour obtenir toutes les données dont il a besoin.
Hébergement WordPress : vous payez probablement trop cher pour la médiocrité
Parlons d'hébergement, car c'est là que beaucoup d'argent est gaspillé.
| Type d'hébergement | Coût mensuel | TTFB typique | Peut corriger l'architecture ? |
|---|---|---|---|
| Partagé (GoDaddy, Bluehost) | 3 à 15 $ | 1,5-4,0 s | Non |
| WordPress géré (WP Engine, Flywheel) | 25 à 300 $ | 400 ms-1,2 s | Non |
| Premium géré (Kinsta, Pagely) | 35 à 600 $ | 200 ms-600 ms | Non |
| VPS/Dédié (DigitalOcean, AWS) | 20 à 500 $ | 200 ms-800 ms | Non |
| Next.js sur Vercel/Edge | 0 à 20 $ | 50-150 ms | Oui |
Remarquez cette dernière colonne. Aucune mise à niveau d'hébergement ne résout les problèmes architecturaux. Vous payez des prix premium pour faire fonctionner PHP plus rapidement, alors que la vraie solution est de ne pas exécuter PHP à chaque requête.
Kinsta facture 35 $/mois pour leur forfait de démarrage avec 25 000 visites. Le niveau gratuit de Vercel gère 100 Go de bande passante. Même le forfait Pro de Vercel à 20 $/mois vous donne un déploiement sur le réseau edge sur leur CDN mondial. Les mathématiques ne mentent pas.
Comment Next.js corrige chaque Core Web Vital
Soyons précis. Voici comment Next.js (en particulier avec l'App Router dans Next.js 14/15) traite chaque métrique :
Corriger le TTFB
Next.js vous donne plusieurs stratégies de rendu :
// Génération statique - TTFB effectivement zéro (servie depuis CDN)
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug);
return <Article post={post} />;
}
// Ceci pré-rend au moment de la construction
export async function generateStaticParams() {
const posts = await getAllPosts();
return posts.map((post) => ({ slug: post.slug }));
}
Avec la génération statique, vos pages sont des fichiers HTML pré-construits servis par des nœuds CDN edge dans le monde entier. Le TTFB chute à 50-100 ms indépendamment de l'endroit où se trouvent vos utilisateurs. Aucune exécution PHP, aucune requête de base de données, aucun traitement côté serveur au moment de la requête.
Pour le contenu dynamique, Next.js supporte ISR (Incremental Static Regeneration), qui sert des pages statiques en cache tout en revalidant en arrière-plan :
// Revalider tous les 60 secondes
export const revalidate = 60;
Corriger le LCP
Next.js inclut le composant <Image> qui gère tout ce que les plugins WordPress essaient (et échouent) de faire :
import Image from 'next/image';
export default function HeroBanner() {
return (
<Image
src="/hero.jpg"
alt="Hero banner"
width={1200}
height={600}
priority // Précharge l'image LCP
sizes="100vw"
// Génère automatiquement srcset, utilise WebP/AVIF,
// charge en différé par défaut, empêche CLS
/>
);
}
L'accessoire priority indique à Next.js de précharger l'image, améliorant directement le LCP. La négociation de format automatique sert WebP ou AVIF aux navigateurs pris en charge, réduisant la taille de l'image de 30 à 50 % par rapport à JPEG. Aucun plugin nécessaire.
Next.js élimine également le CSS bloquant le rendu via les modules CSS et l'extraction automatique de CSS critique. Seul le CSS utilisé sur une page spécifique est chargé.
Corriger l'INP
L'INP mesure la rapidité avec laquelle votre site répond aux interactions des utilisateurs. Les sites WordPress échouent l'INP en raison de :
- JavaScript lourd provenant de plugins bloquant le thread principal
- jQuery et ses plugins en concurrence pour le temps d'exécution
- Aucune scission de code — tout se charge en amont
Next.js gère cela avec la scission de code automatique. Chaque page charge uniquement le JavaScript dont elle a besoin :
// Ce composant ne se charge que lorsque l'utilisateur y fait défiler
import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
loading: () => <ChartSkeleton />,
ssr: false, // Ne rendre pas sur le serveur
});
Les composants serveur React (par défaut dans l'App Router) vont encore plus loin : les composants qui n'ont pas besoin d'interactivité envoient zéro JavaScript au navigateur. Un article de blog sans éléments interactifs ? Zéro Ko de JavaScript de composant.
Corriger le CLS
Le CLS dans WordPress provient généralement de :
- Images sans dimensions explicites
- Les annonces se chargeant tard et poussant le contenu vers le bas
- Les polices web causant FOUT/FOIT
- Les bannières injectées par les plugins apparaissant après le chargement
Next.js empêche le CLS par défaut. Le composant <Image> nécessite les dimensions (ou utilise fill avec un conteneur dimensionné). Le module next/font intègre les déclarations de police et utilise font-display: swap sans décalage de mise en page :
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function RootLayout({ children }) {
return (
<html lang="en" className={inter.className}>
<body>{children}</body>
</html>
);
}
Pas de FOUT. Aucun décalage de mise en page provenant des polices. Ça marche tout simplement.
L'architecture headless : WordPress en tant que CMS, Next.js en tant que frontend
Voici la partie que beaucoup de gens manquent : aller headless ne signifie pas abandonner WordPress. Cela signifie utiliser WordPress pour ce qu'il fait réellement bien — la gestion du contenu — tout en laissant Next.js gérer le frontend.
L'architecture ressemble à ceci :
[WordPress Admin] → [REST API / WPGraphQL] → [Frontend Next.js] → [Vercel Edge CDN]
↑ ↑
Les éditeurs de contenu Vos utilisateurs
utilisent le tableau de bord reçoivent des pages rapides
WordPress familier servies depuis le edge
Votre équipe de contenu garde son flux de travail. Vos utilisateurs obtiennent un site rapide. Vous obtenez du code propre et maintenable.
Nous faisons beaucoup de ce genre de travail dans notre pratique de développement Next.js et développement de CMS headless. Le modèle est bien établi et éprouvé au combat.
Que dire des autres options de CMS headless ?
WordPress n'est pas la seule option pour la couche de contenu. Si vous partez de zéro, les plateformes de CMS headless à usage spécifique comme Sanity, Contentful ou Storyblok sont souvent de meilleurs choix. Ils sont construits API-first, donc il n'y a pas de bagages hérités.
Mais si vous avez des années de contenu dans WordPress et une équipe formée dessus, WordPress headless avec WPGraphQL est une approche tout à fait valide.
Repères de performance réels : WordPress vs Next.js
Voici des chiffres réels provenant de migrations que nous avons effectuées et d'études de cas disponibles publiquement :
| Métrique | WordPress (optimisé) | Next.js (statique) | Amélioration |
|---|---|---|---|
| TTFB | 650 ms | 80 ms | 87 % plus rapide |
| LCP | 3,8 s | 1,2 s | 68 % plus rapide |
| INP | 380 ms | 90 ms | 76 % plus rapide |
| CLS | 0,18 | 0,01 | 94 % meilleur |
| Poids de page | 3,2 Mo | 450 Ko | 86 % plus léger |
| Requêtes | 85 | 12 | 86 % moins de requêtes |
| Score Lighthouse | 45-65 | 95-100 | Jour et nuit |
« Optimisé » signifie WordPress : PHP 8.3, cache d'objets Redis, CDN, plugin d'optimisation d'image, plugin de mise en cache, optimisation de base de données. Tout ce que vous êtes censé faire. Et c'est toujours loin d'être comparable.
Chemin de migration : de WordPress monolithique à Next.js headless
La migration n'a pas besoin d'être tout ou rien. Voici l'approche par phases que nous recommandons généralement :
Phase 1 : Évaluation (1-2 semaines)
- Auditer la performance du site WordPress actuel avec PageSpeed Insights et les données CrUX
- Inventorier tous les plugins et les mapper à la fonctionnalité frontend vs backend
- Identifier les modèles de contenu et les champs personnalisés
- Évaluer s'il faut garder WordPress en tant que CMS headless ou migrer complètement le contenu
Phase 2 : Construction du frontend (4-8 semaines)
- Configurer le projet Next.js avec l'App Router
- Installer et configurer WPGraphQL sur WordPress
- Construire une bibliothèque de composants correspondant à la conception actuelle (ou refondre — c'est un bon moment pour cela)
- Implémenter la génération statique pour les pages de contenu
- Configurer le mode d'aperçu pour les éditeurs de contenu
Phase 3 : Lancement et redirection (1-2 semaines)
- Déployer le frontend Next.js sur Vercel (ou Netlify, ou Cloudflare Pages)
- Configurer le DNS et les redirections
- Vérifier que toutes les URL sont correctement redirigées (la préservation du SEO est critique)
- Verrouiller l'administrateur WordPress (supprimer l'accès public)
Phase 4 : Optimisation (en continu)
- Surveiller les Core Web Vitals dans Google Search Console
- Affiner les intervalles de revalidation d'ISR
- Ajouter un middleware edge pour la personnalisation
- Envisager une migration vers un CMS headless à usage spécifique si WordPress devient un goulot d'étranglement
Si vous envisagez ce type de migration, vous pouvez consulter notre page de tarification pour des chiffres approximatifs, ou nous contacter directement pour discuter de votre situation spécifique.
Pour les sites construits avec Astro au lieu de Next.js (en particulier les blogs et sites marketing riches en contenu), nous avons également une pratique de développement Astro qui offre une performance encore plus agressive pour les sites à approche statique-first.
FAQ
Puis-je accélérer WordPress sans passer à Next.js ? Oui, jusqu'à un certain point. Commencez par un hébergeur de qualité (Kinsta ou Cloudways), activez la mise en cache d'objets Redis, utilisez un thème léger comme GeneratePress, réduisez les plugins à moins de 15, et configurez un CDN. De cette façon, vous pouvez amener un site WordPress dans la gamme « nécessite une amélioration » pour les Core Web Vitals. Mais atteindre systématiquement la gamme « bon » pour toutes les métriques — en particulier l'INP — est extrêmement difficile avec une architecture WordPress traditionnelle.
Combien coûte une migration de WordPress à Next.js headless ? Cela dépend de la complexité du site. Un simple site marketing (10-30 pages, blog) coûte généralement 15 000 $ à 40 000 $ pour une migration complète. Les sites de commerce électronique avec WooCommerce sont plus complexes, allant de 50 000 $ à 150 000 $ et plus. Le retour sur investissement provient généralement de l'amélioration des taux de conversion et de la réduction des coûts d'hébergement. Notre page de tarification contient plus de détails.
Mon classement SEO diminuera-t-il si je passe à Next.js ? Non, si vous gérez correctement la migration. Les redirections 301 appropriées, les structures d'URL identiques (ou les redirections mappées), les balises méta valides, les données structurées et un plan du site XML sont tous essentiels. Next.js a en fait des avantages SEO — les Core Web Vitals plus rapides améliorent directement les classements, et l'API Metadata facilite la gestion programmatique des balises meta. La plupart des sites voient des améliorations de classement dans les 2-3 mois suivant la migration.
Les éditeurs de contenu perdent-ils le tableau de bord WordPress s'il on va headless ? Non. Dans une configuration headless, WordPress continue de servir de backend de gestion de contenu. Les éditeurs utilisent le même tableau de bord, le même éditeur, le même flux de travail. Ils ne voient simplement pas le thème du frontend — à la place, ils utilisent un bouton d'aperçu qui montre la version rendue par Next.js. Certaines équipes trouvent que c'est en fait mieux car l'aperçu est une représentation précise du site de production.
Qu'en est-il de WooCommerce — Next.js peut-il gérer le commerce électronique ? Oui, mais c'est un projet plus volumineux. Vous pouvez utiliser WooCommerce de manière headless via son API REST ou l'extension WooCommerce WPGraphQL. Alternativement, de nombreuses équipes migrent vers l'API Storefront de Shopify ou Saleor pour le backend du commerce, en utilisant Next.js comme frontend. Le flux de paiement nécessite une manipulation attentive car il implique le traitement des paiements et la conformité PCI. C'est faisable, mais prévoyez un temps de développement supplémentaire.
Next.js est-il la seule option pour un frontend rapide ? Non. Astro, Remix, SvelteKit et même Nuxt (pour les équipes Vue) sont tous viables. Astro en particulier est excellent pour les sites riches en contenu car il n'envoie aucun JavaScript par défaut. Next.js gagne pour les sites qui ont besoin d'interactivité significative, de fonctionnalités dynamiques ou du commerce électronique. Nous travaillons avec Next.js et Astro selon les besoins du projet.
Comment fonctionne la régénération statique incrémentielle (ISR) avec le contenu WordPress ? Quand vous publiez ou mettez à jour un article dans WordPress, un webhook se déclenche et indique à votre déploiement Next.js de revalider cette page spécifique. Le prochain visiteur obtient une page statique fraîchement générée, qui est ensuite mise en cache sur le edge. La revalidation se produit en arrière-plan, donc les utilisateurs n'attendent jamais une construction. Vous pouvez également définir une revalidation basée sur le temps (par exemple, reconstruire tous les 60 secondes) comme solution de secours.
Quelle est la plus grande erreur que les équipes commettent en allant headless ? Essayer de répliquer leur site WordPress 1:1 dans Next.js. Une migration headless est une opportunité de repenser votre architecture de contenu, de simplifier vos structures de page et d'éliminer des années d'encombrement accumulé. Les équipes qui le traitent comme un nouveau départ — en gardant le contenu mais en repensant la présentation — obtiennent des résultats dramatiquement meilleurs que les équipes qui essaient de copier chaque widget et barre latérale de leur ancien thème.