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
相关产品推荐
相关产品推荐

