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

使用WooCommerce.NET调用WooCommerce API v2获取全部订单问题

解决WooCommerce.NET获取全部订单的分页问题

你已经迈出了正确的一步——通过per_page参数调整单页返回数量,但这里有个关键细节:WooCommerce API的分页机制意味着如果你的订单总数超过单页上限(哪怕你设了50),只调用一次GetAll()只能拿到第一页的数据。要真正获取所有订单,你需要循环遍历所有分页,直到没有更多数据返回。

下面是完整的实现代码,我帮你优化了逻辑,还用上了API允许的最大per_page值(100)来减少请求次数:

try {
    WooRestAPI rest = new WooRestAPI(baseUrl, key, secret);
    WCObject wc = new WCObject(rest);
    
    List<Order> allOrders = new List<Order>();
    int currentPage = 1;
    const int perPage = 100; // WooCommerce API允许的最大单页数量
    List<Order> pageOrders;

    do {
        var parameters = new Dictionary<string, string>() {
            { "page", currentPage.ToString() },
            { "per_page", perPage.ToString() }
        };
        
        // 获取当前页的订单
        pageOrders = await wc.Order.GetAll(parameters);
        allOrders.AddRange(pageOrders);
        
        currentPage++;
    } while (pageOrders.Count == perPage); // 只要当前页返回满额,就继续取下一页

    orders = ExtractWooData(allOrders);
    WriteToConsole(orders);
    WriteToFile(orders, outputPath);
}
catch (Exception ex) {
    // 记得加上异常处理,避免程序崩溃
    Console.WriteLine($"获取订单出错: {ex.Message}");
}

如果你想更精准地控制循环次数,可以从API响应头里获取总页数(X-WP-TotalPages),这样能避免多余的请求,示例如下:

try {
    WooRestAPI rest = new WooRestAPI(baseUrl, key, secret);
    WCObject wc = new WCObject(rest);
    
    List<Order> allOrders = new List<Order>();
    int currentPage = 1;
    const int perPage = 100;
    List<Order> pageOrders;

    // 第一次请求,同时获取总页数
    var initialParams = new Dictionary<string, string>() {
        { "page", currentPage.ToString() },
        { "per_page", perPage.ToString() }
    };
    pageOrders = await wc.Order.GetAll(initialParams);
    allOrders.AddRange(pageOrders);

    // 从响应头解析总页数
    if (int.TryParse(rest.ResponseHeaders["X-WP-TotalPages"], out int totalPages)) {
        // 从第2页开始循环到最后一页
        for (currentPage = 2; currentPage <= totalPages; currentPage++) {
            var parameters = new Dictionary<string, string>() {
                { "page", currentPage.ToString() },
                { "per_page", perPage.ToString() }
            };
            pageOrders = await wc.Order.GetAll(parameters);
            allOrders.AddRange(pageOrders);
        }
    }

    orders = ExtractWooData(allOrders);
    WriteToConsole(orders);
    WriteToFile(orders, outputPath);
}
catch (Exception ex) {
    Console.WriteLine($"获取订单失败: {ex.Message}");
}

几个小提醒:

  • 不要把per_page设得超过100,这是WooCommerce API的硬限制,设高了也会被自动截断成100
  • 如果你的店铺订单量很大,注意API的调用频率限制,避免短时间内请求过多导致被限流
  • 记得处理异常,比如网络问题、API密钥错误、权限不足等情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:26