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

WooCommerce Subscriptions限制单活跃订阅时如何保留升降级切换功能

WooCommerce Subscriptions 单活跃订阅限制兼容升降级功能解决方案

问题核心原因

原有代码未区分「新订阅购买」和「已有订阅升降级切换」场景:订阅升降级操作本质也是将目标订阅产品加入购物车,会触发woocommerce_add_to_cart_validation校验,因此被统一拦截。
WooCommerce Subscriptions的升降级操作会在加购请求中携带专属的switch-subscription参数,只需在校验逻辑中增加对该参数的判断,升降级场景直接跳过订阅数量校验即可解决问题。

调整后完整代码

add_filter('woocommerce_add_to_cart_validation', 'check_num_of_subscriptions', 10, 2);
function check_num_of_subscriptions( $valid, $product_id )
{
    // 新增逻辑:如果是订阅升降级请求,直接放行不拦截
    if ( isset( $_REQUEST['switch-subscription'] ) ) {
        return $valid;
    }

    $product_to_add = wc_get_product( $product_id );

    if ( $product_to_add instanceof WC_Product_Subscription || $product_to_add instanceof WC_Product_Variable_Subscription) {

        if ( has_active_subscription() ) {
            wc_clear_notices();
            wc_add_notice(__('你已经有一个活跃订阅,取消现有订阅前无法购买新的订阅产品。', 'woocommerce'), 'error');
            return false;
        } else {
            return true;
        }
    }
    return $valid;
}

function has_active_subscription()
{
    $user_id = get_current_user_id();
    // 改用官方内置函数判断活跃订阅,兼容性更强
    return wcs_user_has_subscription( $user_id, '', 'active' );
}

补充说明

  • 原有自定义查库判断活跃订阅的逻辑已替换为WooCommerce Subscriptions官方内置的wcs_user_has_subscription函数,避免后续版本升级数据库结构变动导致判断失效
  • 提示文案已调整为中文,可根据自身业务需求自行修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:06