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


22

Preciso exibir o status online (online / offline) de cada página do autor (modelo de página de autor personalizado).

is_user_logged_in () se aplica apenas ao usuário atual e não consigo encontrar uma abordagem relevante para o autor atual, por exemplo, is_author_logged_in ()

Alguma ideia?

Responda

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

http://codex.wordpress.org/Transients_API

Adicione isso ao 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. Conforme apontado pelo One Trick Pony, essa é uma abordagem indesejável porque o banco de dados é atualizado a cada carregamento da página. Após uma análise mais aprofundada, o código parecia apenas detectar o status de logon do usuário atual, em vez de associá-lo ao autor atual.

1) Instale este plugin: http://wordpress.org/extend/plugins/who-is-online/

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

Essa é uma das piores soluções que você pode encontrar. Esse plug-in está atualizando o banco de dados em cada carregamento de página ...
onetrickpony

Obrigado por analisá-lo. Eu vou me afastar. Eu respondi à sua resposta (abaixo). Estou preso em criar a função.
Dominor Novus

Respostas:


15

Eu usaria transientes para fazer isso:

  • crie uma função de atualização online do usuário à qual você se conecta 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 da página, mas o transitório será atualizado apenas se necessário. Se você tiver um grande número de usuários on-line, convém aumentar o período da "última atividade" para reduzir as gravações de banco de dados, mas 15 minutos são mais do que suficientes para a maioria dos sites ...

  • Agora, para verificar se o usuário está online, basta olhar para dentro desse transitório para ver se um determinado usuário está online, 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 transitório expira em 30 minutos se não houver atividade. No entanto, caso você tenha usuários on-line o tempo todo, ele não expirará; portanto, convém limpar esses transientes periodicamente, conectando outra função em um evento duas vezes ao dia ou algo assim. Esta função removeria $logged_in_usersentradas antigas ...


Transientes são novos para mim. Obrigado pelo código. Não consigo implementar o primeiro passo. Copiei o seu primeiro bloco de código e colei-o em function user_online_update() {[YOUR CODE] }add_action('init', 'user_online_update');no meu arquivo functions.php - estou recebendo um erro no servidor que sugere que algo não está sendo analisado corretamente ou interpretei mal suas instruções.
Dominor Novus 22/11

1
+1 por sugerir o uso de transientes. Muitas pessoas não sabem sobre eles.
Dwayne Charrington


@OneTrickPony: adicionei a ação ao functions.php. Onde adiciono a segunda função (veja a linha 27 do seu código completo)? Eu tentei o author.php e depois o functions.php, mas sem sucesso. Eu tentei usar a condição na linha 25 do seu código completo. Cada vez, a página retorna um erro no servidor ou não analisa nada na minha página além do seu código. Eu removi meu código original e desativei o "Quem está online?" plugar. O que eu estou negligenciando?
Dominor Novus

substituir $time_limitcom 15e certifique-se corretamente abertos / tags php fechados ...
onetrickpony

1

Que eu saiba, não há uma maneira de fazer isso usando as funções internas do WordPress , mas não deixe que isso o desencoraje; escreva um plugin!

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

Você implementaria isso usando um gancho do WordPress . Eu começaria conectando-me ao login, para que, uma vez que um usuário efetue login, seu plug-in registre a hora no banco de dados. Você pode explorar outras coisas, como definir o status para 'ausente' se clicarem em logout ou 'inativo' se o tempo de logon for mais de duas horas atrás.

Você poderia encontrar um problema se eles estivessem conectados e ativos no site, mas após essa janela de duas horas. Nesse caso, você precisa estar conectado à seção wp-admin para que, sempre que fizerem alguma coisa no wp-admin, ele atualize seu banco de dados para o horário 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...

Com base na sua solução, encontrei um plug-in que cria a tabela e permite que o tempo decorrido seja definido por meio de configurações. Depois de revisar os arquivos do plug-in, não sei como manipular o código para sair online / offline na minha página de modelo de autor. Se você pudesse olhar os arquivos do plug-in e me apontar na direção certa, eu agradeceria: wordpress.org/extend/plugins/who-is-online (Usando suas instruções, irei o mais longe que puder) Enquanto isso, usando um gancho no meu arquivo functions.php)
Dominor Novus

Sucesso! Consultei o banco de dados do plug-in para obter identificações de usuário e identificações de autor. Eu colei o código na minha pergunta (acima).
Dominor Novus 22/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.