WooCommerce
Ajouter des frais ou une remise selon le contenu du panier
Fiche écrite en 2021, pour les navigateurs et les versions de l’époque. Vérifiez qu’elle correspond encore à votre environnement avant de l’appliquer.
« 5 % de remise dès trois paquets de café », « 2,50 € de frais sous 20 € d’achat » : ces règles simples ne justifient pas une extension de promotions de plus. WooCommerce prévoit un hook exactement pour ça, appelé à chaque recalcul du panier.
add_action('woocommerce_cart_calculate_fees', function (WC_Cart $panier) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
// Remise de 5 % sur les cafés, dès 3 articles de la catégorie « cafe »
$quantite = 0;
$montant = 0;
foreach ($panier->get_cart() as $ligne) {
if (has_term('cafe', 'product_cat', $ligne['product_id'])) {
$quantite += $ligne['quantity'];
$montant += $ligne['line_subtotal'];
}
}
if ($quantite >= 3) {
$panier->add_fee('Remise café (5 %)', -round($montant * 0.05, 2), true);
}
// Frais de préparation sous 20 € d'achat
if ($panier->get_subtotal() < 20) {
$panier->add_fee('Frais de préparation', 2.50, true);
}
});
La remise est calculée sur line_subtotal, le montant des seuls produits concernés, et non sur tout le panier. Un frais négatif fonctionne comme une remise ; le troisième paramètre de add_fee() indique qu’il est soumis à la TVA, ce qui garde des factures justes. Pour une réduction qu’un client doit saisir, un code promo natif reste préférable : ce hook sert aux règles automatiques.
Sources
- WooCommerce Code Reference, WC_Cart::add_fee() woocommerce.github.io