在WooCommerce多供应商商城场景中,用户下单后订单可能包含多个不同供应商的商品,运营和结算环节需要按供应商维度拆分订单商品,同时统计每个供应商的商品总金额,本文就介绍具体的实现方法。

核心实现思路
实现多供应商订单商品分组与金额统计,核心逻辑分为三步:首先从订单对象中获取所有商品项,然后提取每个商品项对应的供应商信息,最后按照供应商ID对商品分组并计算总金额。WooCommerce的订单商品项默认会存储商品的关联信息,多供应商插件通常会在商品或商品项中添加供应商ID的自定义字段,我们可以通过这些字段获取供应商标识。
获取订单商品项
WooCommerce的WC_Order对象提供了get_items方法获取订单中的所有商品项,每个商品项是WC_Order_Item_Product类型的对象,我们可以通过这个对象获取商品ID、数量、单价等信息。
以下是获取订单所有商品项的基础代码:
<?php
// 假设$order_id是目标订单的ID
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// 获取订单所有商品项
$order_items = $order->get_items();
foreach ($order_items as $item_id => $item) {
// 商品项对象
$product = $item->get_product();
// 商品数量
$quantity = $item->get_quantity();
// 商品单价(含税费等,根据需求调整)
$item_total = $item->get_total();
}
?>
按供应商分组商品
多供应商插件通常会在商品后台添加供应商选择的自定义字段,比如在商品编辑页添加名为_vendor_id的自定义字段存储供应商ID,我们可以通过get_post_meta获取商品的供应商ID,然后按照这个ID对商品项分组。
以下是分组的核心代码:
<?php
$vendor_groups = [];
foreach ($order_items as $item_id => $item) {
$product = $item->get_product();
if (!$product) {
continue;
}
// 获取商品对应的供应商ID,根据实际插件字段名调整
$vendor_id = get_post_meta($product->get_id(), '_vendor_id', true);
// 如果没有供应商ID,归为平台自营
if (empty($vendor_id)) {
$vendor_id = 0;
}
// 初始化供应商分组
if (!isset($vendor_groups[$vendor_id])) {
$vendor_groups[$vendor_id] = [
'items' => [],
'total_amount' => 0
];
}
// 将商品项加入对应供应商分组
$vendor_groups[$vendor_id]['items'][] = $item;
// 累加该商品项的金额到供应商总金额
$vendor_groups[$vendor_id]['total_amount'] += $item->get_total();
}
?>
统计各供应商金额
上一步的分组逻辑中已经同步计算了每个供应商的商品总金额,我们还可以进一步扩展,统计每个供应商的商品数量、税费等更多信息,以下是完整的统计输出示例:
<?php
// 遍历分组结果输出统计信息
foreach ($vendor_groups as $vendor_id => $group) {
$vendor_name = $vendor_id > 0 ? get_userdata($vendor_id)->display_name : '平台自营';
$item_count = count($group['items']);
$total_amount = $group['total_amount'];
echo "供应商:{$vendor_name},商品数量:{$item_count},总金额:{$total_amount}元<br/>";
// 输出该供应商下的所有商品
foreach ($group['items'] as $item) {
$product_name = $item->get_name();
$quantity = $item->get_quantity();
echo "-- 商品名称:{$product_name},数量:{$quantity}<br/>";
}
}
?>
注意事项
- 不同多供应商插件的供应商ID存储位置可能不同,比如有的插件会把供应商ID存在商品项(order item)的自定义字段中,此时需要用
$item->get_meta('_vendor_id')获取,而不是从商品post meta获取,需要根据实际使用的插件调整获取逻辑。 - 金额统计时如果需要包含税费、运费等,需要额外获取订单的税费、配送费用,按照结算规则分摊到对应供应商,上述示例仅统计了商品项本身的总金额。
- 如果订单支持退款,还需要考虑部分退款的场景,统计时排除已退款的商品金额,避免结算错误。
封装为可复用函数
为了方便在多个场景使用,我们可以把上述逻辑封装为一个独立的函数,接收订单ID作为参数,返回分组后的统计结果:
<?php
function get_vendor_order_groups($order_id) {
$order = wc_get_order($order_id);
if (!$order) {
return [];
}
$order_items = $order->get_items();
$vendor_groups = [];
foreach ($order_items as $item_id => $item) {
$product = $item->get_product();
if (!$product) {
continue;
}
// 根据实际场景调整供应商ID获取方式
$vendor_id = get_post_meta($product->get_id(), '_vendor_id', true);
$vendor_id = empty($vendor_id) ? 0 : intval($vendor_id);
if (!isset($vendor_groups[$vendor_id])) {
$vendor_groups[$vendor_id] = [
'vendor_id' => $vendor_id,
'items' => [],
'total_amount' => 0,
'item_count' => 0
];
}
$vendor_groups[$vendor_id]['items'][] = $item;
$vendor_groups[$vendor_id]['total_amount'] += $item->get_total();
$vendor_groups[$vendor_id]['item_count'] += $item->get_quantity();
}
return $vendor_groups;
}
?>
调用这个函数就可以快速获取任意订单的供应商分组和金额统计结果,直接用于结算、报表等场景。
WooCommerce多供应商订单商品分组金额统计WordPress修改时间:2026-07-10 21:12:39