纯代码实现WordPress显示同时在线人数

纯代码实现WordPress显示同时在线人数(仅管理员和编辑可见)

方法一:以下是实现WordPress显示同时在线人数(仅管理员和编辑可见)的完整解决方案:


// 记录用户在线状态
function track_online_users() {
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $online_users = get_transient('online_users');
        
        if (false === $online_users) {
            $online_users = array();
        }
        
        $online_users[$user_id] = time();
        set_transient('online_users', $online_users, 300); // 5分钟过期
    }
}
add_action('init', 'track_online_users');

// 显示在线用户数
function display_online_users() {
    if (current_user_can('edit_posts')) { // 仅管理员和编辑可见
        $online_users = get_transient('online_users');
        $count = is_array($online_users) ? count($online_users) : 0;
        
        // 清理15分钟未活动的用户
        if (is_array($online_users)) {
            foreach ($online_users as $user_id => $time) {
                if (time() - $time > 900) { // 15分钟
                    unset($online_users[$user_id]);
                }
            }
            set_transient('online_users', $online_users, 300);
            $count = count($online_users);
        }
        
        echo '<div class="online-users">当前在线人数: ' . $count . '</div>';
    }
}
add_action('admin_bar_menu', 'display_online_users', 999);

// 添加样式
function online_users_style() {
    if (current_user_can('edit_posts')) {
        echo '<style>
            .online-users {
                padding: 0 10px;
                color: #fff;
                background: #0073aa;
                border-radius: 3px;
                margin-right: 10px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_style');
add_action('wp_head', 'online_users_style');

这段代码会:

  1. 跟踪登录用户的在线状态
  2. 每5分钟更新一次在线状态
  3. 自动清理15分钟不活动的用户
  4. 在顶部管理栏显示当前在线人数
  5. 仅对管理员和编辑可见

你可以将这段代码添加到当前主题的functions.php文件中。如需修改显示位置或样式,可以调整display_online_users函数中的输出内容。

方法二:以下是实现WordPress显示同时在线人数(所有人可见)的完整解决方案:


// 记录用户在线状态
function track_online_users() {
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $online_users = get_transient('online_users');
        
        if (false === $online_users) {
            $online_users = array();
        }
        
        $online_users[$user_id] = time();
        set_transient('online_users', $online_users, 300); // 5分钟过期
    }
}
add_action('init', 'track_online_users');

// 显示在线用户数(所有人可见)
function display_online_users() {
    $online_users = get_transient('online_users');
    $count = is_array($online_users) ? count($online_users) : 0;
    
    // 清理15分钟未活动的用户
    if (is_array($online_users)) {
        foreach ($online_users as $user_id => $time) {
            if (time() - $time > 900) { // 15分钟
                unset($online_users[$user_id]);
            }
        }
        set_transient('online_users', $online_users, 300);
        $count = count($online_users);
    }
    
    echo '<div class="online-users">当前在线人数: ' . $count . '</div>';
}
add_action('wp_footer', 'display_online_users');

// 添加样式
function online_users_style() {
    echo '<style>
        .online-users {
            position: fixed;
            bottom: 20px;
            right: 20px;
            padding: 8px 15px;
            color: #fff;
            background: #0073aa;
            border-radius: 20px;
            font-size: 14px;
            z-index: 9999;
        }
    </style>';
}
add_action('wp_head', 'online_users_style');

方法三:作者、贡献者和订阅者在后台还是能看到在线人数

根据代码逻辑分析,原始代码存在两个关键问题导致权限验证不完全。以下是修复后的完整解决方案:

// 记录用户在线状态(所有登录用户)
function track_online_users() {
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $online_users = get_transient('online_users');
        
        $online_users = is_array($online_users) ? $online_users : array();
        $online_users[$user_id] = time();
        
        set_transient('online_users', $online_users, 300);
    }
}
add_action('init', 'track_online_users');

// 显示在线用户数(仅管理员和编辑在后台可见)
function display_online_users() {
    // 双重验证:后台界面且具备权限
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        $online_users = get_transient('online_users');
        $count = 0;

        if (is_array($online_users)) {
            // 清理15分钟未活动用户
            $online_users = array_filter($online_users, function($time) {
                return time() - $time <= 900;
            });
            
            set_transient('online_users', $online_users, 300);
            $count = count($online_users);
        }

        echo '<div class="online-users-notice">实时在线用户:<strong>'.$count.'</strong></div>';
    }
}
// 在后台仪表盘显示
add_action('admin_notices', 'display_online_users');

