Como verificar se um usuário (não usuário atual) está logado?

20

Eu preciso exibir o status on-line (on-line / off-line) para cada página do autor (modelo de página de autor personalizado).

is_user_logged_in () só se aplica ao usuário atual e não consigo encontrar uma abordagem relevante direcionada ao autor atual. is_author_logged_in ()

Alguma idéia?

Resposta

O One Trick Pony teve a gentileza de preparar a codificação para duas ou três funções usando transientes, algo que eu não tinha usado antes.

enlace

Adicione isto a 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);
    }

  }
}

Adicione isso ao author.php (ou outro modelo de página):

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.';}

Segunda resposta (não use)

Esta resposta está incluída para referência. Como apontado por One Trick Pony, isso é uma abordagem indesejável porque o banco de dados é atualizado em cada carregamento de página. Depois de uma análise mais detalhada, o código parecia estar apenas detectando o status de login do usuário atual, em vez de combiná-lo ao autor atual.

1) Instale este plugin: enlace

2) Adicione o seguinte ao seu modelo de página:

//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>";
}
    
por Dominor Novus 21.11.2011 / 23:28
fonte

2 respostas

15

Eu usaria transientes para fazer isso:

  • crie uma função de atualização online do usuário que você conecta em init ; seria algo parecido com isto:

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

    Portanto, isso deve ser executado em cada carregamento de página, mas o transiente será atualizado apenas se necessário. Se você tiver um grande número de usuários on-line, convém aumentar o período de tempo da "última atividade" para reduzir as gravações do banco de dados, mas 15 minutos é mais do que suficiente para a maioria dos sites ...

  • agora para verificar se o usuário está on-line, basta olhar dentro desse transiente para ver se um determinado usuário está on-line, assim como você fez acima:

    // 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)));
    

O transiente expira em 30 minutos se não houver atividade alguma. Mas caso você tenha usuários on-line o tempo todo, ele não irá expirar, então você pode querer limpar esse transiente periodicamente enganchando outra função em um evento duas vezes por dia ou algo parecido. Esta função removeria as antigas entradas $logged_in_users ...

    
por onetrickpony 22.11.2011 / 01:52
fonte
1

Até onde sei, não há uma maneira de fazer isso usando as funções internas do WordPress , mas não deixe isso desencorajá-lo; escreva um plugin!

Uma maneira de fazer isso é criar uma nova tabela no banco de dados que simplesmente rastreia a última vez que o usuário esteve ativo no site. Você também pode ter uma página de configurações para o seu plugin que determinou por quanto tempo você consideraria um usuário registrado como "Conectado".

Você implementaria isso usando um gancho do WordPress . Eu começaria enganchando no login, para que, uma vez que um usuário se conectasse, seu plugin registrasse o tempo no banco de dados. Você poderia, então, explorar outras coisas, como definir o status como "ausente" se clicar em logout ou "inativo" se o tempo de login for maior que duas horas atrás.

Você teria um problema se estivesse conectado e ativo no site, mas depois dessa janela de duas horas. Neste caso, você precisaria estar conectado à seção wp-admin para que, a qualquer momento que eles fizerem alguma coisa no wp-admin, ele atualize seu banco de dados para a hora atual.

Então, nas postagens, você precisaria fazer duas coisas: obter o autor da postagem atual:

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

, em seguida, consulte seu banco de dados para determinar se eles estão conectados:

<?php if your_plugin_function($user_login)... ?>
...display something...
    
por brock 22.11.2011 / 00:21
fonte