Cinq ans. C’est l’âge du shortcode [commission_affilie id="123"] retrouvé dans les archives d’un blog d’avis produits, toujours actif sur plusieurs centaines d’articles, et dont personne dans l’équipe actuelle ne se souvenait précisément du fonctionnement interne avant qu’un audit de performance ne s’y attarde.
Le shortcode affichait, sur chaque fiche produit affiliée, le montant de commission actuellement dû pour ce produit, une information alimentée par une intégration Stripe Connect utilisée pour reverser les commissions aux partenaires du programme d’affiliation. Rien dans son affichage ne laissait deviner le nombre d’appels réseau qu’il déclenchait à chaque chargement de page.
Le code hérité, tel que découvert
Le shortcode appelait directement l’API Stripe à chaque exécution, sans aucune forme de mise en cache, ni au niveau du shortcode lui-même ni au niveau de la page :
add_shortcode( 'commission_affilie', function ( $atts ) {
$stripe = new \Stripe\StripeClient( STRIPE_SECRET_KEY );
$compte = $stripe->accounts->retrieve( $atts['id'] );
$solde = $stripe->balance->retrieve( [
'stripe_account' => $atts['id'],
] );
return sprintf(
'<strong>%s €</strong> de commission en attente',
number_format( $solde->pending[0]->amount / 100, 2 )
);
});
Deux appels réseau distincts vers l’API Stripe, à chaque affichage du shortcode, sur une page qui n’était par ailleurs protégée par aucun cache de page — le site utilisait un cache de fragments partiel qui excluait justement les blocs contenant ce shortcode, jugés « dynamiques » lors d’une configuration antérieure dont la justification exacte s’était perdue avec le temps.
Le coût réel, une fois mesuré

Un profil Query Monitor sur une fiche produit type a révélé un temps cumulé de 380 à 650 millisecondes passé dans ces deux appels Stripe, selon la latence du moment vers l’API. Sur un blog qui reçoit un trafic significatif de moteurs de recherche vers ses fiches produits, ce temps s’appliquait à chaque visite non mise en cache, soit la quasi-totalité du trafic organique vu l’exclusion du cache mentionnée plus haut.
Le calcul du coût cumulé sur un mois de trafic a donné un chiffre qui a fini de convaincre de la priorité du correctif : plusieurs dizaines de milliers d’appels à l’API Stripe déclenchés uniquement pour afficher une information qui, dans les faits, ne changeait qu’une poignée de fois par semaine — au rythme des versements de commission, pas à celui des visites.
Le correctif : un cache de statut avec TTL court
add_shortcode( 'commission_affilie', function ( $atts ) {
$cle_cache = 'commission_stripe_' . $atts['id'];
$solde_formate = get_transient( $cle_cache );
if ( false === $solde_formate ) {
$stripe = new \Stripe\StripeClient( STRIPE_SECRET_KEY );
$solde = $stripe->balance->retrieve( [
'stripe_account' => $atts['id'],
] );
$solde_formate = number_format( $solde->pending[0]->amount / 100, 2 );
set_transient( $cle_cache, $solde_formate, 15 * MINUTE_IN_SECONDS );
}
return sprintf( '<strong>%s €</strong> de commission en attente', $solde_formate );
});
Un TTL de quinze minutes a été jugé largement suffisant au regard de la fréquence réelle de variation du solde de commission, tout en éliminant la quasi-totalité des appels Stripe redondants. L’appel accounts->retrieve(), jugé non indispensable à l’affichage final, a par ailleurs été supprimé purement et simplement du shortcode.
Résultat mesuré
| Mesure | Avant correctif | Après correctif |
|---|---|---|
| Temps du shortcode (hors cache transient) | 380 à 650 ms | 2 ms (lecture transient) |
| Appels API Stripe par jour (estimation) | Plusieurs milliers | Une centaine (un par compte affilié toutes les 15 minutes) |
Pourquoi ce genre de dette technique survit si longtemps
- Le shortcode fonctionnait « correctement » du point de vue fonctionnel, ce qui l’a rendu invisible à toute revue de code orientée bug plutôt que performance.
- Son exclusion du cache de fragments, décidée à l’origine pour une raison de fraîcheur de donnée légitime à l’époque, n’a jamais été réévaluée à la lumière du volume de trafic qui a suivi.
- Un audit de performance périodique, même léger, aurait permis de repérer ce type de coût bien plus tôt qu’un audit déclenché uniquement par un incident.
Le code qui fonctionne depuis cinq ans sans incident n’est pas nécessairement du bon code : c’est parfois simplement du code que personne n’a eu l’occasion de mesurer.
Pour aller plus loin
Ce dossier ne traite pas du programme d’affiliation lui-même ni des règles de calcul de commission, uniquement du coût technique d’un affichage devenu disproportionné par rapport à la fraîcheur réellement nécessaire de la donnée montrée. Un simple transient de quinze minutes a suffi à transformer un point de friction silencieux en un affichage quasi instantané, sans aucune perte d’information pertinente pour les visiteurs.