我需要显示每个作者页(自定义作者页模板)的联机状态(联机/脱机)。
is\\u user\\u logged\\u in()仅适用于当前用户,我找不到针对当前作者的相关方法,例如is\\u author\\u logged\\u in()
有什么想法吗?
答案
一匹小马驹很好地利用瞬态为两到三个函数编写了代码,这是我以前没有使用过的。
http://codex.wordpress.org/Transients_API
将此添加到函数。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);
}
}
}
将此添加到作者。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.\';}
第二个答案(请勿使用)此答案仅供参考。正如一个技巧小马指出的那样,这是不可取的方法,因为数据库在每次页面加载时都会更新。在进一步检查之后,代码似乎只是检测当前用户的登录状态,而不是将其与当前作者进行额外匹配。
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>";
}
最合适的回答,由SO网友:onetrickpony 整理而成
我会使用transients 为此,请执行以下操作:
创建一个可挂接的用户在线更新功能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
}
因此,这应该在每个页面加载上运行,但只有在需要时才会更新瞬态。如果您有大量在线用户,您可能希望增加“最后一次活动”的时间范围以减少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
条目。。。
SO网友:brock
据我所知,没有一种方法可以使用内置WordPress functions, 但不要因此而气馁;写一个插件!
一种方法是在数据库中创建一个新表,该表只跟踪用户上次在站点上活动的时间。您还可以为您的插件设置一个设置页面,确定您认为注册用户“登录”的时间。
您可以使用WordPress hook. 首先,我会连接到登录名,这样一旦用户登录,您的插件就会在数据库中记录时间。然后,您可以探索其他事情,如如果他们单击注销,则将其状态设置为“离开”,如果他们的登录时间超过两个小时,则设置为“空闲”。
如果他们登录并在站点上处于活动状态,但超过这两个小时的时间窗口,您将遇到问题。在这种情况下,您需要连接到wp admin部分,以便在wp admin中执行任何操作时,它都会将您的数据库更新到当前时间。
然后,在帖子上,您需要做两件事:找到当前帖子的作者:
<?php $user_login = the_author_meta( $user_login ); ?>
然后查询数据库以确定它们是否已登录:
<?php if your_plugin_function($user_login)... ?>
...display something...
SO网友:amarinediary
我决定重新审视给定的答案,并根据评论进行调整。
评论中提到的一件事是某种日常临时清洁剂。正如@onetrickpony所指出的,我们可以使用wp_schedule_event()
设置每日重置。
我决定实现一种简单的方法来获取当前联机和最近脱机的所有用户。
整个过程都是基于面向对象的,打包到一个类中。
从其ID获取特定的用户活动状态。获取当前联机的所有用户的数组获取最近脱机的所有用户的数组
|
安排重复的每日事件以删除用户活动瞬态 |
|
将其打包在一个漂亮的插件中 |
if ( ! class_exists( \'WPC_User_Activity_Monitoring\' ) ) {
class WPC_User_Activity_Monitoring {
/**
* @var Integer User inactivity margin in minutes.
*/
private const USER_INACTIVITY_MARGIN = 10 * MINUTE_IN_SECONDS;
/**
* @var Integer Transient self clear margin in minutes.
*/
private const TRANSIENT_SELF_CLEAR = 30 * MINUTE_IN_SECONDS;
/**
* Hooks methods on to a sets of actions.
*
* @since 1.0.0
*/
public function __construct() {
add_action( \'init\', array( $this, \'wpc_user_activity_monitoring_transient\' ) );
}
/**
* Set & update WPC user activity monitoring transient on user server interactions.
*
* @since 1.0.0
*
* @param Integer $user_id The user ID.
*
* @return Bool True for online.
*/
public function wpc_user_activity_monitoring_transient() {
if ( is_user_logged_in() ) {
$wpc_user_activity_monitoring_transient = get_transient( \'wpc_user_activity_monitoring_transient\' );
if ( empty( $wpc_user_activity_monitoring_transient ) ) {
$wpc_user_activity_monitoring_transient = array();
};
$user_id = get_current_user_id();
$timestamp = current_time( \'timestamp\' );
if ( empty( $wpc_user_activity_monitoring_transient[$user_id] ) || ( $wpc_user_activity_monitoring_transient[$user_id] < ( $timestamp - self::USER_INACTIVITY_MARGIN ) ) ) {
$wpc_user_activity_monitoring_transient[$user_id] = $timestamp;
set_transient( \'wpc_user_activity_monitoring_transient\', $wpc_user_activity_monitoring_transient, self::TRANSIENT_SELF_CLEAR );
};
};
}
/**
* Get a specific user activity status from it\'s ID.
*
* @since 1.0.0
*
* @param Integer $user_id The user ID.
*
* @return Bool True for online.
*/
public function is_user_currently_online( $user_id ) {
$wpc_user_activity_monitoring_transient = get_transient( \'wpc_user_activity_monitoring_transient\' );
if ( ! isset( $wpc_user_activity_monitoring_transient[$user_id] ) ) {
return;
};
if ( $wpc_user_activity_monitoring_transient[$user_id] > ( current_time( \'timestamp\' ) - self::USER_INACTIVITY_MARGIN ) ) {
return isset( $wpc_user_activity_monitoring_transient[$user_id] );
};
}
/**
* Get an array of all users currently online.
*
* @since 1.0.0
*
* @param Integer $nusers Number of currently online users to retrieve.
*
* @return Array An array of currently online users ID.
*/
public function get_currently_online_nusers() {
$wpc_user_activity_monitoring_transient = array_reverse( get_transient( \'wpc_user_activity_monitoring_transient\' ), true );
$currently_online_nusers = array();
foreach ( $wpc_user_activity_monitoring_transient as $user_id => $timestamp ) {
if ( $timestamp > ( current_time( \'timestamp\' ) - self::USER_INACTIVITY_MARGIN ) ) {
array_push( $currently_online_nusers, $user_id );
};
};
return $currently_online_nusers;
}
/**
* Get an array of all users recently offline.
*
* @since 1.0.0
*
* @param Integer $nusers Number of recently offline users to retrieve.
*
* @return Array An array of recently offline users ID.
*/
public function get_recently_offline_nusers() {
$wpc_user_activity_monitoring_transient = array_reverse( get_transient( \'wpc_user_activity_monitoring_transient\' ), true );
$recently_offline_nusers = array();
foreach ( $wpc_user_activity_monitoring_transient as $user_id => $timestamp ) {
if ( $timestamp < ( current_time( \'timestamp\' ) - self::USER_INACTIVITY_MARGIN ) ) {
array_push( $recently_offline_nusers, $user_id );
};
};
return $recently_offline_nusers;
}
};
$wpc_user_activity_monitoring = new WPC_User_Activity_Monitoring();
};
/**
* Schedules a recurring daily event, firing at 23:59:00 to delete the WPC user activity monitoring transient.
*
* @since 1.0.0
*/
if ( ! wp_next_scheduled ( \'schedule_event_delete_wpc_user_activity_monitoring_transient\' ) ) {
wp_schedule_event( strtotime( \'23:59:00\' ), \'daily\', \'schedule_event_delete_wpc_user_activity_monitoring_transient\' );
};
/**
* Delete the WPC user activity monitoring transient.
*
* @since 1.0.0
*/
add_action( \'schedule_event_delete_wpc_user_activity_monitoring_transient\', \'delete_wpc_user_activity_monitoring_transient\' );
if ( ! function_exists( \'delete_wpc_user_activity_monitoring_transient\' ) ) {
function delete_wpc_user_activity_monitoring_transient() {
delete_transient( \'wpc_user_activity_monitoring_transient\' );
};
};
将其全部打包在一个漂亮的插件中
我还制作了一个插件,以便于实现。这是GitHub上的开源@
https://github.com/amarinediary/WPC-User-Activity-Monitoring.还有其他文档和功能。