如何在WordPress中添加用户在线功能?
在WordPress中使用Transients API (瞬态API)来存储、获取用户的状态,添加用户在线功能。
在WordPress中有一个名为is_user_logged_in()的函数,但是这个函数只对当前用户有效。
https://developer.wordpress.org/reference/functions/is_user_logged_in/
如果其他用户在线,显示在线状态。
那该怎么做呢?
wordpress 提供了非常多,非常强大的功能,灵活使用就可以做出来了。
这边推荐是可以使用Transients API (瞬态API)来存储、获取用户的状态。
https://developer.wordpress.org/apis/transients/
创建一个挂接在init上的user-online-update函数,来存储在线用户,例如:
// get logged-in users
$logged_in_users = get_transient('online_status');
// get current user ID
$user = wp_get_current_user();
// check if the current user needs to update his online status;
// status no need to update if user exist in the list
// and if his "last activity" was less than let's say ...15 minutes ago
$no_need_to_update = isset($logged_in_users[$user->ID])
&& $logged_in_users[$user->ID] > (time() - (15 * 60));
// update the list if needed
if (!$no_need_to_update) {
$logged_in_users[$user->ID] = time();
set_transient('online_status', $logged_in_users, $expire_in = (30*60)); // 30 mins
}
这应该在每次页面加载时运行,但只有在需要时才会更新瞬态。
如果有大量的在线用户,可能想要增加“最后一次活动”的时间框架来减少数据库写操作。
但是15分钟对于大多数站点来说已经足够了。
现在要检查用户是否在线,只需查看该瞬态文件中的某个用户是否在线:
// get logged in users
$logged_in_users = get_transient('online_status');
// for eg. on author page
$user_to_check = get_query_var('author');
$online = isset($logged_in_users[$user_to_check])
&& ($logged_in_users[$user_to_check] > (time() - (15 * 60)));// get logged in users
$logged_in_users = get_transient('online_status');
// for eg. on author page
$user_to_check = get_query_var('author');
$online = isset($logged_in_users[$user_to_check])
&& ($logged_in_users[$user_to_check] > (time() - (15 * 60)));
// other user online
function user_online( $user_id ){
$logged_in_users = get_transient('online_status');
return isset($logged_in_users[$user_id])&& ($logged_in_users[$user_id] > (time() - (15 * 60)));
}
如果根本没有任何活动,则该瞬态将在30分钟内过期。但是如果用户一直在线,它不会过期,所以可以通过wordpress的任务定时器,挂接另一个函数来定期清理这个瞬态。此函数将删除旧的$logged_in_users条目…
wordpress的任务定时器没有提供30分钟的,那可以自己注册一个:
function add_twicehourly_cron_schedules( $schedules ) {
$schedules['twicehourly'] = array(
'interval' => HOUR_IN_SECONDS / 2,
'display' => __( 'Twice Hourly', 'textdomain' ),
);
return $schedules;
}
add_filter( 'cron_schedules', 'add_twicehourly_cron_schedules' );
不在线用户的清理,就不写了,自己弄吧。
……
之后,你就能以用户ID($user_id)的方式判断用户在线情况了。
if ( user_online( $user_id ) ) {
return 'Online';
} else {
return 'Absent';
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。
还没有任何评论,赶紧来占个楼吧!