如何基于消费金额创建WooCommerce优质客户排行榜?
WooCommerce 优质客户Top10排行榜实现方案
直接用WPDB查询数据库是最靠谱的解决办法——毕竟WC_Order_Query不支持按总价排序,遍历客户又搞不定访客订单,JS排序还受数据范围限制,直接查库能一次性解决这些问题。
实现步骤
- 从数据库筛选所有已完成的订单(post_type为
shop_order,状态为wc-completed) - 关联订单的总价(meta_key为
_order_total)和用户ID(meta_key为_customer_user)字段 - 按用户ID分组,计算每个用户的总消费金额
- 按总消费降序排序,取前10条结果
- 区分注册用户和访客,补全对应信息
代码示例
获取Top10客户数据的函数
function get_top_10_customers_by_spending() { global $wpdb; // 数据库查询语句,计算用户总消费与订单数 $query = " SELECT pm_user.meta_value AS user_id, SUM(CAST(pm_total.meta_value AS DECIMAL(10,2))) AS total_spent, COUNT(p.ID) AS order_count FROM {$wpdb->prefix}posts p LEFT JOIN {$wpdb->prefix}postmeta pm_total ON p.ID = pm_total.post_id AND pm_total.meta_key = '_order_total' LEFT JOIN {$wpdb->prefix}postmeta pm_user ON p.ID = pm_user.post_id AND pm_user.meta_key = '_customer_user' WHERE p.post_type = 'shop_order' AND p.post_status = 'wc-completed' AND pm_total.meta_value IS NOT NULL GROUP BY pm_user.meta_value ORDER BY total_spent DESC LIMIT 10 "; $results = $wpdb->get_results($query); $top_customers = []; foreach ($results as $result) { $user_id = (int)$result->user_id; $customer_info = []; if ($user_id === 0) { // 访客订单,直接标记信息 $customer_info['name'] = '访客'; $customer_info['email'] = '无'; } else { // 注册用户,拉取昵称与邮箱 $user = get_user_by('id', $user_id); $customer_info['name'] = $user->display_name ?: $user->user_login; $customer_info['email'] = $user->user_email; } $customer_info['total_spent'] = wc_price($result->total_spent); // 适配店铺货币格式 $customer_info['order_count'] = $result->order_count; $top_customers[] = $customer_info; } return $top_customers; }
在页面展示排行榜
将以下代码放入你想显示排行榜的模板文件(如sidebar.php、page-custom.php):
$top_customers = get_top_10_customers_by_spending(); if (!empty($top_customers)) { echo '<div class="top-customers-list">'; echo '<h3>优质客户Top10</h3>'; echo '<ul>'; foreach ($top_customers as $idx => $customer) { $rank = $idx + 1; echo '<li class="customer-item">'; echo '<span class="rank-badge">' . $rank . '</span>'; echo '<div class="customer-details">'; echo '<span class="customer-name">' . esc_html($customer['name']) . '</span>'; echo '<span class="customer-spent">总消费:' . $customer['total_spent'] . '</span>'; echo '<span class="customer-orders">订单数:' . $customer['order_count'] . '</span>'; echo '</div>'; echo '</li>'; } echo '</ul>'; echo '</div>'; }
方案优势
- 效率高:直接查询数据库,避免循环所有订单/客户,大数据量下也能快速返回结果
- 全覆盖:同时统计注册用户与访客订单,无遗漏
- 数据准确:仅计算已完成订单,排除未支付、取消的无效订单
- 灵活性强:可通过修改查询语句添加时间范围、调整订单状态等自定义条件
注意事项
- 数据库前缀:
{$wpdb->prefix}会自动适配你的数据库前缀,无需硬写wp_ - 订单状态:若需统计处理中的订单,可将
p.post_status = 'wc-completed'改为p.post_status IN ('wc-completed', 'wc-processing') - 性能优化:订单量极大时,可添加时间条件(如
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 1 YEAR))缩小查询范围,提升速度
内容的提问来源于stack exchange,提问作者Diogenes Oliveira Junior
相关产品推荐
相关产品推荐

