
本文介绍使用 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, '.', ',');
}
?>
<table class="woocommerce-category-value-table" style="width:100%; border-collapse:collapse; margin:1em 0;">
<thead>
<tr>
<th style="text-align:left; padding:8px; border-bottom:2px solid #eee;">分类</th>
<th style="text-align:center; padding:8px; border-bottom:2px solid #eee;">商品数</th>
<th style="text-align:right; padding:8px; border-bottom:2px solid #eee;">总售价</th>
</tr>
</thead>
<tbody>
<?php foreach ($categories as $category): ?>
<tr>
<td style="padding:8px; border-bottom:1px solid #f5f5f5;">
<a href="<?php echo esc_url(get_term_link($category)); ?>">
<?php echo esc_html($category->name); ?>
</a>
</td>
<td style="text-align:center; padding:8px; border-bottom:1px solid #f5f5f5;">
<?php echo (int) $product_count_per_category[$category->term_id]; ?>
</td>
<td style="text-align:right; padding:8px; border-bottom:1px solid #f5f5f5;">
<?php echo format_currency($totals_per_category[$category->term_id]); ?>
</td>
</tr>
<?php endforeach; ?>
<tr style="font-weight:bold; background-color:#f9f9f9;">
<td style="text-align:left; padding:8px;"><strong>总计</strong></td>
<td style="text-align:center; padding:8px;"><?php echo (int) $total_products_count; ?></td>
<td style="text-align:right; padding:8px;"><?php echo format_currency($total_all_categories); ?></td>
</tr>
</tbody>
</table>⚠️ 注意事项与最佳实践
- 性能提示:上述 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 小时级缓存,大幅提升并发性能。
通过本方案,您将获得一份语义清晰、样式可控、数据准确的分类价值报表——既满足业务需求,又保持代码简洁与可维护性。

















