WooCommerce结账页:仅向活跃订阅者显示订阅商品提示
修复WooCommerce订阅提示功能:仅购物车含订阅商品时显示提示
以下是修复后的完整代码,可实现仅当用户已有活跃订阅,且购物车中包含订阅商品时,在购物车/结账页显示提示:
add_action( 'woocommerce_before_cart', 'display_subscription_notice' ); add_action( 'woocommerce_before_checkout_form', 'display_subscription_notice' ); // 同时在结账页显示提示 function display_subscription_notice() { // 仅处理登录用户,游客无订阅无需提示 if ( ! is_user_logged_in() ) return; $user_id = get_current_user_id(); $has_active_sub = false; $has_sub_product_in_cart = false; // 检查用户是否存在活跃订阅 $user_subscriptions = wcs_get_users_subscriptions( $user_id ); foreach ( $user_subscriptions as $subscription ) { if ( $subscription->has_status( 'active' ) ) { $has_active_sub = true; break; } } // 检查购物车是否包含订阅商品 foreach ( WC()->cart->get_cart() as $cart_item ) { if ( wcs_is_subscription_product( $cart_item['product_id'] ) ) { $has_sub_product_in_cart = true; break; } } // 两个条件同时满足时展示提示 if ( $has_active_sub && $has_sub_product_in_cart ) { wc_add_notice( 'By purchasing a new subscription you will cancel your current one', 'notice' ); } }
关键修改说明:
替换错误的商品判断逻辑
原代码使用wcs_order_contains_subscription(),该函数用于检查订单是否包含订阅,而非判断单个商品是否为订阅类型。改用wcs_is_subscription_product()直接验证购物车商品的订阅属性。优化订阅查询效率
使用wcs_get_users_subscriptions()获取用户所有订阅,比自定义wcs_get_subscriptions()查询更高效,直接遍历即可判断是否存在活跃订阅。增加登录状态判断
跳过游客用户的无效查询,避免不必要的资源消耗。扩展提示展示场景
新增woocommerce_before_checkout_form钩子,确保提示在购物车和结账页都能显示,覆盖用户完整购物流程。逻辑变量清晰化
用独立布尔变量分别标记「有活跃订阅」和「购物车含订阅商品」两个条件,代码可读性更强,便于后续维护。
与现有取消订阅功能的适配说明
你之前实现的cancel_previous_active_subscription代码可以保留,该功能会在用户完成新订阅购买后,自动取消除最新一条外的所有活跃订阅,与修复后的提示功能形成完整逻辑闭环,保障用户感知与实际操作一致。
内容的提问来源于stack exchange,提问作者Marling
相关产品推荐
相关产品推荐

