# Dix ans de woocommerce_before_calculate_totals, ce que ce hook a vraiment changé

> Retour sur l'évolution des usages du hook woocommerce_before_calculate_totals et sur les pièges qu'il a longtemps posés aux développeurs WooCommerce.

- Auteur : Clément Hadrot
- Publié le : 2025-03-02
- Mis à jour le : 2025-03-02
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/dix-ans-woocommerce-before-calculate-totals/

## L’essentiel

- Un hook pensé pour un cas simple, détourné vers des usages complexes
- La répétition d'exécution reste le piège le plus fréquent
- Sa place dans le cycle du panier n'a jamais changé

2011 : WooCommerce sort ses premières versions publiques, et avec elles, un hook qui allait devenir l'un des plus utilisés — et l'un des plus mal compris — de tout l'écosystème : `woocommerce_before_calculate_totals`. Plus de dix ans plus tard, il continue de peupler des milliers de dépôts de code, souvent copié d'un projet à l'autre sans que son fonctionnement réel soit toujours maîtrisé.

Ce hook s'exécute juste avant que WooCommerce ne calcule les totaux du panier : sous-total, remises, taxes, total général. Son rôle d'origine était simple — permettre de modifier le prix d'un article du panier avant que le calcul ne s'exécute, par exemple pour appliquer une remise conditionnelle. Ce qui a changé au fil des années, ce n'est pas le hook lui-même, mais l'ampleur de ce qu'on lui a demandé de faire.

## Un hook pensé pour un cas simple, étendu vers des usages complexes

Dans les premières années de WooCommerce, les exemples de code circulant sur les forums utilisaient ce hook presque exclusivement pour des ajustements de prix directs : une remise fixe pour les membres connectés, un supplément pour un poids de commande élevé. La signature du hook n'a pratiquement pas bougé depuis :

```
add_action( 'woocommerce_before_calculate_totals', function( $cart ) {
    foreach ( $cart->get_cart() as $item ) {
        // ajustement du prix de l'article avant calcul des totaux
    }
} );
```

Avec la maturité de l'écosystème, ce même hook s'est retrouvé mobilisé pour des logiques bien plus ambitieuses : tarification dynamique par palier de quantité, remises cumulables selon des règles métier complexes, ajustements liés à des programmes de fidélité maison. Le hook n'a jamais changé de nature, mais la complexité du code qui s'y accroche a considérablement augmenté, sans que sa documentation officielle n'évolue au même rythme.

## Le piège de la répétition d'exécution

> L'essentiel à retenir : Un hook pensé pour un cas simple, détourné vers des usages complexes ; La répétition d'exécution reste le piège le plus fréquent ; Sa place dans le cycle du panier n'a jamais changé

Le problème le plus persistant associé à ce hook n'a, lui non plus, jamais vraiment changé en dix ans : `woocommerce_before_calculate_totals` peut s'exécuter plusieurs fois au cours d'une même requête, notamment lors des mises à jour AJAX du panier. Un code qui modifie un prix sans condition de garde applique alors sa modification plusieurs fois de suite.

```
add_action( 'woocommerce_before_calculate_totals', function( $cart ) {
    foreach ( $cart->get_cart() as $item ) {
        $prix_de_base = $item['data']->get_regular_price();
        $item['data']->set_price( $prix_de_base * 0.9 ); // toujours à partir du prix de base
    }
} );
```

La correction, connue depuis longtemps mais encore fréquemment oubliée par des développeurs découvrant ce hook, consiste à toujours partir d'une valeur de référence stable — le prix régulier de l'article — plutôt que de modifier une valeur déjà transformée par un passage précédent. Ce n'est pas une subtilité récente : elle figure dans des exemples corrigés qui circulent depuis les toutes premières années de discussions autour de ce hook.

### Ce que les versions successives de WooCommerce n'ont pas changé

Il serait tentant de penser que dix ans d'évolution de WooCommerce ont modifié la place de ce hook dans le cycle de calcul du panier. Ce n'est pas le cas : sa position — juste avant le calcul des totaux, après la constitution du contenu du panier — est restée stable à travers toutes les versions majeures, y compris après l'introduction du stockage des commandes en tables dédiées à partir de la mi-2022. Ce hook concerne le panier en session, pas la persistance des commandes, ce qui explique pourquoi il n'a jamais été concerné par cette évolution architecturale.

## Ce que l'usage de ce hook révèle sur l'écosystème WooCommerce

L'histoire de ce hook illustre un phénomène plus large : dans un système construit sur les hooks WordPress, les points d'extension pensés pour des cas simples deviennent, avec le temps, les fondations de logiques métier bien plus lourdes que prévu à l'origine. Ce n'est pas un défaut de conception — c'est la conséquence naturelle d'une architecture extensible utilisée par une communauté nombreuse et créative pendant plus d'une décennie.

- 2011-2015 : usages majoritairement simples, remises fixes ou conditionnelles
- 2016-2020 : montée des extensions de tarification dynamique s'appuyant massivement sur ce hook
- 2021 à aujourd'hui : coexistence avec des logiques de panier plus riches (blocs de panier, API Store), sans que ce hook ne perde sa place centrale côté session panier classique

> Un hook qui survit dix ans sans changer de signature n'est pas un hook figé : c'est un hook dont la stabilité a permis à des usages toujours plus complexes de s'y accrocher sans crainte de rupture.

## Ce que cet article ne couvre pas

Cet historique ne traite pas de la mise en œuvre de remises multiples cumulées, sujet déjà détaillé ailleurs sur ce blog. L'objectif ici est de comprendre l'évolution des usages de ce hook précis, pas de fournir une nouvelle recette de tarification.

## En résumé

Dix ans après sa sortie, `woocommerce_before_calculate_totals` reste le hook central pour tout ajustement de prix avant calcul des totaux du panier. Sa position dans le cycle n'a pas bougé, son piège principal — la répétition d'exécution — non plus. Ce qui a changé, c'est l'ambition des développeurs qui s'y appuient, passant d'ajustements simples à des moteurs de tarification entiers, construits sur un point d'extension conçu à l'origine pour un besoin bien plus modeste.
