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

WordPress插件开发:如何按Number_of_posts值排序用户数组?

解决WordPress用户文章数排序问题

看起来你现在的代码思路有点绕——循环每个用户ID单独查询,不仅效率低,还没法直接拿到所有用户的统计数据来排序。我给你两种靠谱的解决方案,优先推荐第一种:

方案一:直接在SQL中排序(最高效)

数据库层面排序比PHP排序更高效,而且能一次性拿到所有用户的文章统计,不用循环查询。你可以修改SQL语句,加上ORDER BY,同时注意用LEFT JOIN(如果要包含没发过文章的用户),还要过滤掉草稿、页面这类非文章内容:

global $wpdb;
// 一次性获取所有用户的已发布文章数并按数量降序排序
$user_post_stats = $wpdb->get_results("
    SELECT {$wpdb->prefix}users.ID, {$wpdb->prefix}users.display_name, COUNT({$wpdb->prefix}posts.post_author) AS Number_of_posts
    FROM {$wpdb->prefix}users
    LEFT JOIN {$wpdb->prefix}posts 
        ON {$wpdb->prefix}users.ID = {$wpdb->prefix}posts.post_author 
        AND {$wpdb->prefix}posts.post_type = 'post' 
        AND {$wpdb->prefix}posts.post_status = 'publish'
    GROUP BY {$wpdb->prefix}users.ID, {$wpdb->prefix}users.display_name
    ORDER BY Number_of_posts DESC
");

// 生成HTML表格
if (!empty($user_post_stats)) {
    echo '<table border="1" cellpadding="8">';
    echo '<thead><tr><th>用户ID</th><th>显示名称</th><th>文章数量</th></tr></thead>';
    echo '<tbody>';
    foreach ($user_post_stats as $user) {
        echo '<tr>';
        echo '<td>' . esc_html($user->ID) . '</td>';
        echo '<td>' . esc_html($user->display_name) . '</td>';
        echo '<td>' . esc_html($user->Number_of_posts) . '</td>';
        echo '</tr>';
    }
    echo '</tbody></table>';
}

关键说明:

  • 用{$wpdb->prefix}替代硬写的wp_,适配不同用户的表前缀设置
  • LEFT JOIN确保没发过文章的用户也会被显示(文章数为0),如果只想要有文章的用户,换成INNER JOIN即可
  • post_type = 'post'和post_status = 'publish'确保只统计已发布的文章,排除草稿、页面、自定义文章类型等

方案二:用PHP对查询结果排序(适合特殊场景)

如果因为某些限制没法在SQL里排序,你可以先用SQL拿到所有用户的统计数组,再用usort函数排序:

// 假设你已经一次性拿到了所有用户的统计数组(不要循环单个用户查询!)
$user_post_stats = $wpdb->get_results("
    SELECT {$wpdb->prefix}users.ID, {$wpdb->prefix}users.display_name, COUNT({$wpdb->prefix}posts.post_author) AS Number_of_posts
    FROM {$wpdb->prefix}users
    LEFT JOIN {$wpdb->prefix}posts 
        ON {$wpdb->prefix}users.ID = {$wpdb->prefix}posts.post_author 
        AND {$wpdb->prefix}posts.post_type = 'post' 
        AND {$wpdb->prefix}posts.post_status = 'publish'
    GROUP BY {$wpdb->prefix}users.ID, {$wpdb->prefix}users.display_name
");

// 按文章数降序排序
usort($user_post_stats, function($a, $b) {
    // 升序排序的话,改成 return $a->Number_of_posts - $b->Number_of_posts;
    return $b->Number_of_posts - $a->Number_of_posts;
});

// 之后再生成表格即可,代码和方案一的表格部分一致

为什么你的原代码有问题?

你现在是循环每个用户ID单独查询,每个ID都发起一次数据库请求,不仅效率极低,而且每次只能拿到单个用户的数据,根本没法形成一个完整的数组来排序。一定要改成一次性查询所有用户的统计数据,再处理排序和展示。

内容的提问来源于stack exchange,提问作者skirnich57

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:23:41