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

Ajax授权后购物车被清空问题求助(附授权代码)

结账页Ajax授权后购物车自动清空的问题

我在结账页面实现了一个基于Ajax的用户授权表单,完成授权流程后,购物车会被自动清空,以下是我的授权逻辑代码:

$user = get_users([
    'meta_key' => 'phone_number',
    'meta_value' => $tel,
]);
if(!empty($user) && is_array($user)) $user = $user[0];
else $user = false;

if($user) {
    nocache_headers();
    wp_clear_auth_cookie();
    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID, true);

    echo json_encode(['success' => true, 'user' => [
        'name' => $user->nickname,
        'email' => $user->user_email,
        'tel' => $tel,
    ]]);
    die;
}

问题原因

购物车清空的核心原因是用户身份切换导致会话购物车数据丢失。WordPress/WooCommerce的购物车数据默认绑定当前用户的会话,执行wp_clear_auth_cookie()会销毁旧会话,wp_set_auth_cookie()初始化新用户会话时,不会继承原会话的购物车数据,因此购物车被清空。

解决方案

方案1:切换用户前后同步购物车数据

在切换用户身份前保存当前购物车的所有商品数据,切换完成后将数据恢复到新用户的购物车中,示例代码如下:

if($user) {
    // 保存当前购物车数据
    global $woocommerce;
    $cart_items = $woocommerce->cart->get_cart();

    nocache_headers();
    wp_clear_auth_cookie();
    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID, true);

    // 恢复购物车商品
    foreach ($cart_items as $item_key => $item) {
        $woocommerce->cart->add_to_cart(
            $item['product_id'],
            $item['quantity'],
            $item['variation_id'],
            $item['variation'],
            $item['cart_item_data']
        );
    }

    echo json_encode(['success' => true, 'user' => [
        'name' => $user->nickname,
        'email' => $user->user_email,
        'tel' => $tel,
    ]]);
    die;
}

方案2:移除会话销毁操作(谨慎使用)

若场景允许,可移除wp_clear_auth_cookie()调用,避免销毁原会话。但此方式可能存在身份混淆的安全风险,仅适用于无需严格隔离用户会话的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:50:18