Un magasin qui vend des articles fragiles facture un supplément d’emballage renforcé dès qu’un tel article rejoint le panier, sans passer par une extension tierce ni toucher à la configuration des méthodes d’expédition : le hook woocommerce_cart_calculate_fees suffit à coder cette règle métier directement.
Ce que ce hook expose et quand il s’exécute
Ce hook est déclenché depuis WC_Cart::calculate_fees(), une étape du calcul global des totaux du panier distincte du calcul de l’expédition ou des taxes. Il reçoit l’objet panier lui-même en argument, ce qui permet d’en parcourir le contenu avant de décider d’ajouter ou non un frais.
add_action( 'woocommerce_cart_calculate_fees', function( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
$contains_fragile = false;
foreach ( $cart->get_cart() as $cart_item ) {
if ( 'yes' === $cart_item['data']->get_meta( '_fragile' ) ) {
$contains_fragile = true;
break;
}
}
if ( $contains_fragile ) {
$cart->add_fee( 'Emballage renforcé', 4.50 );
}
} );
La vérification is_admin() && ! defined( 'DOING_AJAX' ) en début de callback est une précaution standard sur ce hook précis : il peut aussi être déclenché dans un contexte d’administration lors du calcul manuel d’une commande, où l’on ne veut généralement pas reproduire une règle pensée pour le tunnel d’achat public.
La taxabilité du frais, un paramètre à décider explicitement

La méthode add_fee() accepte plusieurs arguments au-delà du nom et du montant : un indicateur de taxabilité et, le cas échéant, une classe de taxe précise à appliquer à ce frais.
$cart->add_fee( 'Emballage renforcé', 4.50, true, '' );
Le troisième argument, à true, indique que ce frais doit être soumis à la taxe selon les règles standard de la boutique. Une erreur fréquente consiste à laisser ce paramètre à sa valeur par défaut sans y réfléchir : un frais non taxé alors qu’il devrait l’être fausse le total de TVA affiché, un écart qui ne saute pas toujours aux yeux tant que personne ne compare la TVA affichée au total réellement attendu.
Un recalcul qui peut arriver plus souvent qu’on ne l’imagine
WooCommerce recalcule les totaux du panier à de nombreuses occasions : ajout ou suppression d’un article, changement de quantité, changement d’adresse de livraison sur la page de commande, ou simple actualisation Ajax du récapitulatif. Le hook woocommerce_cart_calculate_fees se redéclenche à chaque fois. Un callback qui ajoute un frais sans condition claire, ou dont la condition dépend d’un état qui change entre deux recalculs, peut faire apparaître ou disparaître un frais de façon qui semble erratique au client si la logique n’est pas bien maîtrisée.
Ce qu’on vérifie systématiquement avant de valider ce type de règle en recette : recharger la page panier plusieurs fois de suite, avec et sans l’article déclencheur, pour s’assurer que le frais apparaît et disparaît de façon strictement cohérente avec le contenu réel du panier à cet instant précis.
Un frais négatif reste possible, avec prudence
La méthode add_fee() accepte également un montant négatif, ce qui permet techniquement de coder une réduction conditionnelle par ce même mécanisme plutôt que par un coupon classique. Cet usage reste toutefois marginal et moins lisible pour un client qu’une réduction affichée comme telle sur la ligne de coupon : il convient de le réserver à des cas où la logique de coupon standard de WooCommerce ne convient vraiment pas au besoin métier exprimé.
Ce qu’il faut retenir
woocommerce_cart_calculate_fees permet d’ajouter un supplément conditionné au contenu réel du panier, en s’appuyant sur l’objet panier transmis en argument pour construire la condition métier voulue. Décider explicitement de la taxabilité du frais et tester le recalcul dans plusieurs scénarios d’ajout et de retrait d’articles évitent les deux erreurs les plus fréquentes constatées sur ce hook.