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);
使用此解决方案,您无法知道用户是否实时在线,但我认为这是一个很好的解决方案:)