Comment activer le paiement à la livraison pour certaines régions seulement dans WooCommerce
Guide pratique pour restreindre le paiement à la livraison par région dans WooCommerce, via les zones d'expédition ou un petit snippet, sans plugin superflu.
Le paiement à la livraison (COD) rassure les clients, mais on veut rarement le proposer partout. Peut-être que votre transporteur ne gère le contre-remboursement que dans certaines zones, peut-être que vous avez trop de colis refusés dans certaines régions, ou vous voulez le COD en local et le paiement en ligne ailleurs. Bonne nouvelle : WooCommerce permet exactement cela.
Le piège, c'est qu'il n'existe pas de bouton "accepter le COD dans la région A mais pas ailleurs". La méthode de paiement à la livraison est liée aux méthodes d'expédition, pas directement à une région. Une fois ce point compris, le reste est simple. Je vous montre deux voies propres : une sans code, avec les Zones d'expédition, et une avec un petit snippet qui filtre selon la région de l'adresse. Choisissez celle qui colle à votre boutique.
Pourquoi on ne peut pas cocher "COD par région"
Dans WooCommerce, la passerelle Paiement à la livraison n'a qu'un réglage utile pour la restreindre : "Activer pour les méthodes d'expédition". Il n'y a aucun champ de région dans les réglages de paiement.
La vraie logique est donc :
- La région du client détermine dans quelle Zone d'expédition tombe la commande.
- La zone d'expédition détermine quelles méthodes d'expédition le client voit.
- La méthode d'expédition détermine si le COD apparaît ou non.
Vous n'activez pas "le COD par région" directement — vous construisez des zones par région et vous liez le COD aux méthodes de ces zones. C'est détourné, mais stable, ne dépend d'aucun plugin et survit aux mises à jour. Vérifiez que votre commande demande bien le champ région/état sous Réglages > Général, sinon le filtre n'a rien à lire.
Méthode 1 (sans code) : Zones d'expédition + "Activer pour les méthodes d'expédition"
L'approche la plus propre, recommandée si vous préférez ne pas toucher au code.
- Allez dans WooCommerce > Réglages > Expédition > Zones d'expédition.
- Créez une zone "COD autorisé" et n'y ajoutez que les régions où vous acceptez le COD. WooCommerce permet d'ajouter des états/régions individuels à une zone.
- Dans cette zone, ajoutez la méthode d'expédition sur laquelle le COD doit s'appuyer (ex. "Livraison transporteur").
- Créez une deuxième zone (ou utilisez "Emplacements non couverts") pour le reste du pays, avec les mêmes méthodes d'expédition, mais là vous bloquerez le COD.
- Allez dans WooCommerce > Réglages > Paiements > Paiement à la livraison > "Activer pour les méthodes d'expédition" et sélectionnez UNIQUEMENT la méthode de la zone "COD autorisé".
Résultat : un client d'une région autorisée voit le COD, un autre non. Sans code, sans plugin.
Méthode 2 (avec code) : un snippet qui filtre par région
Si les zones compliquent trop votre expédition (vous avez déjà des tarifs par zone et ne voulez pas les dupliquer), vous pouvez masquer le COD directement selon la région de l'adresse. Placez le snippet dans le functions.php de votre thème enfant ou dans un plugin de snippets (Code Snippets) :
```php
add_filter( 'woocommerce_available_payment_gateways', 'mpo_cod_par_region' );
function mpo_cod_par_region( $gateways ) {
if ( is_admin() && ! wp_doing_ajax() ) {
return $gateways;
}
// Régions où vous ACCEPTEZ le COD (codes d'état WooCommerce)
$autorisees = array( 'CJ', 'TM', 'IF', 'B' );
$region = WC()->customer ? WC()->customer->get_shipping_state() : '';
if ( ! in_array( $region, $autorisees, true ) && isset( $gateways['cod'] ) ) {
unset( $gateways['cod'] );
}
return $gateways;
}
```
Les codes sont ceux des états/régions WooCommerce de votre pays. Modifiez la liste et c'est fait. Pour inverser la logique (COD partout SAUF quelques régions), mettez les régions bloquées dans le tableau et inversez la condition in_array.
Tests et pièges fréquents
Avant de crier victoire, vérifiez :
- Testez avec de vraies adresses de régions différentes. Ajoutez un produit au panier, allez au paiement et changez la région de livraison — les méthodes de paiement se mettent à jour via AJAX, vous devriez voir le COD apparaître et disparaître en direct.
- Attention région de facturation vs. livraison. Le snippet ci-dessus lit la région de livraison (shipping_state). Si votre boutique n'utilise que l'adresse de facturation, passez à get_billing_state().
- Le cache peut mentir. Avec un plugin de cache ou un CDN, videz-le après vos modifications, sinon vous voyez l'ancien paiement.
- N'oubliez pas les frais de COD. La restriction par région décide qui peut payer cash, mais ajouter un supplément COD est un réglage à part (des frais sur la méthode de paiement, ou via un snippet woocommerce_cart_calculate_fees).
Testez toujours sur un environnement de préproduction avant la mise en ligne, surtout si vous touchez functions.php.
Quand demander de l'aide (et comment nous travaillons)
Avec une règle simple — quelques régions en COD, paiement en ligne pour le reste — vous le faites vous-même en quelques minutes avec les méthodes ci-dessus. L'aide devient utile quand la logique se complique : COD seulement au-dessus d'un certain montant, une autre règle par catégorie de produit, plus des frais de COD variables par zone. Là, un plugin de paiements conditionnels ou du code sur mesure économise des heures et évite les commandes perdues à cause de règles contradictoires.
Chez MPO Web Studio, nous construisons et maintenons des boutiques WooCommerce à distance, pour des clients partout dans le pays. Nous pouvons configurer correctement vos zones, votre COD par région et vos frais, ou vous montrer sur une démo à quoi cela ressemblerait avant tout paiement. Si vous voulez un coup de main, écrivez-nous sur WhatsApp : nous vous dirons honnêtement si c'est un bricolage de 10 minutes ou si cela vaut une vraie intervention.
Questions fréquentes
Puis-je accepter le COD partout sauf quelques régions ?+
Oui. C'est plus simple avec le snippet : mettez les régions BLOQUÉES dans le tableau et inversez la condition — si la région du client y figure, retirez la passerelle cod. Avec les zones, faites l'inverse : placez les exceptions dans une zone séparée sans méthode d'expédition liée au COD.
Quels codes de région WooCommerce utilise-t-il ?+
Des codes courts par pays. Chaque état/région a un code que vous trouvez dans le fichier des états du pays, ou en inspectant la valeur du menu déroulant région au paiement. Utilisez exactement ces codes dans votre liste autorisée, sinon la correspondance échoue.
Le filtre lit-il l'adresse de facturation ou de livraison ?+
Celle que vous choisissez. Dans le snippet, get_shipping_state() utilise l'adresse de livraison et get_billing_state() celle de facturation. Pour le COD, l'adresse de livraison est logique, car c'est là que va le colis. Choisissez selon les champs demandés au paiement.
Ai-je besoin d'un plugin ?+
Pas pour les cas simples. La méthode par Zones d'expédition est entièrement native, et le snippet ne demande qu'un accès à functions.php ou un plugin gratuit de snippets. Un plugin dédié de paiements conditionnels ne vaut le coup que pour des règles combinées (montant + catégorie + région).
Pourquoi le COD n'apparaît-il pas alors que tout est réglé ?+
Le plus souvent : le cache du paiement n'a pas été vidé, la région du client ne correspond pas exactement à un code de votre liste, ou le champ région/état est désactivé dans les Réglages. Videz le cache et testez au paiement en changeant de région pour confirmer que les méthodes se rafraîchissent.
7 erreurs qui font fuir vos clients de votre site
Laissez votre e-mail et recevez le guide ici, tout de suite. Sans spam.
Envie de voir à quoi ressemblerait le site de votre entreprise ?
Écrivez-nous sur WhatsApp et nous vous préparons gratuitement un site de démonstration au nom de votre entreprise. Vous le voyez d'abord, puis vous décidez — sans engagement.