我需要显示每个作者页面(自定义作者页面模板)的在线状态(在线/离线)。

is_user_logged_in()仅适用于当前用户,并且找不到相关的方法定位当前作者,例如is_author_logged_in()

有什么想法吗?

答案

一个Trick Pony足够好,可以使用瞬态为两到三个函数准备编码我以前从未使用过。

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指出的那样,这是不理想的方法,因为数据库在每次页面加载时都会更新。经过进一步审查,该代码似乎只是在检测当前用户的登录状态,而不是与当前作者进行其他匹配。

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>";
}


评论

那是您能找到的最糟糕的解决方案之一。该插件会在每次加载页面时更新数据库...

感谢您的审查。我会避开的。我已经回复了您的答案(如下)。我一直在创建函数。

#1 楼

我将使用瞬态来做到这一点:




创建一个用户在线更新函数,该函数挂在init上;它看起来像这样:

// 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 
}


因此,这应该在每次页面加载时运行,但是瞬态仅在需要时才会更新。如果您有大量在线用户,则可能需要增加“上次活动”时间范围以减少数据库写入,但是对于大多数站点而言,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分钟后过期。但是如果万一用户一直在线,它不会过期,那么您可能希望通过在每天两次的事件或类似事件上挂接另一个功能来定期清理此瞬态。此功能将删除旧的$logged_in_users条目...

评论


瞬态对我来说是新的。感谢您的代码。我无法执行第一步。我复制了您的第一个代码块并将其粘贴到函数user_online_update(){[您的代码]} add_action('init','user_online_update');在我的functions.php文件中-我收到服务器错误消息,提示某些内容无法正确解析或我误解了您的说明。

–主要Novus
11年11月22日在2:01

+1建议使用瞬变。没有多少人了解他们。

– Dwayne Charrington
2011-11-22 2:52

@Dominor:完整的代码。

–onetrickpony
2011-11-22 11:28

@OneTrickPony:我将动作添加到functions.php中。我在哪里添加第二个函数(请参见完整代码的第27行)?我尝试了authors.php,然后尝试了functions.php,但没有成功。我尝试使用完整代码第25行的条件。每次,页面都会返回服务器错误,否则就不会解析代码中超出您代码的任何内容。我删除了原始代码,并停用了“谁在线?”插入。我在俯视什么?

–主要Novus
2011-11-22 15:36

将$ time_limit替换为15,并确保您正确打开/关闭了php标签...

–onetrickpony
2011-11-23 12:09

#2 楼

据我所知,没有办法使用内置的WordPress函数来做到这一点,但是不要让那让您沮丧。写一个插件!

一种方法是在数据库中创建一个新表,该表仅跟踪用户上一次在站点上活动的时间。您还可以为插件设置一个设置页面,该页面确定您认为注册用户将“登录”多长时间。

您可以使用WordPress钩子来实现。我首先要登录,以便用户登录后,您的插件就会将时间记录在数据库中。然后,您可以探索其他事情,例如,如果他们单击注销,则将其状态设置为“离开”,如果登录时间超过两个小时之前,则将其状态设置为“空闲”。

如果他们已登录并在站点上处于活动状态,但是在这两个小时之后,就会遇到问题。在这种情况下,您需要将其挂接到wp-admin部分,以便他们在wp-admin中执行任何操作时,它会将您的数据库更新到当前时间。

然后,在帖子中,您将需要做两件事:获取当前帖子的作者:

<?php $user_login = the_author_meta( $user_login ); ?>


,然后查询数据库以确定他们是否已登录:

<?php if your_plugin_function($user_login)... ?>
...display something...


评论


根据您的解决方案,我找到了一个可以创建表格并允许通过设置定义经过时间的插件。在查看插件文件之后,我不确定如何在我的作者模板页面中操作代码以在线/离线输出。如果您可以浏览一下插件文件并为我指出正确的方向,我将不胜感激:wordpress.org/extend/plugins/who-is-online(按照您的指示,我会尽我所能同时使用我的functions.php文件中的钩子)

–主要Novus
2011年11月21日23:58



成功!我向插件数据库查询了用户ID和作者ID的匹配情况。我已经在上面的问题中粘贴了代码。

–主要Novus
2011年11月22日在1:30