如何检查用户(非当前用户)是否已登录?

时间:2011-11-21 作者:Dominor Novus

我需要显示每个作者页(自定义作者页模板)的联机状态(联机/脱机)。

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

3 个回复
最合适的回答,由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.还有其他文档和功能。

结束

相关推荐

用户面板(users.php)中的可排序自定义列?

我正在使用Register Plus Redux插件用自定义元数据字段扩充注册表。这些字段显示在每个用户记录详细信息页面的底部,可以使用get\\u the\\u author\\u meta检索这些字段。此外,我能够在用户面板(列表视图)中创建列,并使这些列可排序。问题是,当我单击自定义列标题时,URL中的orderby=值似乎被忽略。换句话说,生成用户列表视图的查询似乎不包括自定义元数据(例如,如果元数据不在用户数据的通常位置,可能需要join语句?)。感觉好像我错过了一步。以下是创建自定义列的代码: