Combien de fois l’API de calcul de taxes est-elle appelée pendant qu’un client ajuste les quantités de son panier avant de passer commande ? Sur une boutique WooCommerce utilisant Stripe Tax pour calculer automatiquement la TVA selon la localisation de l’acheteur, la réponse observée était : six fois en moyenne, pour un panier ajusté trois fois avant validation. Chaque appel ajoute entre 150 et 300 millisecondes de latence réseau, ressenties directement par l’utilisateur au moment du recalcul du total.
Ce recalcul systématique se justifie en théorie : le montant de taxe dépend du contenu exact du panier et de l’adresse de livraison. Mais dans la majorité des cas, ces deux paramètres ne changent pas entre deux ajustements de quantité successifs pour les mêmes produits, ce qui ouvre la voie à un cache de courte durée.
Le problème : une clé de cache trop grossière
La première tentative, naïve, consistait à mettre en cache la réponse de Stripe Tax pendant toute la durée de la session, indépendamment du contenu du panier. Résultat : un client qui ajoutait un second article se voyait afficher le montant de taxe calculé pour le premier article seul, ce qui fausse le total affiché avant même le paiement. Une clé de cache mal construite est pire que l’absence de cache : elle introduit une erreur silencieuse dans un montant financier.
La solution : une clé composée du contenu réel du panier
La clé de cache doit refléter exactement ce qui influence le résultat du calcul de taxe : le contenu du panier (produits et quantités), l’adresse de livraison, et la devise. Toute variation de l’un de ces éléments doit invalider le cache :
function get_cached_tax_result( WC_Cart $cart, array $address ) {
$cart_signature = md5( wp_json_encode( array_map(
function ( $item ) {
return $item['product_id'] . ':' . $item['quantity'];
},
$cart->get_cart()
) ) );
$cache_key = 'stripe_tax_' . md5(
$cart_signature . serialize( $address ) . get_woocommerce_currency()
);
$cached = get_transient( $cache_key );
if ( false !== $cached ) {
return $cached;
}
$result = call_stripe_tax_api( $cart, $address );
set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS );
return $result;
}
Pourquoi cinq minutes, et pas plus
La durée de vie du transient a été fixée à cinq minutes, une valeur choisie pour couvrir le temps moyen qu’un client passe à ajuster son panier avant de valider, sans risquer d’afficher un taux périmé si une règle fiscale change en cours de session. Sur ce projet, les taux de TVA appliqués ne varient jamais en cours de journée : la fenêtre de cinq minutes ne présente donc aucun risque d’incohérence réglementaire, seulement un risque d’incohérence si le panier change sans que la clé de cache s’en aperçoive, raison pour laquelle la signature du panier doit être calculée avec soin.

Variante : un taux qui change en cours de commande
Certaines configurations B2B appliquent des règles de taxe différentes selon le statut du client (particulier, professionnel avec numéro de TVA intracommunautaire validé). Dans ce cas, la clé de cache doit également intégrer cet état, sans quoi un client professionnel validant son numéro de TVA en cours de session verrait encore s’afficher l’ancien taux jusqu’à expiration du cache :
$cache_key = 'stripe_tax_' . md5(
$cart_signature . serialize( $address ) . get_woocommerce_currency()
. ( WC()->customer->get_meta( 'vat_validated' ) ? 'b2b' : 'b2c' )
);
Une invalidation explicite du transient doit également être déclenchée par le hook déclenché lors de la validation du numéro de TVA, plutôt que d’attendre l’expiration naturelle du cache :
- Invalidation sur changement de quantité ou de produit dans le panier (signature recalculée automatiquement).
- Invalidation explicite sur le hook de mise à jour de l’adresse de livraison.
- Invalidation explicite sur la validation ou l’invalidation d’un numéro de TVA intracommunautaire.
En résumé
Mettre en cache un appel à une API de calcul de taxes réduit sensiblement la latence perçue lors de l’ajustement d’un panier, à condition que la clé de cache reflète fidèlement tout ce qui peut faire varier le résultat : contenu du panier, adresse, devise, et le cas échéant statut fiscal du client. Une durée de vie courte, de l’ordre de quelques minutes, suffit à absorber la majorité des recalculs redondants sans jamais afficher un montant obsolète à l’écran.