WordPress 后台实时显示当前在线的用户名(即当前登录并活跃在后台的用户)

要在 WordPress 后台实时显示当前在线的用户名(即当前登录并活跃在后台的用户),可以通过以下方式实现:

注意:WordPress 本身没有“在线用户”的内置机制,因此我们需要自己记录用户的“最后活动时间”,并定义一个“在线”阈值(例如5分钟内有活动就算在线)。

方法一:WordPress 后台实时显示当前在线的用户名

实现思路

  1. 记录每个用户在后台的最后活动时间(通过 admin_init 钩子)。
  2. 存储这些信息到数据库(使用 wp_options 表)。
  3. 在后台某处(如顶部管理栏或仪表盘小工具)显示当前在线的用户名列表
  4. 定期清理过期数据(可选)。

完整代码(放入主题的 functions.php 或自定义插件中)

// 1. 记录当前管理员用户的最后活动时间(仅限后台)
function track_admin_last_activity() {
    if (is_admin() && is_user_logged_in()) {
        $user_id = get_current_user_id();
        $current_time = time();

        // 获取现有活动记录
        $active_users = get_option('wp_admin_active_users', array());

        // 更新该用户的最后活动时间
        $active_users[$user_id] = $current_time;

        // 清理超过 10 分钟未活动的用户(可选)
        $cutoff = $current_time - (10 * 60); // 10分钟
        $active_users = array_filter($active_users, function($time) use ($cutoff) {
            return $time >= $cutoff;
        });

        update_option('wp_admin_active_users', $active_users, false);
    }
}
add_action('admin_init', 'track_admin_last_activity');

// 2. 获取当前在线的管理员用户(5分钟内有活动)
function get_online_admin_users($minutes = 5) {
    $active_users = get_option('wp_admin_active_users', array());
    $cutoff = time() - ($minutes * 60);
    $online_users = array();

    foreach ($active_users as $user_id => $last_active) {
        if ($last_active >= $cutoff) {
            $user = get_userdata($user_id);
            if ($user && user_can($user, 'edit_posts')) { // 可根据需要调整权限
                $online_users[] = $user->display_name;
            }
        }
    }

    return $online_users;
}

// 3. 在 WordPress 管理栏添加在线用户显示
function add_online_users_to_admin_bar($admin_bar) {
    if (!is_admin() || !is_user_logged_in()) {
        return;
    }

    $online_users = get_online_admin_users(5); // 5分钟内活跃视为在线

    if (!empty($online_users)) {
        $list = implode(', ', array_unique($online_users));
        $title = '在线用户: ' . $list;
    } else {
        $title = '暂无其他用户在线';
    }

    $admin_bar->add_node(array(
        'id'    => 'online-admin-users',
        'title' => '<span style="color:#4CAF50;">👥 ' . esc_html($title) . '</span>',
        'href'  => admin_url(),
        'meta'  => array('title' => '当前在线的后台用户')
    ));
}
add_action('admin_bar_menu', 'add_online_users_to_admin_bar', 999);


🔍 效果说明

  • 登录 WordPress 后台后,会在顶部管理栏(Admin Bar)右侧显示当前 5 分钟内活跃的管理员用户名。
  • 每次你在后台操作(点击菜单、刷新页面等),都会更新你的“最后活动时间”。
  • 其他用户也能看到彼此是否在线(仅限有后台访问权限的用户)。

🛡️ 安全与优化建议

  • 如果站点用户量大,可考虑用 Transient API 或 Redis 缓存代替 wp_options
  • 可限制只对特定角色(如 administrator)显示或记录。
  • 如需更精确的“实时”效果(如 WebSocket),需引入前端 JS + Ajax 轮询,但对大多数场景上述方案已足够。

方法二:修改成只在仪表盘(Dashboard)显示

好的!下面的代码会将「当前在线的后台用户」信息仅显示在 WordPress 仪表盘(Dashboard)首页,而不是顶部管理栏。


✅ 修改后功能说明

  • 仅当用户访问 WordPress 后台首页(即 /wp-admin/index.php 时,才显示一个 Dashboard 小工具(Widget)。
  • 显示最近 5 分钟内 在后台有活动的用户(排除自己)。
  • 使用 WordPress 原生的 Dashboard Widget API,样式统一、安全可靠。

📌 完整代码(放入主题 functions.php 或自定义插件)

// 1. 记录管理员用户的最后活动时间(仅限后台)
function track_admin_last_activity() {
    if (is_admin() && is_user_logged_in()) {
        $user_id = get_current_user_id();
        $current_time = time();

        $active_users = get_option('wp_admin_active_users', array());
        $active_users[$user_id] = $current_time;

        // 清理超过 10 分钟未活动的记录(防止数据膨胀)
        $cutoff = $current_time - (10 * 60);
        $active_users = array_filter($active_users, function($time) use ($cutoff) {
            return $time >= $cutoff;
        });

        update_option('wp_admin_active_users', $active_users, false);
    }
}
add_action('admin_init', 'track_admin_last_activity');

// 2. 获取当前在线的后台用户(排除当前用户)
function get_online_admin_users_excluding_current($minutes = 5) {
    $current_user_id = get_current_user_id();
    $active_users = get_option('wp_admin_active_users', array());
    $cutoff = time() - ($minutes * 60);
    $online_users = array();

    foreach ($active_users as $user_id => $last_active) {
        if ($user_id == $current_user_id) continue; // 排除自己
        if ($last_active >= $cutoff) {
            $user = get_userdata($user_id);
            if ($user && user_can($user, 'read')) { // 至少能进后台的用户
                $online_users[] = esc_html($user->display_name);
            }
        }
    }

    return array_unique($online_users);
}

// 3. 添加仪表盘小工具:显示在线用户
function add_online_users_dashboard_widget() {
    // 仅在仪表盘页面注册 widget
    wp_add_dashboard_widget(
        'dashboard_online_users',          // Widget ID
        '👥 后台在线用户',                 // 标题
        'render_online_users_dashboard_widget' // 回调函数
    );
}
add_action('wp_dashboard_setup', 'add_online_users_dashboard_widget');

// 4. 渲染小工具内容
function render_online_users_dashboard_widget() {
    $online_users = get_online_admin_users_excluding_current(5);

    if (!empty($online_users)) {
        echo '<p>以下用户最近 5 分钟内在后台活跃:</p>';
        echo '<ul style="padding-left: 20px; margin: 0;">';
        foreach ($online_users as $name) {
            echo '<li>' . $name . '</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>目前没有其他用户在后台活跃。</p>';
    }

    // 可选:显示刷新提示(因非实时,需手动刷新页面)
    echo '<p><small>注:状态基于页面加载时的数据,刷新页面可更新。</small></p>';
}

🖼️ 效果预览

进入 WordPress 后台首页(仪表盘)后,你会看到一个新的小工具:

✅ 优势

  • 干净集成:使用官方 Dashboard Widget,不破坏 UI。
  • 隐私友好:不显示当前用户自己。
  • 轻量高效:无 Ajax、无前端 JS,适合大多数站点。
  • 自动清理:旧数据不会无限累积。