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

如何在woocommerce_init钩子中访问WC_SESSION_HANDLER的applied_coupons

问题:在woocommerce_init钩子中访问WC_SESSION_HANDLER的applied_coupons

我希望在woocommerce_init钩子中访问WC_SESSION_HANDLER的applied_coupons,实现仅当通过二维码或URL应用指定优惠券时才显示商品价格。

当前使用代码

function hide_prices_testcop_coupon($order_id) {
    global $woocommerce;

    $wc_session = $woocommerce->session;
    
    var_dump($wc_session);
    
    $coupons = array();

    $coupons = $wc_session->applied_coupons; 
    
    //if (!empty($coupons)) {
        if (in_array('testfullsitecoupon', $coupons)) {
            echo '<h1 style="color:green;">Coupon is Applied</h1>';
        }else{
            echo '<h1 style="color:red;">Coupon is not Applied</h1>';
            add_filter('woocommerce_is_purchasable', '__return_false');
                add_filter( 'woocommerce_get_price_html', '' );
        }
    //}
    }
add_action( 'woocommerce_init', 'hide_prices_testcop_coupon');

var_dump($wc_session)结果

object(WC_Session_Handler) #6503 (8) 
{ 
    ["_cookie":protected]=> string(55) "wp_woocommerce_session_bcb68b3833c74c2714057d937e0d99dc" 
    ["_session_expiring":protected]=> int(1665464629) 
    ["_session_expiration":protected]=> int(1665468229) 
    ["_has_cookie":protected]=> bool(false) 
    ["_table":protected]=> string(25) "wpze_woocommerce_sessions" 
    ["_customer_id":protected]=> string(32) "a2560019a017a8c5e1a84c4737b06d2c" 
    ["_data":protected]=> array(0) { } 
    ["_dirty":protected]=> bool(false)
}

我想要访问位于["_data":protected]数组中的applied_coupons,请问有什么解决建议?


解决方案

核心问题分析

  1. _data是WC_Session_Handler的受保护属性,不能直接通过$wc_session->applied_coupons访问,必须使用类提供的公共方法。
  2. woocommerce_init钩子触发时机过早,此时会话数据可能还未完全加载,导致_data为空。

具体解决步骤

  1. 使用WooCommerce会话类的公共方法获取数据
    WooCommerce提供了get()方法专门用于读取_data中的值,语法为:WC()->session->get('applied_coupons', array()),第二个参数是默认值,避免未设置时报错。

  2. 调整钩子触发时机
    改用template_redirect钩子,这个钩子在模板加载前执行,此时会话数据已经完全初始化,能保证获取到正确的优惠券信息。

  3. 修正价格过滤的错误写法
    原代码中add_filter( 'woocommerce_get_price_html', '' );无效,需要传递一个回调函数来返回空值或自定义提示。

修正后的完整代码

function hide_prices_for_specific_coupon() {
    // 确保WC会话已初始化
    if ( ! WC()->session ) {
        return;
    }

    // 获取已应用的优惠券列表,默认返回空数组
    $applied_coupons = WC()->session->get('applied_coupons', array());

    if ( in_array('testfullsitecoupon', $applied_coupons) ) {
        echo '<h1 style="color:green;">优惠券已应用</h1>';
    } else {
        echo '<h1 style="color:red;">优惠券未应用</h1>';
        // 禁用商品购买功能
        add_filter('woocommerce_is_purchasable', '__return_false');
        // 隐藏价格,可自定义返回文本
        add_filter('woocommerce_get_price_html', function() {
            return '';
            // 也可以返回提示:return '<span style="color:#999;">请使用指定优惠券查看价格</span>';
        });
    }
}
// 使用template_redirect替代woocommerce_init,确保会话数据可用
add_action( 'template_redirect', 'hide_prices_for_specific_coupon');

额外说明

  • 如果你的优惠券是通过URL参数(比如?coupon=testfullsitecoupon)应用的,WooCommerce会自动将其添加到会话中,上述代码可以正确获取到。
  • 若需要调试会话数据,可以在template_redirect钩子中使用var_dump(WC()->session->get('applied_coupons')),此时能看到正确的优惠券列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:10:53