Votre site WordPress met du temps à charger. Pourtant vous avez déjà mis en place l’essentiel : un hébergement adapté, des images optimisées et une extension de cache activée. Vous constatez cependant que quelque chose continue à ralentir certaines pages, sans que vous sachiez vraiment quoi. Il est fort probable que cela soit dû à un traitement que votre site refait inutilement à chaque visite : par exemple l’appel à un flux Instagram affiché sur votre page d’accueil, ou une requête un peu lourde à votre base de données.
Et bien, sachez que WordPress dispose nativement d’un outil qui permet d’éviter de refaire ce travail à chaque visite.
Cet outil, ce sont les transients. Vous n’en avez peut-être jamais entendu parler. Personnellement, je connais les transients grâce au Slack WordPress FR, où je retrouve quotidiennement « mes collègues de travail ».
Aujourd’hui, je vous explique ce que c’est et à quoi ça sert.
Qu’est-ce qu’un transient WordPress ?
Un transient, c’est une donnée que WordPress met de côté temporairement, avec une date d’expiration, pour éviter de la recalculer ou de la redemander à chaque chargement de page. Par défaut, cette donnée est stockée dans la table wp_options de votre base de données, la même table qui contient déjà les réglages généraux de votre site.
La différence avec une option de donnée classique (comme le titre de votre site ou l’adresse email de contact, enregistrés dans Réglages > Général de votre tableau de bord) tient en un mot : la durée.
Votre email ou le titre de votre site restent en base indéfiniment, jusqu’à ce que vous la modifiiez ou la supprimiez vous-même. Par contre, un transient, lui, porte une date de péremption dès sa création. Passé ce délai, WordPress considère qu’il n’est plus valable.
Notons, en passant, un petit inconvénient, le transient reste parfois encore techniquement en base. Je vous en parle juste après.
À quoi servent concrètement les transients ?
Il faut avant tout préciser que rien de tout ça ne se déclenche automatiquement. Ce n’est pas WordPress qui décide, tout seul, de mettre en cache tel ou tel élément. C’est vous (ou l’extension que vous utilisez) qui devez les mettre en place.
Voici les situations où ça vaut le coup de le faire :
- un widget qui affiche la météo ou un flux de réseau social : en y ajoutant un transient, pas besoin de rappeler le service externe à chaque personne qui visite le site, un cache de quelques minutes peut suffire
- une requête un peu lourde, comme la liste des articles les plus commentés du mois. On peut demander à ce que cette requête soit recalculée une fois par heure plutôt qu’à chaque chargement de page
- des données provenant d’une API tierce, comme la disponibilité d’un produit chez un fournisseur
Ces exemples de situations ont un point commun : un traitement qui coûte du temps ou des ressources, mais dont le résultat ne change pas à chaque seconde. C’est exactement le terrain de jeu des transients.
Comment fonctionnent les transients, sans être développeur ou développeuse
Je vous explique comment ça marche, parce que moi-même j’aime savoir le pourquoi du comment. Mais vous verrez plus bas, qu’il existe des moyens, sans vraiment mettre les mains dans le code, qui vous permettront de mettre cela en place.
Pour les transients, trois fonctions suffisent :
set_transient() //pour créer le cache, avec une durée de vie
get_transient() //pour aller le chercher et vérifier au passage s'il existe encore
delete_transient() //pour le supprimer manuellement si besoinReprenons l’exemple du flux Instagram évoqué en introduction : plutôt que de solliciter ce service à chaque visite de votre page d’accueil, on va mettre son résultat en cache. Ce genre de code se place dans le fichier functions.php de votre thème, ou dans une extension, comme on le verra un peu plus loin.
Voici à quoi ça pourrait ressembler. Je vous propose une version simplifiée du code pour expliquer comment ça marche. En réalité, l’API Instagram demande en plus une clé d’accès à configurer (ne copiez pas ce bout de code tel quel) :
function moncache_flux_instagram() {
// On vérifie d'abord si le flux est déjà en cache
$flux = get_transient( 'moncache_flux_instagram' );
if ( false === $flux ) {
// Pas de cache valide : on va chercher les données auprès d'Instagram
$reponse = wp_remote_get( 'https://exemple-api-instagram.test/mon-compte' );
// Si la requête a échoué, on renvoie un tableau vide plutôt que de mettre une erreur en cache
if ( is_wp_error( $reponse ) ) {
return array();
}
// On récupère le contenu de la réponse et on le transforme en donnée utilisable
$flux = json_decode( wp_remote_retrieve_body( $reponse ), true );
// On enregistre ce résultat en cache pendant 30 minutes (1800 secondes)
set_transient( 'moncache_flux_instagram', $flux, 1800 );
}
return $flux;
}Reprenons ce code ligne par ligne :
- $flux : c’est la variable, une sorte de boîte dans laquelle PHP range une valeur pour la réutiliser plus bas dans le code. En PHP, le symbole $ sert à repérer une variable, quel que soit ce qu’elle contient (un nombre, du texte, ou ici le résultat de notre appel à Instagram). Dans cet exemple, $flux stocke le résultat final et $reponse (un peu plus bas encore) stocke la réponse brute renvoyée par Instagram avant qu’on l’exploite.
- get_transient( « moncache_flux_instagram » ) : « moncache_flux_instagram » est le nom qu’on peut donner au transient (on parle aussi de sa « clé »), c’est l’identifiant qui permet de le retrouver. On regarde ici si un cache valide existe déjà sous ce nom. Le préfixe moncache_ est juste un exemple qui permet de préfixer vos transients avec quelque chose qui vous est propre (les initiales de votre site, par exemple), pour éviter qu’une autre extension utilise le même nom par hasard.
- if ( false === $flux ) : s’il n’existe pas, ou s’il a expiré, on entre dans le bloc qui va chercher les données pour de vrai.
- wp_remote_get(…) : c’est l’étape qui interroge réellement Instagram sur le réseau, la plus coûteuse en temps, celle qu’on cherche justement à éviter de répéter.
- is_wp_error( $reponse ) : on vérifie que la requête n’a pas échoué (service injoignable, erreur réseau), pour ne pas mettre en cache un résultat vide ou une erreur.
- wp_remote_retrieve_body(…) puis json_decode(…) : on récupère le contenu brut de la réponse, puis on le transforme en donnée exploitable dans votre thème.
- set_transient( « moncache_flux_instagram », $flux, 1800 ) : on enregistre ce résultat en cache pour 30 minutes.
- return $flux : on renvoie la donnée.
Pour résumer : la logique reste la même quel que soit ce que vous mettez en cache : si le transient existe, on l’utilise directement. Sinon, on fait le travail une fois, puis on l’enregistre pour la prochaine fois. C’est cette petite condition, if ( false === $flux ), qui fait tout le travail.
Sans ce mécanisme de cache, que se passe-t’il ?
Sans transient, ce code irait interroger Instagram à chaque chargement de la page d’accueil, pour chaque personne qui la visite. Les conséquences se cumulent vite :
- les pages sont plus lentes à charger, puisque WordPress attend la réponse d’Instagram avant de pouvoir afficher le reste
- le site ralentit, peut même afficher une erreur, dès qu’Instagram répond lentement ou devient injoignable, alors que ce n’est qu’un élément parmi d’autres sur votre page
- on prend le risque de dépasser le quota d’appels autorisé par certains services (beaucoup d’API, dont celle d’Instagram, limitent le nombre de requêtes sur une période donnée), ce qui peut faire échouer l’affichage pour tout le monde, ou bloquer temporairement l’accès à ce service
Le transient ne change rien au résultat affiché à vos visiteurs et visiteuses, par contre il change la fréquence à laquelle WordPress va réellement chercher l’information.
Peut-on mettre en place ce code avec les outils o2switch ?
Plusieurs outils du cPanel o2switch permettent en effet d’ajouter ce type de code. Que ce soit sur les offres Grow, Cloud, Pro ou bien les serveurs infogérés.
- Comme premier outil on a le gestionnaire de fichiers. C’est une interface web qui permet de consulter et de modifier directement les fichiers de votre hébergement, comme justement functions.php, sans rien installer.
- Grâce au compte FTP, on peut envoyer le fichier functions.php modifié depuis son ordinateur avec un logiciel dédié
- Et pour les personnes plus à l’aise en ligne de commande, le Terminal, qui donne un accès SSH depuis votre navigateur.
Attention, avant de foncer, il est nécessaire de prendre des précautions : en effet, modifier le fichier functions.php directement comporte un vrai risque si le code contient la moindre erreur de syntaxe, votre site peut se retrouver avec une page blanche le temps de corriger l’erreur. Pour éviter cela, vous pouvez par exemple utiliser une extension qui permet d’ajouter des bouts de code (souvent appelée « code snippets »). Elle permet d’ajouter ce genre de fonction sans toucher aux fichiers du thème, et de la désactiver en un clic si quelque chose se passe mal. Ou encore mieux, faites des tests sur un site clone.
Transients et cache objet chez o2switch
Par défaut, un transient est donc stocké dans la base de données. Mais dès qu’un cache objet comme Redis ou Memcached est actif sur votre hébergement, WordPress bascule automatiquement dessus pour stocker les transients en mémoire plutôt qu’en base. Il en résulte une lecture beaucoup plus rapide et une base de données moins sollicitée.
Cette possibilité existe chez o2switch : une instance privée de Redis et une instance privée de Memcached sont aussi proposées sur les offres Grow, Cloud, Pro et sur les serveurs infogérés. Ces instances ne sont pas activées par défaut, il faut les créer soi-même depuis un outil dédié du cPanel.
Attention, les données de ces caches sont éphémères, elles disparaissent au redémarrage du serveur. C’est parfaitement adapté à un usage de cache comme les transients, mais ça ne doit jamais servir à stocker une donnée qu’on ne peut pas se permettre de perdre.
Pour que WordPress s’en serve automatiquement, il faut ensuite une extension dédiée, par exemple « Redis Object Cache » (disponible sur le répertoire officiel des extensions WordPress) si vous activez Redis. Une fois configuré, tous les transients déjà présents sur votre site, ceux de votre thème comme ceux de vos extensions, en profitent sans que vous ayez à toucher au moindre code.
C’est un vrai plus, chez o2switch, par rapport à un hébergement qui ne propose pas cette option nativement.
Le piège des transients qui s’accumulent dans la base de données
C’est le revers de la médaille et un piège dans lequel tombent beaucoup de sites. Les transients expirés ne sont pas toujours supprimés automatiquement de la base de données. De ce fait la table wp_options grossit avec le temps, ce qui peut finir par ralentir le site entier.
Précision utile : ce problème concerne surtout le stockage en base par défaut. Avec un cache objet actif comme Redis ou Memcached, décrit juste au-dessus, les transients expirés sont nettoyés automatiquement par le cache lui-même, sans intervention de votre part.
Si vous n’avez pas de cache objet en place, voici comment vérifier et nettoyer :
- repérer les transients dans la base, via phpMyAdmin, en cherchant les entrées qui commencent par transient (attention, manipuler directement la base de données peut être risqué !)
- utiliser WP-CLI, avec la commande wp transient delete –expired, si vous êtes à l’aise avec la ligne de commande
- passer par une extension de nettoyage dédiée, une option plus confortable pour un public moins technique
- Des extensions de monitoring peuvent aussi le proposer
Bien utiliser les transients : les bonnes pratiques
Quelques repères pour ne pas se tromper :
- choisissez une durée d’expiration adaptée à la donnée : ni trop courte (le cache ne sert alors plus à rien), ni trop longue (vous risquez d’afficher une information périmée)
- ne stockez jamais une donnée critique ou sensible dans un transient
- préfixez vos noms de transients (comme dans l’exemple plus haut avec moncache_) pour les repérer facilement en base et éviter les conflits avec d’autres extensions
- réservez les transients aux traitements réellement coûteux, un appel externe ou une requête lourde, plutôt qu’à une donnée déjà rapide à récupérer
Un site plus rapide ne passe donc pas uniquement par le choix de l’hébergement. Certains réglages côté WordPress y contribuent aussi, et les transients en sont un bon exemple : simples à mettre en place, et d’autant plus efficaces si votre hébergement propose un cache objet comme Redis ou Memcached.
Crédit image à la Une : Milad Fakurian













