# Les hooks WooCommerce indispensables pour personnaliser une boutique sans plugin

> Un tour d'horizon des actions et filtres WooCommerce les plus utiles pour modifier fiche produit, panier et tunnel de commande sans surcharger de templates.

- Auteur : Clément Hadrot
- Publié le : 2020-02-11
- Mis à jour le : 2020-02-11
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/hooks-woocommerce-indispensables-personnaliser-boutique/

## L’essentiel

- WooCommerce s'appuie sur les mêmes actions et filtres que WordPress core
- La majorité des personnalisations se font sans toucher un seul template
- Un hook mal placé peut casser le calcul des totaux du panier

Chaque semaine, un client demande la même chose sous des formes différentes : « Peut-on ajouter un message sous le bouton d'ajout au panier ? », « Peut-on masquer le prix pour les visiteurs non connectés ? », « Peut-on afficher un badge sur les produits en rupture ? ». À chaque fois, la tentation est de dupliquer un fichier de template WooCommerce dans le thème pour y glisser deux lignes. C'est rarement la bonne réponse.

WooCommerce a été conçu dès l'origine comme une extension profondément « hookable » : quasiment chaque bloc d'affichage et chaque étape de traitement est encadré par une action ou filtrable par un filtre. Apprendre à repérer le bon hook, c'est s'épargner des heures de maintenance et éviter que la moindre mise à jour de l'extension ne casse une surcharge de template devenue obsolète.

## Les actions de la fiche produit

La page produit est probablement l'endroit où les hooks WooCommerce sont les plus denses. Le fichier `content-single-product.php` déclenche une série d'actions numérotées qui définissent l'ordre d'affichage : `woocommerce_before_single_product`, `woocommerce_single_product_summary`, `woocommerce_after_single_product`. À l'intérieur du résumé, on retrouve notamment :

- `woocommerce_single_product_summary` (titre à la priorité 5, prix à 10, excerpt à 20, formulaire d'ajout au panier à 30, méta produit à 40, partage social à 50) ;
- `woocommerce_before_add_to_cart_button` et `woocommerce_after_add_to_cart_button`, parfaits pour ajouter un texte de réassurance ou un compte à rebours de promotion ;
- `woocommerce_product_meta_end`, souvent utilisé pour ajouter des informations de livraison ou un lien vers une fiche technique.

Ajouter un badge « Stock faible » sous le bouton d'achat tient alors en quelques lignes, sans surcharger le moindre fichier :

```
add_action( 'woocommerce_after_add_to_cart_button', function () {
    global $product;
    if ( $product->managing_stock() && $product->get_stock_quantity() > 0 && $product->get_stock_quantity() get_stock_quantity() )
        );
    }
} );
```

## Filtrer plutôt qu'afficher : les filtres de prix et de disponibilité

Les actions ajoutent du contenu ; les filtres modifient une valeur existante avant qu'elle ne soit utilisée. Pour du B2B, il est courant de masquer les prix aux visiteurs non connectés avec `woocommerce_get_price_html` :

```
add_filter( 'woocommerce_get_price_html', function ( $price, $product ) {
    if ( ! is_user_logged_in() ) {
        return '<a href="' . esc_url( wc_get_page_permalink( 'myaccount' ) ) . '">Connectez-vous pour voir le prix</a>';
    }
    return $price;
}, 10, 2 );
```

> L'essentiel à retenir : WooCommerce s'appuie sur les mêmes actions et filtres que WordPress core ; La majorité des personnalisations se font sans toucher un seul template ; Un hook mal placé peut casser le calcul des totaux du panier

Ce même principe s'applique à la disponibilité avec `woocommerce_is_purchasable`, à la description courte avec `woocommerce_short_description`, ou encore au texte du bouton d'ajout au panier avec `woocommerce_product_add_to_cart_text`. Dans tous les cas, la règle est identique : un filtre reçoit une valeur, la modifie, et la retourne — jamais d'affichage direct à l'intérieur.

## Panier et tunnel de commande

Le panier expose ses propres points d'ancrage : `woocommerce_before_cart_table`, `woocommerce_cart_collaterals` pour la zone des totaux et des codes promo, ou `woocommerce_cart_calculate_fees` pour ajouter des frais conditionnels, par exemple une éco-participation ou un supplément pour livraison en zone reculée :

```
add_action( 'woocommerce_cart_calculate_fees', function ( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    if ( $cart->get_cart_contents_weight() > 30 ) {
        $cart->add_fee( 'Supplément colis lourd', 9.90 );
    }
} );
```

Côté commande, `woocommerce_checkout_update_order_meta` permet d'enregistrer une méta personnalisée saisie sur un champ de checkout ajouté via `woocommerce_checkout_fields`, tandis que `woocommerce_order_status_changed` ouvre la porte à des automatisations : notification Slack interne, création d'un ticket de préparation, mise à jour d'un CRM externe.

## Repérer le bon hook sans deviner

Deviner un nom de hook au hasard est une perte de temps. Trois réflexes évitent cette impasse :

1. Chercher directement dans le code source de WooCommerce (dossier `templates/` et classes `class-wc-*`) : chaque `do_action` et `apply_filters` y est visible avec ses paramètres exacts.
2. Utiliser un plugin de débogage comme Query Monitor, qui liste tous les hooks déclenchés sur une page donnée, avec leurs callbacks attachés.
3. Consulter le *WooCommerce Hook Reference* officiel sur developer.woocommerce.com, régulièrement mis à jour à chaque version majeure.

> Sur nos projets, la règle interne est simple : avant de copier un template dans le thème, on cherche d'abord s'il existe un hook. En pratique, neuf demandes sur dix se résolvent sans surcharge de fichier.

## Les pièges à éviter

Un hook mal utilisé peut avoir des effets de bord sérieux. Modifier le prix affiché via `woocommerce_get_price_html` ne change que l'affichage : le prix réel utilisé pour le calcul des totaux reste celui du produit, ce qui peut créer une incohérence si l'objectif était réellement de changer le tarif — pour cela, il faut passer par `woocommerce_product_get_price` ou une règle de prix dynamique. De même, greffer une action lourde (appel API externe, requête SQL complexe) sur un hook déclenché à chaque affichage de fiche produit peut ralentir sérieusement une boutique à fort trafic : il vaut mieux mettre ces résultats en cache avec un transient.

## En résumé

Les hooks sont le langage natif de WooCommerce : ils permettent d'ajouter, de retirer ou de transformer un comportement sans jamais dupliquer un template entier. Prendre le temps de les identifier précisément, plutôt que de recopier un fichier PHP par réflexe, c'est garantir une boutique qui survit aux mises à jour et un code que la prochaine personne comprendra sans devoir comparer deux versions de `single-product.php` à la loupe.
