如何调整Woocommerce API调用以获取多店铺订单数据?
多店铺WooCommerce订单统一获取方案
当然可以实现多店铺订单的统一拉取,你可以通过以下方式调整原有代码:
核心调整点
- 把每个店铺的API地址、密钥信息整理成配置数组,批量处理请求
- 用
Promise.all并行发起多个店铺的API请求,避免串行请求拖慢速度 - 给每个订单添加店铺标识,方便后续区分订单来源
- 合并所有店铺的订单后统一排序,再渲染到表格中
调整后的完整代码
// 多店铺配置:每个店铺的名称、API地址、密钥对 const stores = [ { name: '主店铺', url: 'https://www.enterwebsite.co.za/wp-json/wc/v3/orders', consumerKey: '店铺1的API_KEY', consumerSecret: '店铺1的API_SECRET' }, { name: '分店1', url: 'https://www.secondstore.co.za/wp-json/wc/v3/orders', consumerKey: '店铺2的API_KEY', consumerSecret: '店铺2的API_SECRET' }, // 继续添加第3、4个店铺的配置 ]; // 封装单个店铺的订单请求为Promise function fetchStoreOrders(store) { return new Promise((resolve, reject) => { $.ajax({ url: store.url, type: 'GET', beforeSend: function(xhr) { // 生成Basic认证字符串 const auth = btoa(`${store.consumerKey}:${store.consumerSecret}`); xhr.setRequestHeader('Authorization', `Basic ${auth}`); }, data: { orderby: 'id', order: 'desc', per_page: 10, offset: 0 }, success: function(response) { if (response && Array.isArray(response)) { // 给每个订单添加店铺标识 const ordersWithStore = response.map(order => ({ ...order, storeName: store.name })); resolve(ordersWithStore); } else { reject(`无效响应:${store.name}`); } }, error: function(xhr, textStatus, errorThrown) { reject(`请求失败:${store.name} - ${textStatus}`); } }); }); } // 批量请求所有店铺的订单 Promise.all(stores.map(store => fetchStoreOrders(store).catch(err => { console.error(err); return []; // 单个店铺请求失败时返回空数组,不影响整体合并 }))) .then(allOrders => { // 合并所有店铺的订单数组 const mergedOrders = allOrders.flat(); // 按订单创建时间倒序排序(统一排序,避免各店铺订单混乱) mergedOrders.sort((a, b) => new Date(b.date_created) - new Date(a.date_created)); // 转换为表格所需的HTML结构 const tableRows = mergedOrders.map(function(order) { var orderId = order.id; var clientName = order.billing && order.billing.first_name && order.billing.last_name ? `${order.billing.first_name} ${order.billing.last_name}` : ''; var orderDate = order.date_created ? new Date(order.date_created).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) : ''; var shipping = ''; var delivery = ''; var total = order.total ? parseFloat(order.total).toFixed(2) : ''; if (order.shipping && order.shipping.address_1 && order.shipping.city && order.shipping.country) { shipping = `${order.shipping.address_1}, ${order.shipping.city}, ${order.shipping.country}`; } if (order.meta_data && order.meta_data.length >= 7) { delivery = order.meta_data[5].value; } return [ `<a href="od?oid=${orderId}" class="row-link order-number">${orderId}</a>`, clientName, `<a href="#orderPreview${orderId}" data-toggle="modal" class="row-link" title="Preview"><i class="fas fa-eye" data-toggle="tooltip" data-placement="left" title="Preview"></i></a>`, orderDate, shipping, delivery, `R ${total}`, // 新增店铺列,显示订单来源 order.storeName ]; }); // 更新DataTable var table = $('#newOrders').DataTable(); // 注意:如果原有表格没有店铺列,需要先在HTML表格中添加对应的<th>表头 table.clear().rows.add(tableRows).draw(); }) .catch(err => { console.error('整体请求异常:', err); });
额外注意事项
- 确保每个店铺都开启了REST API,并且生成了具有读取订单权限的API密钥(在WooCommerce设置->高级->REST API中创建)
- 如果原有DataTable没有店铺列,需要在HTML的表格头部添加
<th>店铺</th>,否则新增的店铺信息无法正常显示 - 可以根据需求调整
per_page、offset等参数,或者添加更多筛选条件(比如按订单状态筛选)
内容的提问来源于stack exchange,提问作者Ruaan Dreyer
相关产品推荐
相关产品推荐

