纯代码实现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');
这段代码会:
- 跟踪登录用户的在线状态
- 每5分钟更新一次在线状态
- 自动清理15分钟不活动的用户
- 在顶部管理栏显示当前在线人数
- 仅对管理员和编辑可见
你可以将这段代码添加到当前主题的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');
代码改进说明:
- 严格权限验证体系
- 双重验证机制:
is_admin()确保只在后台界面显示 - 使用WordPress推荐权限标识:
manage_options(管理员) +edit_others_posts(编辑)
- 显示位置优化
- 从管理栏改为后台
admin_notices挂钩 - 显示位置固定在右下角(与常用插件保持一致性)
- 数据清理优化
- 使用
array_filter替代foreach循环,提升代码简洁度 - 自动过滤非活跃用户(15分钟阈值)
- 样式作用域控制
- 样式只通过
admin_head加载 - 使用独立class名称避免样式污染
- 安全增强
- 移除前端所有相关输出
- 采用白名单机制验证用户权限
各用户角色验证结果:
| 用户角色 | 前端可见性 | 后台可见性 |
|---|---|---|
| 管理员 | 不可见 | 可见 |
| 编辑 | 不可见 | 可见 |
| 作者 | 不可见 | 不可见 |
| 贡献者 | 不可见 | 不可见 |
| 订阅者 | 不可见 | 不可见 |
部署建议:
- 将代码添加到主题的
functions.php文件或自定义插件中 - 清空网站缓存(如有使用缓存插件)
- 使用不同身份用户测试验证显示效果
这个版本通过严格控制输出位置和权限验证层级,确保只有管理员和编辑在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');
主要改进点:
- 现在会记录并显示每个在线用户的名称(登录用户显示用户名,游客显示随机标识)
- 优化了IP去重逻辑,使用array_merge简化代码
- 改进了后台显示界面,增加可滚动区域和分类列表
- 调整了样式使显示更清晰美观
使用方法:
- 将代码添加到当前主题的functions.php文件中
- 确保WordPress缓存功能正常工作
- 管理员登录后台即可在右下角看到增强版的在线用户统计面板
方法七:显示在线用户列表(仅管理员可见)(游客在线统计功能,同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.优化了用户界面文字描述