Une page en cache ne doit jamais contenir les données d’un visiteur. Cela exclut les pages des utilisateurs connectés, du panier, de la commande et du compte, les pages générées avec une session ou un panier rempli, ainsi que les réponses qui définissent un cookie ou sont marquées comme privées. Tout le reste peut être mis en cache, à condition que les paramètres de filtre entrent dans la clé du cache, que les paramètres de suivi n’y figurent pas, que les prix soient purgés lorsqu’ils changent et qu’aucune page ne survive à ses nonces.
Ces règles valent pour tout Page Cache. Les chiffres et les noms de fichiers sont ceux du Page Cache de CachePilot, un exemple de la forme que prennent les règles dans le code.
Qu’est-ce qui ne doit jamais être mis en cache ?
Le guide de mise en cache de WooCommerce nomme les pages du panier, de la commande et du compte et énumère les cookies utilisés par WooCommerce. Un Page Cache doit décider deux fois : avant de répondre à une requête, puis après la génération d’une page, avant de la stocker.
Requêtes qui contournent le cache
| Règle | Raison |
|---|---|
| Règle : Utilisateurs connectés, articles protégés, auteurs de commentaires | Raison : Les cookies wordpress_logged_in, wp-postpass et comment_author signalent un contenu personnel |
| Règle : Pages du panier, de la commande et du compte | Raison : Leur contenu appartient à un seul visiteur |
| Règle : Tout sauf GET et HEAD | Raison : Les autres méthodes modifient des données ; les fragments de panier sont la seule exception |
| Règle : Administration, AJAX, cron, API REST, flux, contenus intégrés, fichiers XML et PHP | Raison : Ces réponses ne sont pas des pages destinées aux visiteurs |
| Règle : Paramètres d’URL inconnus | Raison : Des paramètres tels que add-to-cart ou s modifient ce que fait la requête |
| Règle : Le cookie woocommerce_recently_viewed | Raison : Le widget liste les produits de ce visiteur |
| Règle : Un cookie de session lorsque les taxes suivent l’adresse du client | Raison : Les prix affichés dépendent du visiteur |
Pages qui ne sont jamais stockées
| Règle | Raison |
|---|---|
| Règle : Un utilisateur connecté ou DONOTCACHEPAGE | Raison : Les extensions WordPress utilisent cette constante pour exclure une page |
| Règle : Un panier rempli ou une session WooCommerce | Raison : La page peut afficher des messages de panier ou des prix selon l’adresse du visiteur |
| Règle : Un prix affiché avec la géolocalisation | Raison : Le prix n’est valable que pour un lieu |
| Règle : Un en-tête Set-Cookie, ou Cache-Control avec no-cache, no-store ou private | Raison : La réponse se signale elle-même comme personnelle |
| Règle : Résultats de recherche, pages 404, flux et contenus intégrés | Raison : Ils sont rarement demandés deux fois |
| Règle : HTML incomplet | Raison : En dessous de 255 octets ou sans balise html fermante, un rendu raté atteindrait tous les visiteurs |
Visiteurs avec un panier rempli
La configuration simple contourne le cache pour tout visiteur disposant d’un cookie de panier. Elle est sûre, mais ces visiteurs n’obtiennent aucun succès du cache. L’autre configuration leur sert des pages en cache et remplit le mini-panier grâce aux fragments de panier, tandis que les pages générées pour eux ne sont pas stockées.
CachePilot utilise la seconde configuration. Elle dépend du thème : un thème qui écrit le nombre d’articles du panier dans le HTML de la page exige la première.
Pourquoi les paramètres de suivi comptent-ils ?
Les liens issus de newsletters, de publicités et de réseaux sociaux portent des paramètres comme utm_source, gclid ou fbclid. Ils ne modifient pas la page. Dans la clé du cache, chaque lien de campagne créerait sa propre copie de la page, et presque chaque visiteur d’une campagne obtiendrait un échec (MISS).
Un Page Cache devrait exclure ces paramètres de la clé. La liste de CachePilot suit WP Rocket 3.24 et compte 61 entrées, dont quatre sont des préfixes pour une famille entière : utm_*, mtm_*, pk_* et hsa_*.
Comment les filtres de boutique sont-ils mis en cache ?
Les paramètres de filtre, de tri et de pagination modifient bel et bien la page, ils appartiennent donc à la clé avec leurs valeurs. En les triant d’abord, ?orderby=price&paged=2 et ?paged=2&orderby=price partagent une seule entrée. La liste de CachePilot compte 14 entrées, parmi lesquelles orderby, paged, min_price, max_price et les préfixes filter_*, query_type_* et attribute_*.
Une limite empêche les robots qui combinent tous les filtres de remplir Redis de pages que personne ne redemande. Dans CachePilot, une requête comportant plus de 6 paramètres pouvant être mis en cache contourne le cache.
Les cookies de devise demandent le même traitement, afin qu’un visiteur ayant choisi une autre devise reçoive la page dans cette devise. La page des sites multilingues traite des langues et des devises.
Que dire des fragments de panier ?
WooCommerce met à jour le mini-panier avec une requête POST vers ?wc-ajax=get_refreshed_fragments. Chacune de ces requêtes démarre WordPress, et pour un visiteur dont le panier est vide, la réponse est toujours la même.
CachePilot met en cache cette requête tant que les deux cookies de panier, woocommerce_cart_hash et woocommerce_items_in_cart, sont vides. Dès que le panier contient des articles, la requête part vers WooCommerce comme d’habitude.

