Le WordPress d'aujourd'hui, décodé pour les développeurs

Éditeur de site (FSE)

Éditeur de site et W3 Total Cache : le cache de fragment qui casse un pattern

Symptôme, diagnostic et correctif d'un pattern qui affiche un contenu périmé après activation du cache de fragment de W3 Total Cache.

Par WordPress Développement • 9 octobre 2023 • 5 min de lecture • Aucun commentaire
Éditeur de site et W3 Total Cache : le cache de fragment qui casse un pattern

Un badge « Plus que 2 en stock » affiché alors que l’article venait d’être réapprovisionné le matin même : c’est le signalement reçu d’un client gérant une petite boutique de matériel photo d’occasion, quelques jours après l’activation du module de cache de fragment de W3 Total Cache sur son site en éditeur de site.

Ce billet décrit le symptôme observé, le diagnostic de la règle de cache en cause et le correctif appliqué pour exclure spécifiquement le pattern concerné. Les autres options de configuration de W3 Total Cache et la mise en place d’un CDN ne sont pas traitées dans ce billet.

Symptôme : un contenu qui ne se met pas à jour

Le pattern fiche-produit-stock, utilisé sur le template de fiche produit du thème bloc, affichait un badge de stock calculé par un bloc dynamique interrogeant en temps réel la table de gestion des stocks. Après l’activation du cache de fragment de W3 Total Cache, ce badge continuait d’afficher une valeur ancienne pendant plusieurs heures après chaque mise à jour du stock en base de données, alors que le reste de la fiche produit — description, prix — se mettait à jour normalement.

Le comportement différencié entre le badge et le reste de la page était le premier indice sérieux : seul un élément précis restait figé, ce qui orientait vers un problème de cache localisé plutôt que vers un dysfonctionnement du calcul de stock lui-même.

Diagnostic : le fragment cache englobe trop large

Le module de cache de fragment de W3 Total Cache fonctionne par délimitation manuelle de zones dans le code du thème, via des commentaires spéciaux mfunc et mclude, ou par configuration de zones basées sur des identifiants de bloc. Sur ce thème, la zone de cache de fragment avait été configurée trop largement : elle englobait tout le pattern fiche-produit-stock, y compris le bloc dynamique de stock, avec une durée de vie de quatre heures pensée pour la description produit, rarement modifiée, et non pour le stock, qui change plusieurs fois par jour.

L'essentiel à retenir : Symptôme : un pattern affiche un stock périmé pendant des heures ; Cause : le fragment cache englobe une donnée dynamique ; Correctif : exclusion ciblée du pattern via un marqueur

La commande d’inspection du cache de fragment côté serveur a confirmé l’hypothèse : le fichier de cache correspondant à la fiche produit contenait bien le HTML complet du badge de stock, gelé au moment de sa première génération après la dernière purge.

wp w3-total-cache flush fragment --path=fiche-produit-1042

Cette commande a immédiatement rafraîchi l’affichage du badge, confirmant que le problème résidait bien dans le périmètre de la zone de cache, pas dans le calcul du stock.

Correctif : exclure le badge de la zone de cache

La solution retenue a consisté à réduire le périmètre du fragment cache pour qu’il ne couvre que la description produit, stable, en sortant explicitement le bloc de badge de stock de la zone mise en cache via un marqueur de fin de zone repositionné juste avant le bloc concerné.

<!-- mfunc dynamic-cached-content -->
<!-- wp:pattern {"slug":"wpm/description-produit"} /-->
<!-- /mfunc dynamic-cached-content -->

<!-- wp:wpm/badge-stock /-->

Le badge de stock, désormais hors de la zone de cache de fragment, est recalculé à chaque affichage de la page, ce qui reste acceptable en termes de performance puisqu’il s’agit d’une seule requête indexée sur une table de faible volume.

Une alternative envisagée puis écartée

Réduire la durée de vie du cache de fragment à quelques minutes plutôt qu’à quatre heures aurait aussi limité le problème, sans le résoudre complètement : un client consultant une fiche produit dans les minutes suivant une vente aurait pu voir un stock erroné malgré tout. L’exclusion complète du bloc dynamique de la zone de cache a été jugée plus fiable, au prix d’un gain de performance légèrement moindre sur cette portion précise de la page.

Prévention pour les prochains patterns

  • Documenter systématiquement, pour chaque pattern du thème, la nature de ses blocs internes : statique, dynamique lié à un contenu rarement modifié, ou dynamique lié à une donnée changeant fréquemment.
  • Configurer les zones de cache de fragment au niveau du bloc le plus fin possible, jamais au niveau du pattern entier dès qu’il mélange des natures de contenu différentes.
  • Tester la mise à jour d’une donnée dynamique juste après l’activation d’une nouvelle règle de cache, avant de la considérer comme validée en production.

Un cache de fragment mal délimité ne provoque pas d’erreur visible : il produit un mensonge silencieux, souvent plus coûteux à détecter qu’une panne franche.

En résumé

Ce cas rappelle qu’un pattern d’éditeur de site peut mélanger des blocs de natures très différentes en apparence homogènes, et que la configuration d’un cache de fragment doit toujours suivre cette granularité réelle plutôt que la structure visuelle du pattern. Un contrôle de cohérence après chaque changement de règle de cache reste la meilleure prévention contre ce type de régression silencieuse.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi