
本文介绍使用 wordpress 原生函数与自定义 sql 查询,高效统计 woocommerce 各商品分类(product_cat)下所有商品 _regular_price 的总和,并生成带分类明细与总计行的响应式表格。
本文介绍使用 wordpress 原生函数与自定义 sql 查询,高效统计 woocommerce 各商品分类(product_cat)下所有商品 _regular_price 的总和,并生成带分类明细与总计行的响应式表格。
在 WooCommerce 网站中,有时需要向访客或管理员直观展示各商品分类的商业价值——即该分类下所有上架商品的常规售价(_regular_price)之和。这不仅适用于运营看板、内部报表,也可嵌入自定义页面作为营销数据展示。本文提供一套轻量、可靠且性能可控的实现方案,无需插件依赖,兼容主流 WooCommerce 版本(≥ 6.0)。
✅ 核心实现逻辑
我们分三步完成:
- 获取全部商品分类:使用 get_terms() 安全获取所有 product_cat 分类(含空分类);
- 逐分类统计价格总和:通过 $wpdb 执行优化 SQL,关联 wp_term_relationships 与 wp_postmeta 表,精准聚合 _regular_price;
- 渲染结构化表格:输出 HTML 表格,包含分类链接、商品数量、金额列,并自动计算总计行。
? 完整可运行代码(推荐放入自定义页面模板或短代码回调中)
<?php // 获取所有商品分类(按名称排序,保留空分类)
$categories = get_terms(
array(
'taxonomy' => 'product_cat',
'orderby' => 'name',
'hide_empty' => false,
'fields' => 'all'
)
);
// 防错处理:确保获取成功且非 WP_Error
if (is_wp_error($categories) || empty($categories)) {
echo '<p>暂无商品分类数据。</p>';
return;
}
global $wpdb;
$totals_per_category = [];
$product_count_per_category = [];
$total_all_categories = 0;
$total_products_count = 0;
foreach ($categories as $category) {
$term_id = $category->term_id;
// 统计该分类下有效商品数量(已发布、可见、有 regular_price)
$product_count = (int) $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(DISTINCT p.ID)
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND p.post_type = 'product'
AND tr.term_taxonomy_id = %d
AND pm.meta_key = '_regular_price'
AND pm.meta_value != ''",
$term_id
)
);
$product_count_per_category[$term_id] = $product_count;
// 统计该分类下所有商品 regular_price 总和(支持小数,保留两位精度)
$total_price = $wpdb->get_var(
$wpdb->prepare(
"SELECT COALESCE(SUM(CAST(pm.meta_value AS DECIMAL(10,2))), 0)
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND p.post_type = 'product'
AND tr.term_taxonomy_id = %d
AND pm.meta_key = '_regular_price'
AND pm.meta_value REGEXP '^[0-9]+(\.[0-9]{1,2})?$'",
$term_id
)
);
$totals_per_category[$term_id] = (float) $total_price;
$total_all_categories += $total_price;
$total_products_count += $product_count;
}
// 格式化货币(示例:使用 site 默认货币符号,支持千位分隔)
function format_currency($amount) {
$currency_symbol = get_woocommerce_currency_symbol();
return $currency_symbol . number_format($amount, 2, '.', ',');
}
?>
| 分类 | 商品数 | 总售价 |
|---|---|---|
| name); ?> | term_id]; ?> | term_id]); ?> |
| 总计 |
⚠️ 注意事项与最佳实践
- 性能提示:上述 SQL 已通过 JOIN 和 WHERE 条件优化,避免 PHP 层循环查询;若分类数极多(>200),建议添加数据库索引(如 wp_term_relationships.term_taxonomy_id + wp_postmeta.meta_key 联合索引)。
- 安全性:所有输出均经 esc_url()、esc_html() 及 number_format() 处理,防止 XSS 与格式异常。
- 空值处理:使用 COALESCE(..., 0) 确保空分类显示为 ¥0.00,而非 NULL。
- 扩展性:如需包含促销价(_sale_price)或库存状态过滤,仅需调整 SQL 的 WHERE 条件即可。
- 缓存建议:该数据变动频率低,强烈建议配合 wp_cache_set() / wp_cache_get() 实现 1 小时级缓存,大幅提升并发性能。
通过本方案,您将获得一份语义清晰、样式可控、数据准确的分类价值报表——既满足业务需求,又保持代码简洁与可维护性。











