问题描述
我需要显示每个作者页面的在线状态 (在线/离线)(自定义作者页面模板) 。
is_user_logged_in() 仅适用于当前用户,我找不到针对当前作者的相关方法,例如 is_author_logged_in()
有任何想法吗?
Answer
一个小技巧的小马可以准备使用瞬态的二到三个功能的编码,这是我以前没有使用过的。
http://codex.wordpress.org/Transients_API
将其添加到 functions.php 中:
add_action('wp', 'update_online_users_status');
function update_online_users_status(){
if(is_user_logged_in()){
// get the online users list
if(($logged_in_users = get_transient('users_online')) === false) $logged_in_users = array();
$current_user = wp_get_current_user();
$current_user = $current_user->ID;
$current_time = current_time('timestamp');
if(!isset($logged_in_users[$current_user]) || ($logged_in_users[$current_user] < ($current_time - (15 * 60)))){
$logged_in_users[$current_user] = $current_time;
set_transient('users_online', $logged_in_users, 30 * 60);
}
}
}
将其添加到 author.php(或另一个页面模板) 中:
function is_user_online($user_id) {
// get the online users list
$logged_in_users = get_transient('users_online');
// online, if (s)he is in the list and last activity was less than 15 minutes ago
return isset($logged_in_users[$user_id]) && ($logged_in_users[$user_id] > (current_time('timestamp') - (15 * 60)));
}
$passthis_id = $curauth->ID;
if(is_user_online($passthis_id)){
echo 'User is online.';}
else {
echo'User is not online.';}
第二个答案 (不要使用)
这个答案是为了参考。正如 One Trick Pony 所指出的,这是不希望的方法,因为数据库在每个页面的加载上被更新。经过进一步审查,代码似乎只是检测当前用户的 log-in 状态,而不是将其与当前作者进行匹配。
1) 安装此插件:http://wordpress.org/extend/plugins/who-is-online/
2) 将以下内容添加到您的页面模板中:
//Set the $curauth variable
if(isset($_GET['author_name'])) :
$curauth = get_userdatabylogin($author_name);
else :
$curauth = get_userdata(intval($author));
endif;
// Define the ID of whatever authors page is being viewed.
$authortemplate_id = $curauth->ID;
// Connect to database.
global $wpdb;
// Define table as variable.
$who_is_online_table = $wpdb->prefix . 'who_is_online';
// Query: Count the number of user_id's (plugin) that match the author id (author template page).
$onlinestatus_check = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM ".$who_is_online_table." WHERE user_id = '".$authortemplate_id."';" ) );
// If a match is found...
if ($onlinestatus_check == "1"){
echo "<p>User is <strong>online</strong> now!</p>";
}
else{
echo "<p>User is currently <strong>offline</strong>.</p>";
}
最佳解决方案
我会用 transients 来做到这一点:
-
创建一个你挂钩在
init
上的 user-online-update 功能; 它会看起来像这样:// get the user activity the list $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; // he does if he doesn't exist in the list $no_need_to_update = isset($logged_in_users[$user->ID]) // and if his "last activity" was less than let's say ...15 minutes ago && $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 }
所以这应该在每个页面的加载上运行,但是只有在需要时才会更新。如果您有大量在线用户,您可能希望增加”last activity” 时间框架以减少 db 写入,但是对于大多数站点来说,15 分钟是足够的
-
现在要检查用户是否在线,只需查看该瞬态内容,查看某个用户是否在线,就像上面所述:
// get the user activity the list $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)));
如果没有任何活动,短暂的时间将在 30 分钟内到期。但是如果您的用户在线时间一直不会过期,那么您可能希望通过在 twice-daily event 上挂载另一个功能来定期清理瞬态。此功能将删除旧的 $logged_in_users
条目…
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。