如何在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,请问有什么解决建议?
解决方案
核心问题分析
_data是WC_Session_Handler的受保护属性,不能直接通过$wc_session->applied_coupons访问,必须使用类提供的公共方法。woocommerce_init钩子触发时机过早,此时会话数据可能还未完全加载,导致_data为空。
具体解决步骤
使用WooCommerce会话类的公共方法获取数据
WooCommerce提供了get()方法专门用于读取_data中的值,语法为:WC()->session->get('applied_coupons', array()),第二个参数是默认值,避免未设置时报错。调整钩子触发时机
改用template_redirect钩子,这个钩子在模板加载前执行,此时会话数据已经完全初始化,能保证获取到正确的优惠券信息。修正价格过滤的错误写法
原代码中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
相关产品推荐
相关产品推荐

