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

Performance

Un vieux shortcode d’affiliation qui interrogeait Stripe sans cesse

Retour d'expérience sur un shortcode legacy appelant l'API Stripe en direct à chaque page d'un blog d'avis produits, corrigé par un cache de statut de commission.

Par Clément Hadrot • 23 décembre 2024 • 4 min de lecture • Aucun commentaire
Un vieux shortcode d'affiliation qui interrogeait Stripe sans cesse

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é

L'essentiel à retenir : Un shortcode ancien peut survivre plusieurs années sans jamais être revu ; Un appel API en direct dans le rendu d'un shortcode ralentit toute page qui l'utilise ; Un cache de quelques minutes suffit largement pour une donnée qui varie peu

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é

MesureAvant correctifAprès correctif
Temps du shortcode (hors cache transient)380 à 650 ms2 ms (lecture transient)
Appels API Stripe par jour (estimation)Plusieurs milliersUne 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.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi