如何让指定WooCommerce商品或商品变体单独售卖
WooCommerce 指定商品/特定变体强制单独购买代码
以下是优化后的代码,已修复原代码逻辑缺陷,并支持新增需求:添加1个需单独购买的简单商品,以及2个可变商品中指定1个重量变体强制单独购买。
function wc_force_separate_purchase_validation( $passed, $product_id, $quantity, $variation_id, $variations ) { // 需要单独购买的简单商品ID数组(新增ID示例:1700) $alone_simple_products = array(1562, 1619, 1700); // 需要单独购买的变体ID数组(新增特定重量变体ID示例:1800) $alone_variations = array(1319, 1476, 1800); $flag = false; $target_product_name = ''; // 检查当前添加的是否是需单独购买的简单商品 if (in_array($product_id, $alone_simple_products) && empty($variation_id)) { $target_product = wc_get_product($product_id); $target_product_name = $target_product->get_name(); // 购物车非空时,不能添加该商品;购物车已有该商品时,不能添加其他商品 if (!WC()->cart->is_empty()) { $flag = true; } } // 检查当前添加的是否是需单独购买的变体 if (in_array($variation_id, $alone_variations)) { $target_variation = wc_get_product($variation_id); $parent_product = wc_get_product($target_variation->get_parent_id()); // 获取变体的格式化属性(比如"重量: 10kg") $variation_attrs = wc_get_formatted_variation($target_variation, true); $target_product_name = $parent_product->get_name() . ' (' . $variation_attrs . ')'; // 购物车非空时,不能添加该变体;购物车已有该变体时,不能添加其他商品 if (!WC()->cart->is_empty()) { $flag = true; } } // 检查购物车中是否已有需单独购买的商品/变体 if (!$flag && !WC()->cart->is_empty()) { foreach (WC()->cart->get_cart() as $cart_item) { $cart_product_id = $cart_item['product_id']; $cart_variation_id = $cart_item['variation_id']; // 购物车中有单独购买的简单商品,且当前添加的不是该商品 if (in_array($cart_product_id, $alone_simple_products) && $product_id != $cart_product_id) { $target_product = wc_get_product($cart_product_id); $target_product_name = $target_product->get_name(); $flag = true; break; } // 购物车中有单独购买的变体,且当前添加的不是该变体 if (in_array($cart_variation_id, $alone_variations) && $variation_id != $cart_variation_id) { $target_variation = wc_get_product($cart_variation_id); $parent_product = wc_get_product($target_variation->get_parent_id()); $variation_attrs = wc_get_formatted_variation($target_variation, true); $target_product_name = $parent_product->get_name() . ' (' . $variation_attrs . ')'; $flag = true; break; } } } // 触发错误提示 if ($flag) { wc_add_notice(sprintf( __('商品 <b>%s</b> 因物流安排,必须单独购买。', 'woocommerce'), $target_product_name ), 'error'); $passed = false; } return $passed; } add_filter('woocommerce_add_to_cart_validation', 'wc_force_separate_purchase_validation', 10, 5);
代码说明
- 数组配置:
$alone_simple_products:填入所有需要单独购买的简单商品ID,新增的简单商品ID直接追加到数组末尾即可。$alone_variations:填入所有需要单独购买的变体ID,只需将可变商品中需要单独购买的那个重量变体ID添加到数组。
- 逻辑优化:
- 修复原代码循环中提前
return导致仅检查第一个ID的问题,确保所有指定商品/变体都能被验证。 - 针对变体单独购买场景,显示包含属性的完整商品名称(如"XX商品 (重量: 10kg)"),提升用户体验。
- 双向验证:既阻止将其他商品加入已有单独购买商品的购物车,也阻止将单独购买商品加入已有其他商品的购物车。
- 修复原代码循环中提前
- 使用方法:将代码添加到主题的
functions.php文件或自定义插件中,替换示例ID为实际商品/变体ID即可。
内容的提问来源于stack exchange,提问作者Adam Fletcher
相关产品推荐
相关产品推荐

