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
相关产品推荐
相关产品推荐

