Check if user is online?

时间:2016-02-19 作者:N00b

如果用户在线,我只想在用户名后显示绿色圆圈,如果用户离线,则不显示任何内容。

我找到了this 5 years old question 但这两个想法似乎都不好,因为我被告知,设置瞬态通常是相当昂贵的,而且持续更新数据库似乎是个坏主意。

Has there been any changes? Is there a better way to check if (not current) user is online?

为什么会有一个简单的函数is_user_logged_in() 对于当前用户,但仍然无法检查其他用户?难道没有什么旗帜之类的东西吗?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

WordPress不会跟踪用户是否在线。它只能知道当前是否在线,这始终是肯定的(否则将没有请求)。如果您想知道不是当前用户的其他用户是否联机,则该信息不存在,您需要自己实现它。

is_user_logged_in 检查当前用户是否经过身份验证(即登录),如果用户联机则不是测试

为了做到这一点,你还必须做出妥协,而实时在线或非状态跟踪并不是你只能在WordPress中完成的事情。

您的选择包括:

每次访问用户meta中的页面时更新时间戳,然后使用该时间戳作为测试(如果用户的时间戳在过去5分钟内,请考虑他们在线),让AJAX调用ping您的站点以刷新计时器。请注意,如果用户在加载页面后立即关闭浏览器,他们仍将在线显示5分钟,并且这样做会带来性能成本,它不会随着流量的增加而扩展,因为有一个标志指示用户在线,并在用户点击任何页面时将其设置为true。有一个cron作业,它会定期将所有标志设置为false。这将更便宜的查询,但运行起来更昂贵。您可以通过增加cron作业的时间延迟来降低成本,从而降低准确性。这仍然会使登录用户的成本更高,因为每个页面加载都包括数据库写入。它不会与流量成比例

此外,您设计的任何在PHP中运行的解决方案都必然意味着,除非在线-离线功能由javascript支持,否则您将无法再进行完整的页面缓存。否则,如果您将某人显示为联机,并且您的页面被缓存24小时,那么他们在接下来的24小时内仍将联机。如果您使用我介绍的前两个选项中的任何一个,您也将无法对登录的用户使用缓存,而Batchache或Varnish等工具如果应用于这些用户,将破坏您的系统,除非使用未缓存的基于AJAX的系统来指示有人在线

这种情况将来会改变吗?不,WordPress不处理此类功能或存储此类数据。WordPress确实在用户元中跟踪会话,但这不是您要查找的数据类型。这可能表示用户已登录的设备数量,但它绝对不可靠,并且不能用于提供在线或离线指示器

SO网友:Samuel E. Cerezo

我知道这是一个老问题,但下面是我使用WordPress令牌会话开发的内容。

首先,我开发了一个更新当前会话时间戳的函数。如果我访问连接的网页,则会更新登录时间戳和过期时间戳(登录到当前时间戳)

add_action(\'init\', function() {

    $sessions = get_user_meta(get_current_user_id(), \'session_tokens\', true);

    $session = $sessions[hash(\'sha256\', wp_get_session_token())];

    $duration = $session[\'expiration\'] - $session[\'login\'];

    $sessions[hash(\'sha256\', wp_get_session_token())][\'login\'] = current_time(\'U\');

    $sessions[hash(\'sha256\', wp_get_session_token())][\'expiration\'] = current_time(\'U\') + $duration;

    update_user_meta(get_current_user_id(), \'session_tokens\', $sessions);

});
之后,我计算用户登录actives会话后经过的时间。

如果当前和登录之间的时间少于5分钟,我认为用户是“在线”的。如果这个时间在5到20分钟之间,我认为用户“离开了”。

function is_user_online($user = null) {

    if (is_null($user)) {
        $user = get_current_user_id();
    }

    $session_time = false;

    $sessions = get_user_meta($user, \'session_tokens\', true);

    foreach ($sessions as $session) {

        $time = current_time(\'U\') - $session[\'login\'];

        if ($time == false || $time < $session_time) {
            $session_time = $time;
        }

    }

    if (is_numeric($session_time) && $session_time <= 1200 && $session_time > 300) {
        $session_time = \'away\';
    } else if (is_numeric($session_time) && $session_time <= 300) {
        $session_time = \'online\';
    } else {
        $session_time = false;
    }

    return $session_time;

}
我还修改了课程生活。正常情况下为1小时,“记住我”为7天。

add_filter(\'auth_cookie_expiration\', function($seconds, $user_id, $remember){

    if ($remember) {
        $expiration = 7*24*60*60;
    } else {
        $expiration = 60*60;
    }

    if (PHP_INT_MAX - time() < $expiration) {
        $expiration = PHP_INT_MAX - time() - 5;
    }

    return $expiration;

}, 99, 3);
使用此解决方案,您无法知道用户是否实时在线,但我认为这是一个很好的解决方案:)

相关推荐

如何从USERS-edit.php中删除颜色选择器代码

我知道我不应该改变Wordpress的核心。但如果我想在“用户编辑”中使用仪表板用户配置文件页面。php和删除大块代码(如颜色选择器)的方法。从第259行到第336行-我想全部删除。<?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> <tr class="user-rich-editing-wrap"> <th scope="