WordPress插件开发问题:用户文章统计仅显示最后一条记录
解决WordPress插件中用户文章数表格只显示最后一条的问题
兄弟,我一看你这问题就知道大概率踩了数组赋值的坑,再加上用count_users()的方式不对,咱们一步步来捋:
先说说你现有代码的问题
count_users()用错了:这个函数返回的是总用户数和各角色的用户统计(比如管理员有几个、编辑有几个),根本拿不到具体的用户ID列表。而且用户ID不一定是从1到总用户数连续的(比如删过用户的话ID会断号),用它来循环用户ID完全不靠谱,会漏掉很多真实用户。- 数组赋值覆盖了旧数据:你在for循环里应该是每次把新数据直接赋值给
$result,而不是追加到数组里(比如写了$result = ...而不是$result[] = ...),这样循环到最后,$result里就只剩最后一次循环的那条数据了。
给你个靠谱的解决方案
直接用WordPress的$wpdb做关联查询,一次性拿到所有用户的ID、用户名和对应的文章数,然后再循环输出表格,既高效又不会出错:
global $wpdb; // 关联用户表和文章表,统计每个用户的已发布文章数 $user_post_counts = $wpdb->get_results( "SELECT u.ID, u.user_login, COUNT(p.ID) AS post_count FROM {$wpdb->users} u LEFT JOIN {$wpdb->posts} p ON u.ID = p.post_author AND p.post_status = 'publish' AND p.post_type = 'post' GROUP BY u.ID ORDER BY post_count DESC", ARRAY_A ); // 输出HTML表格 echo '<table border="1">'; echo '<tr><th>用户ID</th><th>用户名</th><th>文章数量</th></tr>'; foreach ($user_post_counts as $user) { echo '<tr>'; echo '<td>' . esc_html($user['ID']) . '</td>'; echo '<td>' . esc_html($user['user_login']) . '</td>'; echo '<td>' . esc_html($user['post_count']) . '</td>'; echo '</tr>'; } echo '</table>';
代码里的细节说明
- 用
LEFT JOIN是为了保证即使某个用户一篇文章都没写,也会显示出来(文章数为0)。 - 加了
p.post_status = 'publish'和p.post_type = 'post',只统计已发布的文章,如果你要算草稿或者其他类型的内容,可以调整这两个条件。 - 用
esc_html()来转义输出内容,避免XSS安全问题,这在WordPress开发里是必须的哦。
内容的提问来源于stack exchange,提问作者skirnich57
相关产品推荐
相关产品推荐