// 仅后台加载样式
function online_users_admin_style() {
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        echo '<style>
            .online-users-notice {
                position: fixed;
                bottom: 20px;
                right: 20px;
                padding: 12px 20px;
                background: #2271b1;
                color: #fff;
                border-radius: 3px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                z-index: 99999;
                font-size: 14px;
            }
            .online-users-notice strong {
                font-weight: 600;
                margin-left: 5px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_admin_style');

代码改进说明:

  1. 严格权限验证体系
  • 双重验证机制:is_admin()确保只在后台界面显示
  • 使用WordPress推荐权限标识:manage_options(管理员) + edit_others_posts(编辑)
  1. 显示位置优化
  • 从管理栏改为后台admin_notices挂钩
  • 显示位置固定在右下角(与常用插件保持一致性)
  1. 数据清理优化
  • 使用array_filter替代foreach循环,提升代码简洁度
  • 自动过滤非活跃用户(15分钟阈值)
  1. 样式作用域控制
  • 样式只通过admin_head加载
  • 使用独立class名称避免样式污染
  1. 安全增强
  • 移除前端所有相关输出
  • 采用白名单机制验证用户权限

各用户角色验证结果:

用户角色前端可见性后台可见性
管理员不可见可见
编辑不可见可见
作者不可见不可见
贡献者不可见不可见
订阅者不可见不可见

部署建议:

  1. 将代码添加到主题的functions.php文件或自定义插件中
  2. 清空网站缓存(如有使用缓存插件)
  3. 使用不同身份用户测试验证显示效果

这个版本通过严格控制输出位置和权限验证层级,确保只有管理员和编辑在WordPress后台才能看到在线人数显示,其他角色用户在前端和后台均不可见。

方法四:作者、贡献者和订阅者在后台还是能看到在线人数(增加了游客在线统计功能)


// 记录用户和游客在线状态
function track_online_users() {
    $online_users = get_transient('online_users');
    $online_guests = get_transient('online_guests');
    
    $online_users = is_array($online_users) ? $online_users : array();
    $online_guests = is_array($online_guests) ? $online_guests : array();

    // 记录登录用户
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $online_users[$user_id] = time();
    } 
    // 记录游客(通过cookie识别)
    else {
        if (!isset($_COOKIE['guest_id'])) {
            $guest_id = md5(uniqid(rand(), true));
            setcookie('guest_id', $guest_id, time() + 3600, '/');
        } else {
            $guest_id = $_COOKIE['guest_id'];
        }
        $online_guests[$guest_id] = time();
    }

    set_transient('online_users', $online_users, 300);
    set_transient('online_guests', $online_guests, 300);
}
add_action('init', 'track_online_users');

// 显示在线用户和游客数(仅管理员和编辑在后台可见)
function display_online_users() {
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        $online_users = get_transient('online_users');
        $online_guests = get_transient('online_guests');
        
        $user_count = 0;
        $guest_count = 0;

        // 清理15分钟未活动的用户
        if (is_array($online_users)) {
            $online_users = array_filter($online_users, function($time) {
                return time() - $time <= 900;
            });
            $user_count = count($online_users);
            set_transient('online_users', $online_users, 300);
        }

        // 清理15分钟未活动的游客
        if (is_array($online_guests)) {
            $online_guests = array_filter($online_guests, function($time) {
                return time() - $time <= 900;
            });
            $guest_count = count($online_guests);
            set_transient('online_guests', $online_guests, 300);
        }

        echo '<div class="online-users-notice">
                实时在线:<strong>'.$user_count.'</strong>用户 | 
                <strong>'.$guest_count.'</strong>游客
              </div>';
    }
}
add_action('admin_notices', 'display_online_users');

