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

如何调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:53:16