WooCommerce订单如何按产品分类统计各分类商品订购总数量
核心遗漏的关键环节
- 最核心的统计逻辑错配:原代码用
count($items)算的是分类下的订单条目总数,完全没有读取每个订单项对应的实际购买数量。WooCommerce 的订单项本身就携带购买数量字段,通过$item->get_quantity()就能拿到当前条目对应的购买件数——比如用户买了2份芝士汉堡,这个值就是2,原代码完全没利用这个字段,自然算出来的结果和实际订购数对不上。 - 分类聚合的数组结构有缺陷:原代码只把订单项本身往分类数组里存,没有预留分类总数量的存储位置,后续渲染时要么得临时遍历明细累加数量,要么直接用错条目数当结果。
- 边界处理没做:原代码直接取分类数组的第一个元素
$terms[0],既没判断get_the_terms的返回值是不是报错、是不是空值,也没兼容单个产品绑定多个分类的场景,后续很容易出现无分类产品报错、多分类商品漏统计的问题。 - 标题逻辑混了无关字段:原代码输出的
$term->count是该分类在全店铺的在售商品总数,根本不是当前订单内的统计值,和你要的订单维度统计完全没关系。
修正后的可直接使用的代码
$categories = []; foreach ($order->get_items() as $item) { $product_id = $item->get_product_id(); // 读取当前订单项的实际购买数量 $item_quantity = $item->get_quantity(); // 保留你原本的meta过滤逻辑 $meta = $item->get_meta_data(); $meta = array_filter($meta, function ($meta_obj) { return !in_array($meta_obj->key, Order::getHiddenKeys()); }); $terms = get_the_terms($product_id, 'product_cat'); // 跳过无分类、或分类查询出错的异常情况 if (is_wp_error($terms) || empty($terms)) continue; // 兼容单产品绑定多分类的场景,每个关联分类都累加对应数量 foreach ($terms as $term) { $cat_id = $term->term_id; // 初始化分类的存储结构 if (!isset($categories[$cat_id])) { $categories[$cat_id] = [ 'total_quantity' => 0, 'items' => [] ]; } // 把当前条目的购买数量累加到对应分类的总计数里 $categories[$cat_id]['total_quantity'] += $item_quantity; // 存下该分类下的商品明细,后续可以直接遍历展示 $categories[$cat_id]['items'][] = $item; } } // 渲染每个分类的展示区块 foreach($categories as $category_id => $category_data){ $term = get_term_by( 'id', $category_id, 'product_cat' ); if (!$term) continue; ?> <tr> <td colspan="3"> <h4> <?php echo $term->name.' × '.$category_data['total_quantity']; ?> </h4> </td> </tr> <!-- 后续在此处循环渲染 $category_data['items'],即可展示对应分类下的所有商品明细 --> <?php }
按照这个逻辑运行的话,你举的例子:分类下有「芝士汉堡 ×2」「汉堡 ×1」两个条目,最终标题会正确显示「汉堡类 ×3」,完全符合你要的统计效果。
内容的提问来源于stack exchange,提问作者Feel Content
相关产品推荐
相关产品推荐

