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

WooCommerce购物车添加验证异常求助:虚拟订阅商品规则失效

解决WooCommerce购物车虚拟产品添加验证逻辑问题

你的原代码仅在当前添加的是虚拟订阅产品时才触发检查,因此只能拦截「购物车已有虚拟简单/变量产品 + 添加虚拟订阅产品」的场景,无法覆盖条件2中「购物车已有虚拟订阅产品 + 添加虚拟简单/变量产品」的情况,导致规则失效。

以下是修正后的完整验证代码,可同时满足你提出的3条规则:

add_filter( 'woocommerce_add_to_cart_validation', 'custom_virtual_product_cart_validation', 10, 3 );
function custom_virtual_product_cart_validation( $passed, $product_id, $quantity ) {
    // 获取当前待添加的产品对象
    $product = wc_get_product( $product_id );
    if ( ! $product ) return $passed;

    // 标记当前产品的核心属性
    $current_is_virtual = $product->is_virtual();
    $current_is_sub = $product->is_type( 'subscription' );
    $current_is_simple_var = $product->is_type( array( 'simple', 'variable' ) );

    // 非虚拟产品直接通过验证
    if ( ! $current_is_virtual ) return $passed;

    // 遍历购物车已有商品,检查冲突
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $cart_product = $cart_item['data'];
        $cart_is_virtual = $cart_product->is_virtual();
        $cart_is_sub = $cart_product->is_type( 'subscription' );
        $cart_is_simple_var = $cart_product->is_type( array( 'simple', 'variable' ) );

        // 规则1:禁止同时添加多个虚拟订阅产品
        if ( $cart_is_virtual && $cart_is_sub && $current_is_virtual && $current_is_sub ) {
            wc_add_notice( __( '无法添加多个虚拟订阅产品到购物车。', 'woocommerce' ), 'error' );
            return false;
        }

        // 规则2:禁止虚拟订阅产品与虚拟简单/变量产品共存
        if ( 
            ( $cart_is_virtual && $cart_is_sub && $current_is_virtual && $current_is_simple_var ) ||
            ( $cart_is_virtual && $cart_is_simple_var && $current_is_virtual && $current_is_sub )
        ) {
            wc_add_notice( __( '虚拟订阅产品无法与虚拟简单/变量产品同时加入购物车。', 'woocommerce' ), 'error' );
            return false;
        }

        // 规则3:允许多个虚拟简单/变量产品共存,无需额外拦截
    }

    return $passed;
}

代码逻辑说明

  1. 前置判断:先筛选出虚拟产品,非虚拟产品直接通过验证,不干扰其他业务逻辑。
  2. 规则1处理:遍历购物车时,若已有虚拟订阅产品且当前添加的也是虚拟订阅产品,直接拦截并提示错误。
  3. 规则2处理:同时覆盖两种冲突场景——不管是购物车已有虚拟订阅、当前加虚拟简单/变量,还是购物车已有虚拟简单/变量、当前加虚拟订阅,都会触发拦截,解决了你原代码仅覆盖反转场景的问题。
  4. 规则3处理:因为没有冲突限制,所以无需额外代码,默认允许添加。

内容的提问来源于stack exchange,提问作者widkoinflm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:43:19