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

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

效果验证

  1. 访客携带src和subid参数进入结账页,会话中会正确存储数据;
  2. 用户在结账页登录后,系统会自动迁移访客会话的自定义数据到用户会话;
  3. 登录后返回结账页,执行print_r(WC()->session->get('custom_data'))可看到数据完整保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:47