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

如何在WooCommerce中获取购物车?AJAX分享购物车返回空问题

一、如何在WooCommerce中获取购物车?

获取WooCommerce购物车分不同场景处理:

  • 前端页面:直接调用全局对象 WC()->cart 即可,WooCommerce在前端会自动初始化购物车实例,可直接调用其方法(如 get_cart() 获取商品列表、get_total() 获取总价)。
  • 后端/admin界面:默认不会自动加载购物车,需要先调用 wc_load_cart() 完成初始化,之后再使用 WC()->cart。
  • AJAX请求:无论用户是否登录,都需要先调用 wc_load_cart(),同时确保AJAX请求能正确关联会话(未登录用户依赖WP会话保存购物车数据)。
二、AJAX请求返回购物车为空的问题排查与解决

你的代码存在几个关键问题,导致返回空购物车:

  1. AJAX钩子命名错误
    你使用的 wp_ajax_ajax 和 wp_ajax_nopriv_ajax 中,后缀 ajax 是AJAX请求的action参数值,过于模糊且易冲突,建议改为具体名称(比如get_user_cart),确保前端请求的action参数与钩子后缀完全一致。

  2. 购物车加载逻辑错误
    你先判断 WC()->cart->is_empty() 再加载购物车,但此时WC()->cart尚未初始化,判断结果不准确。正确做法是先强制加载购物车,再进行后续操作。

  3. 直接返回WC_Cart对象会序列化失败
    WC()->cart是包含大量资源属性的对象,直接用wp_send_json返回会导致部分数据无法序列化,最终返回空或不完整数据。需要提取你需要的具体字段(如商品列表、总价等)。

  4. 未登录用户会话处理
    wp_ajax_nopriv_*钩子对应未登录用户,需确保WP会话能正确传递,前端AJAX请求要自动携带cookie(jQuery AJAX默认会处理),否则无法获取未登录用户的购物车数据。

修正后的代码:

public function __construct(){
    add_action('admin_menu', [$this, 'renderAdmin']);
    // 修改钩子后缀为具体的action名称
    add_action('wp_ajax_get_user_cart'       , [$this, 'myAjax'] );
    add_action('wp_ajax_nopriv_get_user_cart', [$this, 'myAjax'] );
}

public function myAjax(){
    defined( 'WC_ABSPATH' ) || exit;
    
    // 强制加载购物车,初始化WC()->cart实例
    wc_load_cart();
    
    // 提取可序列化的购物车核心数据
    $cart_response = [
        'item_count' => WC()->cart->get_cart_contents_count(),
        'subtotal'   => WC()->cart->get_subtotal(),
        'total'      => WC()->cart->get_total(),
        'items'      => []
    ];
    
    // 遍历购物车商品,提取所需信息
    foreach (WC()->cart->get_cart() as $item_key => $cart_item) {
        $product = $cart_item['data'];
        $cart_response['items'][] = [
            'product_id'   => $product->get_id(),
            'product_name' => $product->get_name(),
            'quantity'     => $cart_item['quantity'],
            'price'        => $product->get_price(),
            'line_total'   => $cart_item['line_total']
        ];
    }
    
    // 返回成功响应
    wp_send_json_success($cart_response);
}

前端请求示例(jQuery):

jQuery.ajax({
    url: ajaxurl, // WP全局变量,默认已定义
    type: 'POST',
    data: {
        action: 'get_user_cart' // 对应钩子的后缀名称
    },
    success: function(response){
        console.log(response.data);
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:43:11