// 后台样式
function online_users_admin_style() {
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        echo '<style>
            .online-users-notice {
                position: fixed;
                bottom: 20px;
                right: 20px;
                padding: 12px 20px;
                background: #2271b1;
                color: #fff;
                border-radius: 3px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                z-index: 99999;
                font-size: 14px;
            }
            .online-users-notice strong {
                font-weight: 600;
                margin: 0 3px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_admin_style');

这个修改版新增了游客追踪功能,通过cookie识别游客,同时显示用户和游客数量。所有代码都放在一个PHP文件中,可以直接添加到WordPress主题的functions.php或作为插件使用。

方法五:作者、贡献者和订阅者在后台还是能看到在线人数(游客在线统计功能,同IP不会被重复计算)


// 记录用户和游客在线状态(同IP只计一次)
function track_online_users() {
    $online_users = get_transient('online_users');
    $online_guests = get_transient('online_guests');
    $ip_address = $_SERVER['REMOTE_ADDR'];
    
    $online_users = is_array($online_users) ? $online_users : array();
    $online_guests = is_array($online_guests) ? $online_guests : array();

    // 记录登录用户(优先记录)
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $online_users[$user_id] = array(
            'time' => time(),
            'ip' => $ip_address
        );
    } 
    // 记录游客(通过IP去重)
    else {
        // 检查IP是否已存在于用户或游客记录中
        $ip_exists = false;
        foreach ($online_users as $user) {
            if ($user['ip'] === $ip_address) {
                $ip_exists = true;
                break;
            }
        }
        
        if (!$ip_exists) {
            foreach ($online_guests as $guest) {
                if ($guest['ip'] === $ip_address) {
                    $ip_exists = true;
                    break;
                }
            }
        }

        if (!$ip_exists) {
            if (!isset($_COOKIE['guest_id'])) {
                $guest_id = md5(uniqid(rand(), true));
                setcookie('guest_id', $guest_id, time() + 3600, '/');
            } else {
                $guest_id = $_COOKIE['guest_id'];
            }
            $online_guests[$guest_id] = array(
                'time' => time(),
                'ip' => $ip_address
            );
        }
    }

    set_transient('online_users', $online_users, 300);
    set_transient('online_guests', $online_guests, 300);
}
add_action('init', 'track_online_users');

// 显示在线用户和游客数(仅管理员可见)
function display_online_users() {
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        $online_users = get_transient('online_users');
        $online_guests = get_transient('online_guests');
        
        $user_count = 0;
        $guest_count = 0;

        // 清理15分钟未活动的用户
        if (is_array($online_users)) {
            $online_users = array_filter($online_users, function($data) {
                return time() - $data['time'] <= 900;
            });
            $user_count = count($online_users);
            set_transient('online_users', $online_users, 300);
        }

        // 清理15分钟未活动的游客
        if (is_array($online_guests)) {
            $online_guests = array_filter($online_guests, function($data) {
                return time() - $data['time'] <= 900;
            });
            $guest_count = count($online_guests);
            set_transient('online_guests', $online_guests, 300);
        }

        echo '<div class="online-users-notice">
                实时在线:<strong>'.$user_count.'</strong>用户 | 
                <strong>'.$guest_count.'</strong>游客
              </div>';
    }
}
add_action('admin_notices', 'display_online_users');

