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

