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

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' );
    }
}

关键修改说明:

  1. 替换错误的商品判断逻辑
    原代码使用wcs_order_contains_subscription(),该函数用于检查订单是否包含订阅,而非判断单个商品是否为订阅类型。改用wcs_is_subscription_product()直接验证购物车商品的订阅属性。

  2. 优化订阅查询效率
    使用wcs_get_users_subscriptions()获取用户所有订阅,比自定义wcs_get_subscriptions()查询更高效,直接遍历即可判断是否存在活跃订阅。

  3. 增加登录状态判断
    跳过游客用户的无效查询,避免不必要的资源消耗。

  4. 扩展提示展示场景
    新增woocommerce_before_checkout_form钩子,确保提示在购物车和结账页都能显示,覆盖用户完整购物流程。

  5. 逻辑变量清晰化
    用独立布尔变量分别标记「有活跃订阅」和「购物车含订阅商品」两个条件,代码可读性更强,便于后续维护。

与现有取消订阅功能的适配说明

你之前实现的cancel_previous_active_subscription代码可以保留,该功能会在用户完成新订阅购买后,自动取消除最新一条外的所有活跃订阅,与修复后的提示功能形成完整逻辑闭环,保障用户感知与实际操作一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:05:23