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()renvoiefalsesi absent ou expiré → d’où le testfalse !== $cache.- Où sont-ils stockés ? Dans
wp_optionspar 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
revalidated’ISR ou unstale-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
| Besoin | Outil | Persistance |
|---|---|---|
| Un réglage du site | Option (get/update_option) | Permanente |
| Mettre en cache un résultat coûteux avec expiration | Transient (get/set_transient) | Jusqu’à expiration (base ou Redis) |
| Éviter de recalculer dans la même requête | Cache 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. sursave_postdu 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
- 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 ?
- Pourquoi
get_transient()peut-il renvoyerfalseet comment le gérer ? - Quelle est la différence entre une option et un transient en termes de rôle ?
✅ Solution
- Un transient :
get_transient('meteo'); sifalse, appeler l’API puisset_transient('meteo', $data, HOUR_IN_SECONDS)(ou 15-30 min selon la fraîcheur voulue). On évite ainsi un appel API à chaque visite. - Il renvoie
falsesi le transient est absent ou expiré. On testefalse !== $cacheavant de l’utiliser ; sinon on recalcule et on ré-écrit le transient. - 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.