寻求Woocommerce钩子:特定优惠券按产品类别设差异化折扣
实现特定优惠券下不同产品类别的差异化折扣(Woocommerce)
当然能实现这个需求啦!我们可以借助Woocommerce的核心钩子woocommerce_before_calculate_totals,搭配优惠券验证逻辑,轻松搞定不同类别商品的差异化折扣。下面是一步步的实现方案:
核心实现思路
- 先验证目标优惠券是否已经被应用到购物车
- 遍历购物车内的每一件商品,检查它所属的产品类别
- 针对类别A的商品设置10%折扣,类别B的商品设置20%折扣
- 确保只有目标优惠券生效时才触发这个自定义折扣,避免和其他优惠逻辑冲突
完整代码示例
你可以把这段代码添加到子主题的functions.php文件中,或者使用自定义代码插件来部署:
add_action('woocommerce_before_calculate_totals', 'custom_category_discount_for_specific_coupon', 10, 1); function custom_category_discount_for_specific_coupon($cart) { // 防止循环调用导致的异常 if (is_admin() && !defined('DOING_AJAX')) return; if (did_action('woocommerce_before_calculate_totals') >= 2) return; // 替换成你实际要触发的优惠券代码 $target_coupon_code = 'your-target-coupon'; $is_coupon_applied = false; // 检查购物车是否应用了目标优惠券 foreach ($cart->get_applied_coupons() as $applied_coupon) { if ($applied_coupon === $target_coupon_code) { $is_coupon_applied = true; break; } } // 如果目标优惠券没被使用,直接退出 if (!$is_coupon_applied) return; // 替换成你实际的产品类别slug或ID $category_a_slug = 'category-a'; $category_b_slug = 'category-b'; // 遍历购物车内的所有商品 foreach ($cart->get_cart() as $cart_item_key => $cart_item) { $product = $cart_item['data']; $product_id = $cart_item['product_id']; // 判断商品所属类别并设置折扣比例 if (has_term($category_a_slug, 'product_cat', $product_id)) { $discount_percent = 10; } elseif (has_term($category_b_slug, 'product_cat', $product_id)) { $discount_percent = 20; } else { // 不属于A/B类别的商品不应用自定义折扣 continue; } // 计算折扣后价格并更新商品价格 $original_price = $product->get_regular_price(); $discounted_price = $original_price * (100 - $discount_percent) / 100; $product->set_price($discounted_price); } }
关键说明与注意事项
- 替换占位内容:记得把代码里的
your-target-coupon、category-a、category-b替换成你实际的优惠券代码和产品类别slug/ID - 类别优先级:如果一件商品同时属于A和B两类,代码会优先应用A类的10%折扣,你可以调整
if/elseif的顺序来改变优先级 - 代码部署建议:优先使用子主题的
functions.php,避免主题更新导致代码丢失;如果不熟悉代码编辑,也可以用类似Code Snippets的插件来添加 - 测试验证:修改代码后记得清空购物车缓存,或者用无痕浏览器测试,确保折扣逻辑正常生效
内容的提问来源于stack exchange,提问作者Manik
相关产品推荐
相关产品推荐

