Skip to Content
WordPressPartie 5 — Architecture du cœurOptions, transients & cache objet

Chapitre 5.7 — Options, transients & cache objet

⏱️ TL;DR — Trois mécanismes de stockage/cache à distinguer. Les options (get_option/update_option) : réglages persistants du site (attention à l’autoload). Les transients (get_transient/set_transient) : un cache avec expiration, idéal pour mémoriser un résultat coûteux (appel API, requête lourde). Le cache objet (wp_cache_get/set) : un cache en mémoire pour la durée de la requête (ou persistant si Redis/Memcached est branché). Bien choisir entre les trois, c’est la base de la performance (Partie 11).

🎯 Objectifs

  • Stocker et lire des options (réglages), en maîtrisant l’autoload.
  • Utiliser les transients comme cache expirable.
  • Comprendre le cache objet et le rôle d’un backend persistant (Redis).
  • Choisir le bon outil selon le besoin.

1. Les options : des réglages persistants

Les options stockent des réglages de site sous forme clé/valeur (table wp_options, ch. 4.6). On les manipule via des fonctions dédiées :

update_option( 'monplugin_reglages', array( 'couleur' => '#3858e9', 'actif' => true ) ); $reglages = get_option( 'monplugin_reglages', array() ); // 2e arg = défaut delete_option( 'monplugin_reglages' ); // Contrôler l'autoload (4e argument à l'ajout) add_option( 'monplugin_gros_cache', $data, '', 'no' ); // 'no' = pas autoloadé
  • Les valeurs sont sérialisées automatiquement (on peut stocker tableaux/objets).
  • Persistantes : elles restent jusqu’à modification/suppression.
  • Servent aux réglages d’un plugin/thème (Settings API, Partie 7).

⚠️ Piège — l’autoload (rappel ch. 4.6). Une option autoloadée est chargée à chaque requête. Ne stockez pas de grosses données (ou des données rarement lues) en autoload : passez 'no' en 4ᵉ argument d’add_option. Une option volumineuse autoloadée est une cause fréquente de lenteur.


2. Les transients : un cache avec expiration

Un transient est une donnée temporaire avec une durée de vie. Parfait pour mémoriser un résultat coûteux et éviter de le recalculer à chaque page.

function monplugin_get_taux_change() { $cache = get_transient( 'monplugin_taux_change' ); if ( false !== $cache ) { return $cache; // hit : on renvoie la valeur en cache } // miss : on (re)calcule (appel API coûteux) $taux = monplugin_appeler_api_taux(); set_transient( 'monplugin_taux_change', $taux, HOUR_IN_SECONDS ); // expire dans 1 h return $taux; }
  • Expiration : en secondes (constantes pratiques : MINUTE_IN_SECONDS, HOUR_IN_SECONDS, DAY_IN_SECONDS).
  • get_transient() renvoie false si absent ou expiré → d’où le test false !== $cache.
  • Où sont-ils stockés ? Dans wp_options par défaut… ou dans le cache objet persistant si un backend (Redis/Memcached) est présent (§3).

💡 Pour un dev React — Les transients = un cache TTL façon revalidate d’ISR ou un stale-while-revalidate. Le pattern « lis le cache ; si absent, calcule et écris avec une expiration » est exactement le vôtre côté data-fetching. Attention : sans backend persistant, les transients vivent en base (wp_options) — pratique mais pas gratuit ; avec Redis, ils deviennent un vrai cache mémoire.


3. Le cache objet (wp_cache_*)

Le cache objet (Object Cache) mémorise des données en mémoire pour éviter de refaire un travail pendant la requête :

$val = wp_cache_get( 'ma_cle', 'mon_groupe' ); if ( false === $val ) { $val = calcul_couteux(); wp_cache_set( 'ma_cle', $val, 'mon_groupe', 300 ); // 300 s si backend persistant }
  • Par défaut, non persistant : le cache est vidé à la fin de chaque requête (utile seulement pour dédupliquer des calculs dans la même requête). WordPress l’utilise en interne (résultats de WP_Query, métadonnées…).
  • Avec un backend persistant (Redis/Memcached + plugin object-cache.php), il survit entre les requêtes → gain de performance majeur, et les transients basculent aussi sur ce backend.

4. Choisir le bon outil

BesoinOutilPersistance
Un réglage du siteOption (get/update_option)Permanente
Mettre en cache un résultat coûteux avec expirationTransient (get/set_transient)Jusqu’à expiration (base ou Redis)
Éviter de recalculer dans la même requêteCache objet (wp_cache_*)Requête (ou Redis si persistant)

⚠️ Piège — confondre option et cache. Une option est une source de vérité (un réglage) : on ne la « régénère » pas. Un transient/cache est jetable : s’il disparaît, on le recalcule. N’utilisez pas une option pour cacher des données volatiles (elle ne s’expire pas et pollue wp_options), ni un transient pour un réglage critique (il peut disparaître).


5. Invalidation

Le cache utile est un cache invalidé au bon moment :

  • Supprimez le transient quand la donnée source change : delete_transient( 'clé' ) (ex. sur save_post du contenu concerné).
  • Pour le cache objet : wp_cache_delete( 'clé', 'groupe' ).
  • Ne cachez pas des données par-utilisateur/sensibles sans clé incluant l’utilisateur, sinon fuite entre visiteurs.

✏️ Exercices

  1. Vous appelez une API météo à chaque affichage de la page d’accueil (lent). Quel mécanisme utilisez-vous, et avec quelle expiration raisonnable ?
  2. Pourquoi get_transient() peut-il renvoyer false et comment le gérer ?
  3. Quelle est la différence entre une option et un transient en termes de rôle ?

✅ Solution

  1. Un transient : get_transient('meteo') ; si false, appeler l’API puis set_transient('meteo', $data, HOUR_IN_SECONDS) (ou 15-30 min selon la fraîcheur voulue). On évite ainsi un appel API à chaque visite.
  2. Il renvoie false si le transient est absent ou expiré. On teste false !== $cache avant de l’utiliser ; sinon on recalcule et on ré-écrit le transient.
  3. Une option est un réglage persistant (source de vérité, sans expiration) ; un transient est un cache jetable avec expiration (recalculable s’il disparaît).

🧠 Quiz de révision

1. À quoi servent les options ?

À stocker des réglages persistants du site (clé/valeur), via get_option/update_option.

2. Qu’est-ce qu’un transient ?

Un cache avec expiration : on y met un résultat coûteux (set_transient) et on le relit (get_transient) jusqu’à expiration.

3. Que renvoie get_transient() si la valeur a expiré ?

false (comme si elle était absente) → il faut recalculer et ré-écrire.

4. Le cache objet est-il persistant par défaut ?

Non : il ne dure que la requête, sauf backend persistant (Redis/Memcached) branché, qui le fait survivre entre requêtes.

5. Quel piège avec les options autoloadées ?

Une grosse option en autoload=yes est chargée à chaque requête → lenteur. Stocker les grosses/volatiles données avec autoload='no' ou en transient.


Chapitre suivant : WP-Cron : les tâches planifiées.