WooCommerce用户登录后自定义会话数据丢失问题求助
解决WooCommerce结账登录后会话自定义数据丢失问题
问题原因
WooCommerce里访客会话和登录用户会话是独立存储的,用户在结账页登录时,系统会替换会话对象,导致访客阶段存入的custom_data丢失;同时原代码每次触发template_redirect时,若URL无参数会强制清空custom_data,进一步加剧了数据丢失问题。
解决方案
1. 修复会话数据设置逻辑,避免无参数时清空数据
修改原函数,仅当URL中存在对应参数时才更新会话字段,保留已有数据:
add_action( 'template_redirect', 'set_custom_variables_wc_session' ); function set_custom_variables_wc_session(){ // 先获取现有会话中的自定义数据,默认值为空数组 $custom_data = WC()->session->get('custom_data', ['src' => '', 'subid' => '']); // 仅当URL存在src参数时更新对应字段 if ( isset( $_GET['src'] ) ) { $custom_data['src'] = sanitize_text_field( $_GET['src'] ); } // 仅当URL存在subid参数时更新对应字段 if ( isset( $_GET['subid'] ) ) { $custom_data['subid'] = sanitize_text_field( $_GET['subid'] ); } // 更新会话数据 WC()->session->set('custom_data', $custom_data); }
2. 登录时迁移访客会话数据到用户会话
通过WooCommerce登录钩子,将访客阶段的custom_data转移到登录后的用户会话中:
add_action( 'woocommerce_customer_login_action', 'transfer_custom_data_to_user_session' ); function transfer_custom_data_to_user_session( $user ) { // 获取访客会话中存储的自定义数据 $visitor_custom_data = WC()->session->get('custom_data', ['src' => '', 'subid' => '']); // 若存在有效数据,写入登录后的用户会话 if ( !empty($visitor_custom_data['src']) || !empty($visitor_custom_data['subid']) ) { WC()->session->set('custom_data', $visitor_custom_data); } }
效果验证
- 访客携带
src和subid参数进入结账页,会话中会正确存储数据; - 用户在结账页登录后,系统会自动迁移访客会话的自定义数据到用户会话;
- 登录后返回结账页,执行
print_r(WC()->session->get('custom_data'))可看到数据完整保留。
内容的提问来源于stack exchange,提问作者needsumhelp
相关产品推荐
相关产品推荐