Quand faut-il purger les pages en cache ?
Les modifications effectuées via l’API WooCommerce, REST, WP-CLI, les imports et les promotions programmées ne déclenchent aucun enregistrement d’article ordinaire. Un cache qui n’écoute que les articles enregistrés conserve alors d’anciens prix. CachePilot purge de la manière suivante :
- Stock. Une modification du stock ou de l’état du stock purge la page du produit ainsi que les pages de la boutique et des catégories.
- Prix. Une modification du prix, des dates de promotion, du statut fiscal ou de la classe de taxe vide tout le Page Cache, car les produits associés, les ventes incitatives et les blocs de produits affichent ce prix sur d’autres pages.
- Réglages de la boutique. La devise, le format des prix, les réglages de taxe, les taux de taxe et les prix WCML vident le Page Cache une fois à la fin de la requête, de sorte qu’une modification en masse ne coûte qu’un seul vidage.
- Contenu. L’enregistrement d’un article purge sa pagination, ses voisins, son auteur, sa date et ses pages parentes, ses termes et ses traductions WPML. Les menus, les widgets, le titre du site et les permaliens vident tout le cache.
Pourquoi 12 heures au maximum ?
De nombreuses pages de boutique contiennent des nonces, par exemple pour l’API Store ou pour des requêtes REST émises depuis la page. Un nonce WordPress est valable de 12 à 24 heures, selon le moment de son cycle où il a été créé. Une page en cache vieille de plus de 12 heures peut contenir un nonce expiré, et un bouton ou un formulaire qu’elle contient échoue.
CachePilot plafonne la durée de vie d’une page à 43 200 secondes, soit 12 heures, quels que soient les réglages. Autopilot utilise 10 heures.
Comment vérifier ce qu’il est advenu d’une page ?
Trois tests sur une copie de préproduction couvrent les principaux risques avec n’importe quel Page Cache :
- Ajoutez un produit dans un navigateur, puis ouvrez la même page dans un autre navigateur. Le second doit afficher un panier vide.
- Modifiez un prix, puis rechargez la page du produit et celle de sa catégorie.
- Chargez une page deux fois avec ?utm_source=test. La seconde requête devrait être un succès (HIT).
Dans CachePilot, le module Debug ajoute aux pages HTML un commentaire indiquant l’état du Page Cache et la raison d’un contournement, par exemple « WooCommerce page » ou « Cart not empty ».
La page WooCommerce décrit le fonctionnement de CachePilot dans une boutique.
Sources
- Documentation développeur de WooCommerce, configuration des extensions de cache : pages et cookies.
- Documentation développeur de WordPress, nonces : durée de vie de 12 à 24 heures.
- plugin/pagecache-rules.php : cachepilot_pc_defaults() avec 61 paramètres ignorés et 14 paramètres pouvant être mis en cache, cachepilot_pc_decide() avec la règle des fragments de panier, CACHEPILOT_PC_MAX_PARAMS = 6.
- PageCacheModule.php dans modules/PageCache de l’extension : shouldBypass(), getNoStoreReason(), wooCommerceRules(), MAX_PAGE_TTL = 43200, AUTOPILOT_TTL = 36000, PRICE_PROPS, FLUSH_HOOKS.
- plugin/readme.txt, journal des modifications 1.3.0 et 1.4.1.


