You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:49:51