vendredi 25 septembre 2026

À propos

Contact

E-commerce

Coupons et promotions avancées sur WooCommerce : ce que les hooks permettent au-delà de l’admin

Cumul de coupons, remise conditionnée à un produit déjà présent dans le panier, coupon à usage unique par client : des recettes de personnalisation des promotions WooCommerce par le code.

Par Clément Hadrot • 6 février 2024 • 5 min de lecture • Aucun commentaire
Coupons et promotions avancées sur WooCommerce : ce que les hooks permettent au-delà de l'admin

« On voudrait offrir 10 % de plus si le client a déjà un produit de la gamme Confort dans son panier, mais seulement s’il n’a jamais utilisé ce coupon avant, et pas cumulable avec la remise de bienvenue. » Ce genre de demande, très courante côté marketing, dépasse largement ce que l’écran de création de coupon WooCommerce permet de configurer directement. Heureusement, le système de coupons repose sur une couche de hooks suffisamment riche pour couvrir la quasi-totalité de ces scénarios sur mesure.

Cet article détaille plusieurs recettes que nous réutilisons régulièrement pour des demandes promotionnelles qui sortent du cadre standard, sans jamais toucher au cœur du système de coupons.

Ajouter une condition d’éligibilité personnalisée

Le filtre woocommerce_coupon_is_valid permet de refuser un coupon selon n’importe quelle logique métier, en complément des conditions déjà configurables dans l’interface (montant minimum, produits éligibles, dates de validité) :

add_filter( 'woocommerce_coupon_is_valid', function ( $est_valide, $coupon ) {
    if ( 'GAMME-CONFORT10' === $coupon->get_code() ) {
        $panier_contient_gamme = false;
        foreach ( WC()->cart->get_cart() as $item ) {
            if ( has_term( 'gamme-confort', 'product_cat', $item['product_id'] ) ) {
                $panier_contient_gamme = true;
                break;
            }
        }
        if ( ! $panier_contient_gamme ) {
            throw new Exception( 'Ce code nécessite un produit de la gamme Confort dans le panier.' );
        }
    }
    return $est_valide;
}, 10, 2 );

Lever une Exception avec un message explicite, plutôt que de simplement retourner false, permet d’afficher au client la raison précise du refus, ce qui réduit nettement les sollicitations du service client pour un coupon « qui ne marche pas ».

Limiter un coupon à une utilisation unique par client, tous coupons confondus

WooCommerce permet nativement de limiter l’usage d’un coupon par client, mais uniquement pour ce coupon précis. Pour une règle transversale (« un seul coupon de bienvenue par client, quel que soit le code utilisé »), il faut vérifier l’historique de commandes du client au moment de l’application :

add_filter( 'woocommerce_coupon_is_valid', function ( $est_valide, $coupon ) {
    if ( has_term( 'bienvenue', 'product_cat', $coupon->get_id() ) || strpos( $coupon->get_code(), 'BIENVENUE' ) === 0 ) {
        $email_client = WC()->customer->get_billing_email();
        $commandes_precedentes = wc_get_orders( [
            'billing_email' => $email_client,
            'limit'         => 1,
            'return'        => 'ids',
        ] );
        if ( ! empty( $commandes_precedentes ) ) {
            throw new Exception( 'Ce code de bienvenue est réservé aux nouveaux clients.' );
        }
    }
    return $est_valide;
}, 10, 2 );
L'essentiel à retenir : L'interface d'administration des coupons ne couvre qu'une partie des scénarios promotionnels réels ; Le hook woocommerce_coupon_is_valid permet d'ajouter des conditions d'éligibilité sur mesure ; Un coupon cumulable mal contrôlé peut annuler la marge d'une commande entière

Interdire le cumul avec certains coupons spécifiques

Par défaut, WooCommerce autorise ou interdit le cumul global des coupons via un réglage unique, sans granularité par paire de coupons. Pour empêcher le cumul entre deux coupons précis tout en autorisant les autres combinaisons, il faut intercepter l’ajout du second coupon :

add_filter( 'woocommerce_coupon_is_valid', function ( $est_valide, $coupon ) {
    $codes_deja_appliques = WC()->cart->get_applied_coupons();

    $paires_incompatibles = [
        'BIENVENUE10' => 'GAMME-CONFORT10',
    ];

    foreach ( $paires_incompatibles as $code_a => $code_b ) {
        if ( $coupon->get_code() === strtolower( $code_b ) && in_array( $code_a, $codes_deja_appliques, true ) ) {
            throw new Exception( 'Ce code n\'est pas cumulable avec le code de bienvenue déjà appliqué.' );
        }
    }
    return $est_valide;
}, 10, 2 );

Générer des coupons à usage unique automatiquement

Pour une opération de fidélisation (un code personnel envoyé après chaque achat), la création manuelle de centaines de coupons n’est pas envisageable. La classe WC_Coupon permet de générer des coupons par programme, avec sauvegarde directe en base :

function generer_coupon_fidelite( $email_client ) {
    $code = 'MERCI-' . strtoupper( wp_generate_password( 6, false ) );
    $coupon = new WC_Coupon();
    $coupon->set_code( $code );
    $coupon->set_discount_type( 'percent' );
    $coupon->set_amount( 10 );
    $coupon->set_usage_limit( 1 );
    $coupon->set_email_restrictions( [ $email_client ] );
    $coupon->set_date_expires( strtotime( '+30 days' ) );
    $coupon->save();

    return $code;
}

La restriction par e-mail (set_email_restrictions) empêche que le code, s’il venait à être partagé, soit utilisable par une autre personne que la destinataire initiale — un détail souvent négligé qui rend une campagne de fidélisation vulnérable au partage sur les réseaux sociaux.

Surveiller l’impact réel sur la marge

Un coupon cumulable mal borné peut, combiné à d’autres promotions actives simultanément (soldes, remise de quantité), réduire une commande à une marge négative sans qu’aucune alerte ne se déclenche. Il est recommandé d’ajouter un contrôle de cohérence final, juste avant la validation de la commande, qui vérifie que le total remisé ne descend jamais sous un seuil de marge minimal défini par produit ou par catégorie.

Chaque campagne promotionnelle un peu élaborée mérite un test en environnement de recadrage avec un panier simulant le pire cas de cumul possible, avant sa mise en ligne. C’est la meilleure façon d’éviter la découverte, en fin de mois, d’une remise cumulée à 70 % jamais prévue.

En résumé

Le système de coupons de WooCommerce, limité en apparence à quelques cases à cocher dans l’administration, devient extrêmement flexible dès lors qu’on s’appuie sur ses hooks : conditions d’éligibilité sur mesure, contrôle fin du cumul, génération programmatique de codes personnels. La contrepartie de cette flexibilité est une vigilance accrue sur les combinaisons possibles, pour qu’une promotion bien intentionnée ne se transforme jamais en trou de marge inattendu.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi