
本文介绍在 woocommerce 中准确统计并显示当前登录用户已完成订单数量的方法,解决直接使用 `wc_get_customer_order_count()` 无法过滤订单状态的问题。
在 WooCommerce 用户面板(如 My Account 页面)中,开发者常需展示用户“已成功支付并完成”的订单数,而非全部订单(含待付款、已取消、处理中等状态)。wc_get_customer_order_count($user_id) 默认统计所有订单状态,因此无法满足该需求。
推荐使用 WooCommerce 4.0+ 引入的 wp_wc_order_stats 数据表(汇总统计表),它专为高性能查询设计,包含 status 和 customer_id 字段,适合高效统计。以下是一个安全、可复用的函数实现:
function get_completed_order_count_for_current_user() {
if (!is_user_logged_in()) {
return 0;
}
global $wpdb;
$table_name = $wpdb->prefix . 'wc_order_stats';
$user_id = get_current_user_id();
$count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM {$table_name}
WHERE customer_id = %d AND status = %s",
$user_id,
'wc-completed'
)
);
return (int) $count;
}✅ 使用方式(在模板中调用):
⚠️ 注意事项:
- 确保你的 WooCommerce 版本 ≥ 4.0,且 wp_wc_order_stats 表已启用(默认开启,可通过「WooCommerce → 状态 → 工具」检查「订单统计」是否启用);
- 切勿拼接用户输入到 SQL 查询中——本方案使用 $wpdb->prepare() 防止 SQL 注入;
- 若需兼容旧版 WooCommerce(
// 兼容旧版(仅作备选,慎用于高并发场景)
function get_completed_order_count_legacy($user_id) {
$orders = wc_get_orders([
'status' => ['completed'],
'limit' => -1,
'customer' => $user_id,
'return' => 'ids',
]);
return count($orders);
}? 总结: 优先采用 wp_wc_order_stats 表进行统计,兼顾准确性与性能;始终校验用户登录状态,并使用预处理语句保障安全性;避免在循环或页脚等高频位置重复执行未缓存的查询——必要时可结合 wp_cache_set/get 进行结果缓存。










