You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于消费金额创建WooCommerce优质客户排行榜?

WooCommerce 优质客户Top10排行榜实现方案

直接用WPDB查询数据库是最靠谱的解决办法——毕竟WC_Order_Query不支持按总价排序,遍历客户又搞不定访客订单,JS排序还受数据范围限制,直接查库能一次性解决这些问题。

实现步骤

  1. 从数据库筛选所有已完成的订单(post_type为shop_order,状态为wc-completed)
  2. 关联订单的总价(meta_key为_order_total)和用户ID(meta_key为_customer_user)字段
  3. 按用户ID分组,计算每个用户的总消费金额
  4. 按总消费降序排序,取前10条结果
  5. 区分注册用户和访客,补全对应信息

代码示例

获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:25:21