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

E-commerce

Transients contre cache objet : où mémoriser un flux de disponibilité fournisseur dans WooCommerce

Le flux XML d'un fournisseur change toutes les dix minutes. Transient ou cache objet : lequel choisir pour ne pas saturer wp_options ni servir du stock périmé ?

Par WordPress Développement • 24 mars 2022 • 5 min de lecture • Aucun commentaire
Transients contre cache objet : où mémoriser un flux de disponibilité fournisseur dans WooCommerce

get_transient( 'flux_fournisseur_disponibilite' ) : cette ligne revient dans la moitié des connecteurs WooCommerce que j’ai audités ces derniers mois. Elle a l’air anodine, mais elle cache un vrai choix d’architecture dès qu’un fournisseur pousse un flux de disponibilité toutes les dix ou quinze minutes.

Le réflexe le plus courant consiste à stocker ce flux dans un transient, parce que la fonction est native, documentée et qu’elle fonctionne dès l’installation. Le problème apparaît quand le catalogue grossit ou que la fréquence de rafraîchissement augmente : la table wp_options commence à souffrir, et un objet mal sérialisé peut y rester bien plus longtemps que prévu.

Ce que fait réellement un transient

Un transient WooCommerce n’est, à la base, qu’une paire d’entrées dans wp_options : la valeur elle-même, préfixée par _transient_, et sa date d’expiration, préfixée par _transient_timeout_. Sans cache objet persistant actif, chaque appel à get_transient() se traduit par une requête SQL contre cette table. Si l’entrée a expiré, WordPress la supprime et renvoie false, ce qui oblige le code appelant à régénérer la donnée à la volée.

Cette mécanique convient très bien à un flux qui change toutes les dix ou vingt minutes sur un catalogue de quelques centaines de références : la table reste petite, et la fréquence de lecture n’a rien d’excessif.

Le vrai coût apparaît avec un cache objet absent

L'essentiel à retenir : set_transient() persiste sans dépendance externe ; Un cache objet dédié évite d'alourdir wp_options ; Le bon choix dépend surtout de la fréquence de rafraîchissement

Sur un hébergement sans Redis ni Memcached, chaque page produit qui vérifie la disponibilité déclenche une requête sur wp_options. Multipliez cela par un catalogue de plusieurs milliers de références et par un trafic soutenu, et la table gonfle, se fragmente, et ralentit les requêtes voisines qui portent sur les réglages du site.

Voici comment je pose généralement le choix avec un client :

  • Moins de 500 références et rafraîchissement toutes les heures : un transient classique suffit largement.
  • Catalogue de plusieurs milliers de références avec un flux toutes les dix minutes : un cache objet devient nécessaire pour éviter la pression sur wp_options.
  • Disponibilité vérifiée à chaque affichage de fiche produit à fort trafic : privilégier un cache objet avec une durée de vie courte plutôt qu’un transient rechargé en boucle.

Un cache objet persistant change la donne

Avec un cache objet persistant (Redis ou Memcached configuré via un plugin de type object-cache.php), les fonctions wp_cache_get() et wp_cache_set() deviennent les bonnes candidates. Elles ne touchent jamais wp_options : la donnée vit en mémoire, avec une expiration gérée par le serveur de cache lui-même.

Fait important à connaître : sans cache objet persistant configuré, WordPress utilise un cache objet en mémoire non persistant, réinitialisé à chaque requête HTTP. Autrement dit, wp_cache_set() sans backend persistant ne sert à rien pour un flux qui doit survivre entre deux visites : il faut alors se rabattre sur un transient, ou installer un vrai backend de cache objet.

Exemple de bascule conditionnelle

function get_disponibilite_fournisseur( $sku ) {
    if ( wp_using_ext_object_cache() ) {
        $valeur = wp_cache_get( 'dispo_' . $sku, 'flux_fournisseur' );
        if ( false === $valeur ) {
            $valeur = recuperer_disponibilite_distante( $sku );
            wp_cache_set( 'dispo_' . $sku, $valeur, 'flux_fournisseur', 10 * MINUTE_IN_SECONDS );
        }
        return $valeur;
    }

    $valeur = get_transient( 'dispo_' . $sku );
    if ( false === $valeur ) {
        $valeur = recuperer_disponibilite_distante( $sku );
        set_transient( 'dispo_' . $sku, $valeur, 10 * MINUTE_IN_SECONDS );
    }
    return $valeur;
}

La fonction wp_using_ext_object_cache() permet justement de détecter si un backend externe est actif, et donc d’adapter le comportement sans dupliquer la logique métier ailleurs dans le connecteur.

Cas particulier : plusieurs milliers de SKU en une seule passe

Quand le flux fournisseur porte sur un catalogue entier plutôt que sur une référence isolée, mieux vaut éviter de multiplier les transients un par un. Je préfère alors sérialiser l’ensemble du flux dans une seule entrée, avec une clé de version dans le nom (par exemple flux_fournisseur_v3), ce qui permet d’invalider proprement sans dépendre de l’expiration naturelle.

CritèreTransientCache objet externe
Persistance sans configurationOui, via wp_optionsNon, nécessite Redis ou Memcached
Impact sur wp_optionsDirect, proportionnel au volumeAucun
Vitesse de lectureCorrecte pour un petit volumeNettement supérieure en mémoire
Simplicité de mise en œuvreAucune dépendanceNécessite un backend installé

Sur un projet où l’hébergement ne garantit pas de cache objet persistant, je code toujours la bascule automatique décrite plus haut : le connecteur fonctionne partout, et profite du cache objet dès qu’il est disponible, sans ligne de configuration supplémentaire.

Notre verdict

Le transient reste le choix par défaut le plus raisonnable pour un flux fournisseur modeste, parce qu’il ne demande aucune infrastructure supplémentaire. Dès que le catalogue dépasse quelques milliers de références ou que la fréquence de rafraîchissement descend sous le quart d’heure, le cache objet externe devient nécessaire pour préserver la table wp_options et la réactivité générale du site.

La bonne pratique consiste rarement à choisir l’un contre l’autre définitivement : coder une bascule conditionnelle, comme dans l’exemple ci-dessus, permet au même connecteur de fonctionner correctement sur un hébergement mutualisé comme sur une infrastructure équipée d’un cache objet persistant.

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