// 后台样式保持不变
function online_users_admin_style() {
    if (is_admin() && (current_user_can('manage_options') || current_user_can('edit_others_posts'))) {
        echo '<style>
            .online-users-notice {
                position: fixed;
                bottom: 20px;
                right: 20px;
                padding: 12px 20px;
                background: #2271b1;
                color: #fff;
                border-radius: 3px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                z-index: 99999;
                font-size: 14px;
            }
            .online-users-notice strong {
                font-weight: 600;
                margin: 0 3px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_admin_style');

方法六:显示在线用户列表(仅管理员可见)(游客在线统计功能,同IP不会被重复计算,显示在线用户名称和IP)

以下是优化后的WordPress在线用户统计功能代码,增加了显示在线用户名称的功能:


// 记录用户和游客在线状态(同IP只计一次)
function track_online_users() {
    $online_users = get_transient('online_users');
    $online_guests = get_transient('online_guests');
    $ip_address = $_SERVER['REMOTE_ADDR'];
    
    $online_users = is_array($online_users) ? $online_users : array();
    $online_guests = is_array($online_guests) ? $online_guests : array();

    // 记录登录用户(优先记录)
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $user_data = get_userdata($user_id);
        $online_users[$user_id] = array(
            'time' => time(),
            'ip' => $ip_address,
            'name' => $user_data->display_name
        );
    } 
    // 记录游客(通过IP去重)
    else {
        $ip_exists = false;
        foreach (array_merge($online_users, $online_guests) as $record) {
            if ($record['ip'] === $ip_address) {
                $ip_exists = true;
                break;
            }
        }

        if (!$ip_exists) {
            $guest_id = isset($_COOKIE['guest_id']) ? $_COOKIE['guest_id'] : md5(uniqid(rand(), true));
            setcookie('guest_id', $guest_id, time() + 3600, '/');
            $online_guests[$guest_id] = array(
                'time' => time(),
                'ip' => $ip_address,
                'name' => '游客'.substr($guest_id, 0, 4)
            );
        }
    }

    set_transient('online_users', $online_users, 300);
    set_transient('online_guests', $online_guests, 300);
}
add_action('init', 'track_online_users');

// 显示在线用户列表(仅管理员可见)
function display_online_users() {
    if (current_user_can('manage_options') || current_user_can('edit_others_posts')) {
        $online_users = get_transient('online_users');
        $online_guests = get_transient('online_guests');
        
        // 清理15分钟未活动的记录
        $online_users = is_array($online_users) ? array_filter($online_users, function($d) {
            return time() - $d['time'] <= 900;
        }) : [];
        
        $online_guests = is_array($online_guests) ? array_filter($online_guests, function($d) {
            return time() - $d['time'] <= 900;
        }) : [];

        // 保存清理后的数据
        set_transient('online_users', $online_users, 300);
        set_transient('online_guests', $online_guests, 300);

        echo '<div class="online-users-notice">
                <h4>实时在线:'.count($online_users).'用户 | '.count($online_guests).'游客</h4>
                <div class="online-users-list">';
        
        // 显示在线用户
        if (!empty($online_users)) {
            echo '<h5>登录用户:</h5><ul>';
            foreach ($online_users as $user) {
                echo '<li>'.$user['name'].' (IP:'.$user['ip'].')</li>';
            }
            echo '</ul>';
        }
        
        // 显示在线游客
        if (!empty($online_guests)) {
            echo '<h5>游客:</h5><ul>';
            foreach ($online_guests as $guest) {
                echo '<li>'.$guest['name'].' (IP:'.$guest['ip'].')</li>';
            }
            echo '</ul>';
        }
        
        echo '</div></div>';
    }
}
add_action('admin_notices', 'display_online_users');

// 后台样式
function online_users_admin_style() {
    if (current_user_can('manage_options') || current_user_can('edit_others_posts')) {
        echo '<style>
            .online-users-notice {
                position: fixed;
                bottom: 20px;
                right: 20px;
                padding: 15px;
                background: #f0f0f1;
                border: 1px solid #ccd0d4;
                border-radius: 4px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                z-index: 99999;
                max-width: 300px;
                max-height: 400px;
                overflow-y: auto;
            }
            .online-users-notice h4 {
                margin-top: 0;
                color: #2271b1;
            }
            .online-users-notice h5 {
                margin-bottom: 5px;
                font-size: 13px;
            }
            .online-users-list ul {
                margin: 0 0 10px 15px;
                padding: 0;
                list-style-type: square;
            }
            .online-users-list li {
                font-size: 12px;
                margin-bottom: 3px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_admin_style');

主要改进点:

  1. 现在会记录并显示每个在线用户的名称(登录用户显示用户名,游客显示随机标识)
  2. 优化了IP去重逻辑,使用array_merge简化代码
  3. 改进了后台显示界面,增加可滚动区域和分类列表
  4. 调整了样式使显示更清晰美观

使用方法:

  1. 将代码添加到当前主题的functions.php文件中
  2. 确保WordPress缓存功能正常工作
  3. 管理员登录后台即可在右下角看到增强版的在线用户统计面板

方法七:显示在线用户列表(仅管理员可见)(游客在线统计功能,同IP不会被重复计算,显示在线用户名称,游客仅显示数量不显示具体IP信息)


// 记录用户和游客在线状态
function track_online_users() {
    $online_users = get_transient('online_users');
    $online_guests = get_transient('online_guests');
    $ip_address = $_SERVER['REMOTE_ADDR'];
    
    $online_users = is_array($online_users) ? $online_users : array();
    $online_guests = is_array($online_guests) ? $online_guests : array();

    // 记录登录用户
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $user_data = get_userdata($user_id);
        $online_users[$user_id] = array(
            'time' => time(),
            'ip' => $ip_address,
            'name' => $user_data->display_name
        );
    } 
    // 记录游客(仅计数)
    else {
        $ip_exists = false;
        foreach (array_merge($online_users, $online_guests) as $record) {
            if ($record['ip'] === $ip_address) {
                $ip_exists = true;
                break;
            }
        }

        if (!$ip_exists) {
            $guest_id = isset($_COOKIE['guest_id']) ? $_COOKIE['guest_id'] : md5(uniqid(rand(), true));
            setcookie('guest_id', $guest_id, time() + 3600, '/');
            $online_guests[$guest_id] = array(
                'time' => time(),
                'ip' => $ip_address
            );
        }
    }

    set_transient('online_users', $online_users, 300);
    set_transient('online_guests', $online_guests, 300);
}
add_action('init', 'track_online_users');

// 显示在线用户列表(仅管理员可见)
function display_online_users() {
    if (current_user_can('manage_options') || current_user_can('edit_others_posts')) {
        $online_users = get_transient('online_users');
        $online_guests = get_transient('online_guests');
        
        // 清理15分钟未活动的记录
        $online_users = is_array($online_users) ? array_filter($online_users, function($d) {
            return time() - $d['time'] <= 900;
        }) : [];
        
        $online_guests = is_array($online_guests) ? array_filter($online_guests, function($d) {
            return time() - $d['time'] <= 900;
        }) : [];

        set_transient('online_users', $online_users, 300);
        set_transient('online_guests', $online_guests, 300);

        echo '<div class="online-users-notice">
                <h4>实时在线:'.count($online_users).'用户 | '.count($online_guests).'游客</h4>
                <div class="online-users-list">';
        
        // 仅显示登录用户详情
        if (!empty($online_users)) {
            echo '<h5>当前登录用户:</h5><ul>';
            foreach ($online_users as $user) {
                echo '<li>'.$user['name'].'</li>';
            }
            echo '</ul>';
        }
        
        echo '</div></div>';
    }
}
add_action('admin_notices', 'display_online_users');

// 后台样式
function online_users_admin_style() {
    if (current_user_can('manage_options') || current_user_can('edit_others_posts')) {
        echo '<style>
            .online-users-notice {
                position: fixed;
                bottom: 20px;
                right: 20px;
                padding: 15px;
                background: #f0f0f1;
                border: 1px solid #ccd0d4;
                border-radius: 4px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.1);
                z-index: 99999;
                max-width: 250px;
            }
            .online-users-notice h4 {
                margin-top: 0;
                color: #2271b1;
            }
            .online-users-notice h5 {
                margin-bottom: 5px;
                font-size: 13px;
            }
            .online-users-list ul {
                margin: 0 0 10px 15px;
                padding: 0;
                list-style-type: square;
            }
            .online-users-list li {
                font-size: 12px;
                margin-bottom: 3px;
            }
        </style>';
    }
}
add_action('admin_head', 'online_users_admin_style');

主要优化点:1.移除了游客IP显示 2.简化了游客数据结构 3.调整了显示面板宽度 4.优化了用户界面文字描述