如何修改WooCommerce代码,仅强制特定类别商品使用优惠券?
解决WooCommerce特定类别商品强制使用优惠券的问题
嘿,我看你现在的代码是强制所有商品必须用优惠券,要改成只针对特定类别很简单,我们只需要在检查优惠券之前,先判断购物车里有没有属于目标类别的商品就行。
下面是修改后的完整代码,我会一步步解释关键部分:
add_action('woocommerce_check_cart_items', 'make_coupon_required_for_specific_category'); function make_coupon_required_for_specific_category() { // 这里定义需要强制优惠券的商品类别(用slug,多个的话用数组) $required_category_slugs = array('premium-products', 'vip-items'); // 如果想用类别ID的话,把上面一行换成下面的,比如: // $required_category_ids = array(15, 22); $has_required_category = false; global $woocommerce; // 遍历购物车里的每一件商品,检查是否属于目标类别 foreach ($woocommerce->cart->get_cart() as $cart_item) { $product = $cart_item['data']; // 用slug检查的话用这个 if (has_term($required_category_slugs, 'product_cat', $product->get_id())) { $has_required_category = true; break; // 只要找到一件就不用继续遍历了 } // 如果用ID检查的话,替换成下面的: // if (has_term($required_category_ids, 'product_cat', $product->get_id())) { // $has_required_category = true; // break; // } } // 只有当购物车里有目标类别商品,且没有应用优惠券时,才提示错误 if (($has_required_category) && empty($woocommerce->cart->applied_coupons)) { wc_add_notice( __('您的购物车中有特定类别的商品,必须使用优惠券才能结账!', 'woocommerce'), 'error' ); } }
关键说明:
- 目标类别设置:你可以根据自己的需求,选择用类别slug或者ID来指定,把对应的数组值改成你需要的类别即可。
- 购物车遍历检查:通过
has_term函数判断商品是否属于目标类别,只要购物车里有一件这类商品,就标记为需要强制优惠券。 - 错误提示:使用WooCommerce官方的
wc_add_notice函数来输出错误,这样样式会和系统提示统一,也能正确阻止结账流程。 - 兼容性:这段代码兼容WooCommerce最新版本,建议放到子主题的
functions.php文件里,或者用自定义代码插件来添加,避免主题更新时丢失代码。
测试的时候记得:
- 只添加非目标类别的商品,应该可以正常结账
- 添加目标类别的商品但不使用优惠券,会弹出错误提示
- 添加目标类别的商品并应用优惠券,就能正常继续结账
内容的提问来源于stack exchange,提问作者Crundi
相关产品推荐
相关产品推荐

