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
相关产品推荐
相关产品推荐

