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

WordPress文章统计插件故障求助:仅显示最后一位用户

故障排查与修复方案

从你提供的代码片段和问题描述来看,插件只显示最后一位用户的核心原因有几个,咱们一步步拆解修复:

1. 核心问题分析

(1)用户ID遍历逻辑错误

你用count_users()获取的total_users是用户总数,但WordPress的用户ID不是连续递增的(比如删除过用户后,ID会出现断档)。循环for($id = 1;$id<=$total_users;$id++)会遍历很多不存在的用户ID,同时漏掉真实存在的高ID用户,而且这种遍历方式效率极低。

(2)变量覆盖导致数据丢失

每次循环里你用$result = $wpdb->get_results(...)覆盖了之前的$result变量(原本存储用户总数的那个),而且没有把每个用户的统计结果存入一个独立数组,循环结束后只会保留最后一次查询的结果,自然只显示最后一位用户。

(3)SQL语句不完整且关联逻辑缺失

你的SQL片段SELECT wp_users.ID, wp_users.display_name, COUNT(wp_posts.post...明显不完整,没有关联wp_users和wp_posts表的条件,也没有筛选有效文章(比如已发布的文章),会导致查询结果异常。

2. 修复后的完整代码

推荐用一次SQL联表查询来获取所有用户的文章统计,既高效又避免循环变量覆盖的问题:

function my_count_posts_by_user(){ 
    global $wpdb; 

    // 联表查询所有用户的已发布文章数量,包括0文章的用户
    $results = $wpdb->get_results("
        SELECT 
            u.ID, 
            u.display_name, 
            COUNT(p.ID) AS post_count
        FROM 
            {$wpdb->prefix}users u
        LEFT JOIN 
            {$wpdb->prefix}posts p ON u.ID = p.post_author 
            AND p.post_status = 'publish' 
            AND p.post_type = 'post' -- 如果需要统计页面可以改成'page',或者去掉这个条件统计所有类型
        GROUP BY 
            u.ID, u.display_name
        ORDER BY 
            post_count DESC, u.display_name ASC
    ");

    // 输出统计结果
    if($results){
        echo '<ul>';
        foreach($results as $user){
            echo '<li>' . esc_html($user->display_name) . ':' . intval($user->post_count) . ' 篇文章</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>暂无用户数据</p>';
    }
}

3. 关键改进点说明

  • 使用{$wpdb->prefix}代替硬编码的wp_,兼容不同数据库前缀的WordPress站点;
  • 用LEFT JOIN确保即使用户没有发布文章,也会被显示(文章数为0);
  • 增加post_status = 'publish'筛选已发布的文章,避免统计草稿、垃圾等无效内容;
  • 用GROUP BY按用户分组统计,一次性获取所有用户数据,避免循环查询数据库;
  • 用独立的$results数组存储所有用户的统计数据,不会被覆盖;
  • 用esc_html()和intval()做安全处理,防止XSS注入和数据异常。

4. 原代码的快速修复(如果你想保留循环逻辑)

如果你坚持用循环遍历用户,至少要修正ID遍历和变量存储的问题:

function my_count_posts_by_user(){ 
    global $wpdb; 

    // 获取所有用户的ID和名称,而不是遍历连续ID
    $users = $wpdb->get_results("SELECT ID, display_name FROM {$wpdb->prefix}users ORDER BY ID ASC");
    $user_stats = [];

    foreach($users as $user){
        // 统计当前用户的已发布文章数
        $post_count = $wpdb->get_var("
            SELECT COUNT(ID) 
            FROM {$wpdb->prefix}posts 
            WHERE post_author = {$user->ID} 
            AND post_status = 'publish' 
            AND post_type = 'post'
        ");
        $user_stats[] = [
            'name' => $user->display_name,
            'count' => intval($post_count)
        ];
    }

    // 输出结果
    if($user_stats){
        echo '<ul>';
        foreach($user_stats as $stat){
            echo '<li>' . esc_html($stat['name']) . ':' . $stat['count'] . ' 篇文章</li>';
        }
        echo '</ul>';
    }
}

这种方式虽然能解决问题,但多次循环查询数据库效率不如一次联表查询,推荐用第一种方案。

内容的提问来源于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:15:47