Aller au contenu principal

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.

PHP
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

  1. WooCommerce Code Reference, WC_Cart::add_fee() woocommerce.github.io