# Dix snippets WooCommerce qui règlent les demandes clients courantes

> Texte du bouton panier, champs de commande, livraison gratuite ou redirection après ajout : dix correctifs WooCommerce prêts à copier dans functions.php.

- Auteur : Clément Hadrot
- Publié le : 2023-06-15
- Mis à jour le : 2023-06-15
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/dix-snippets-woocommerce-demandes-clients-courantes/

## L’essentiel

- Dix hooks WooCommerce prêts à l'emploi
- Filtres plutôt que surcharge de templates
- Compatibles avec la plupart des thèmes enfants

Un client qui vend des bougies artisanales m'a un jour envoyé une liste de douze demandes après la mise en ligne de sa boutique WooCommerce : « le bouton devrait dire Je commande », « il faut un champ pour le numéro d'appartement », « la livraison gratuite doit s'afficher plus tôt »… Aucune de ces demandes ne justifiait une extension supplémentaire. Toutes se règlent avec un filtre ou une action, en quelques lignes.

Voici dix snippets que je réutilise régulièrement, glanés au fil des projets pour des boutiques de tailles très différentes. Chacun s'ajoute dans le `functions.php` du thème enfant ou, mieux, dans une extension maison dédiée aux personnalisations métier.

## Renommer le texte des boutons

Le filtre `woocommerce_product_single_add_to_cart_text` change le texte du bouton sur la fiche produit, et `woocommerce_product_add_to_cart_text` fait de même sur les pages d'archive.

```
add_filter( 'woocommerce_product_single_add_to_cart_text', function () {
    return __( 'Je commande', 'mon-theme' );
} );
```

Pour un texte différent selon le type de produit (variable, externe), on peut tester `$product->is_type()` dans le même filtre avant de retourner la chaîne.

## Ajouter un champ à la commande

Le trio `woocommerce_after_order_notes`, `woocommerce_checkout_process` et `woocommerce_checkout_update_order_meta` permet d'ajouter, valider puis enregistrer un champ personnalisé, par exemple un numéro d'appartement ou un créneau de livraison.

> L'essentiel à retenir : Dix hooks WooCommerce prêts à l'emploi ; Filtres plutôt que surcharge de templates ; Compatibles avec la plupart des thèmes enfants

```
add_action( 'woocommerce_after_order_notes', function ( $checkout ) {
    woocommerce_form_field( 'creneau_livraison', [
        'type'        => 'select',
        'label'       => __( 'Créneau de livraison', 'mon-theme' ),
        'options'     => [
            'matin'    => __( 'Matin (8h-12h)', 'mon-theme' ),
            'apres_midi' => __( 'Après-midi (14h-18h)', 'mon-theme' ),
        ],
        'required'    => true,
    ], $checkout->get_value( 'creneau_livraison' ) );
} );

add_action( 'woocommerce_checkout_process', function () {
    if ( empty( $_POST['creneau_livraison'] ) ) {
        wc_add_notice( __( 'Merci de choisir un créneau de livraison.', 'mon-theme' ), 'error' );
    }
} );

add_action( 'woocommerce_checkout_update_order_meta', function ( $order_id ) {
    if ( ! empty( $_POST['creneau_livraison'] ) ) {
        update_post_meta( $order_id, '_creneau_livraison', sanitize_text_field( $_POST['creneau_livraison'] ) );
    }
} );
```

## Afficher la livraison gratuite plus tôt

Sur une boutique qui offrait la livraison au-delà de 60 €, le client voulait un message dès que le panier atteignait 40 €, pour inciter à l'achat complémentaire. Le hook `woocommerce_before_cart` associé à `WC()->cart->get_cart_contents_total()` suffit :

```
add_action( 'woocommerce_before_cart', function () {
    $seuil = 60;
    $total = WC()->cart->get_cart_contents_total();
    $reste = $seuil - $total;
    if ( $reste > 0 ) {
        echo '<p class="notice-livraison">';
        printf( __( 'Plus que %s pour la livraison offerte !', 'mon-theme' ), wc_price( $reste ) );
        echo '</p>';
    }
} );
```

## Rediriger après l'ajout au panier

Certains clients veulent envoyer l'acheteur directement vers le panier plutôt que rester sur la fiche produit. Un simple filtre sur l'URL de redirection règle le cas :

- `add_filter( 'woocommerce_add_to_cart_redirect', 'wc_get_cart_url' )` pour rediriger systématiquement vers le panier.
- Utile aussi pour rediriger vers une page de vente incitative, en retournant une URL personnalisée.

## Masquer un moyen de paiement selon la zone

Pour un client qui ne voulait proposer le paiement à la livraison qu'en France métropolitaine, le filtre `woocommerce_available_payment_gateways` a permis de retirer la passerelle sans toucher aux réglages globaux :

```
add_filter( 'woocommerce_available_payment_gateways', function ( $gateways ) {
    if ( isset( $gateways['cod'] ) && WC()->customer->get_shipping_country() !== 'FR' ) {
        unset( $gateways['cod'] );
    }
    return $gateways;
} );
```

### Autres demandes fréquentes

- Masquer le prix et remplacer le bouton d'ajout par « Sur devis » via `woocommerce_get_price_html`.
- Modifier le nombre d'articles par page dans le catalogue avec `loop_shop_per_page`.
- Ajouter une note automatique à chaque commande grâce à `woocommerce_checkout_update_order_meta`.
- Changer l'ordre des onglets produit via le filtre `woocommerce_product_tabs`.

> Avant d'écrire un snippet, je vérifie toujours qu'il n'existe pas déjà un réglage natif dans WooCommerce : la moitié des demandes se règlent dans les paramètres, sans une ligne de code.

## Bonnes pratiques pour ranger ces snippets

Regrouper ces personnalisations dans une extension maison plutôt que dans le thème évite de les perdre lors d'un changement de thème graphique. Je découpe généralement le fichier par domaine : `class-checkout-fields.php`, `class-shipping-messages.php`, etc., chargés depuis un fichier principal.

| Snippet | Hook principal | Risque si mal fait |
| --- | --- | --- |
| Champ de commande | woocommerce_checkout_update_order_meta | Donnée perdue si non enregistrée |
| Livraison gratuite | woocommerce_before_cart | Message qui ne se met pas à jour en AJAX |
| Masquer un paiement | woocommerce_available_payment_gateways | Blocage total si mal filtré |

## Notre verdict

Ces dix snippets couvrent l'essentiel des demandes reçues sur des boutiques de taille modeste à moyenne. Ils ont un avantage sur les extensions dédiées : ils ne chargent aucun script ou style supplémentaire, et restent lisibles pour la personne qui reprendra le projet dans deux ans. La seule discipline à tenir, c'est de documenter chaque filtre avec un commentaire expliquant la demande d'origine du client.
