Comment vérifier si un utilisateur (autre que l'utilisateur actuel) est connecté?

20

Je dois afficher le statut en ligne (en ligne / hors ligne) de chaque page d'auteur (modèle de page d'auteur personnalisé).

is_user_logged_in () s'applique uniquement à l'utilisateur actuel et je ne trouve pas d'approche pertinente visant l'auteur actuel, par exemple. is_author_logged_in ()

Des idées?

Répondre

One Trick Pony a eu la gentillesse de préparer le codage de deux ou trois fonctions utilisant des transitoires, ce que je n’avais jamais utilisé auparavant.

enlace

Ajouter ceci à 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);
    }

  }
}

Ajoutez ceci à author.php (ou un autre modèle de page):

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

Deuxième réponse (ne pas utiliser)

Cette réponse est incluse pour référence. Comme l'a souligné One Trick Pony, cette approche est indésirable, car la base de données est mise à jour à chaque chargement de page. Après un examen plus approfondi, le code semblait seulement détecter le statut de connexion de l'utilisateur actuel au lieu de le faire correspondre à l'auteur actuel.

1) Installez ce plugin: enlace

2) Ajoutez les éléments suivants à votre modèle de page:

//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>";
}
    
posée Dominor Novus 21.11.2011 - 23:28

2 réponses

15

J'utiliserais les transitoires pour le faire:

  • créez une fonction de mise à jour en ligne d'utilisateur que vous accrochez à init ; cela ressemblerait à quelque chose comme ça:

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

    Cela devrait donc s'exécuter à chaque chargement de page, mais le transitoire ne sera mis à jour que si nécessaire. Si vous avez un grand nombre d’utilisateurs en ligne, vous voudrez peut-être augmenter le délai de la "dernière activité" pour réduire les écritures à la base de données, mais 15 minutes suffisent amplement pour la plupart des sites ...

  • maintenant pour vérifier si l'utilisateur est en ligne, il suffit de regarder à l'intérieur de ce passager pour voir si un utilisateur est en ligne, comme vous l'avez fait ci-dessus:

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

Le transitoire expire dans 30 minutes s'il n'y a aucune activité. Mais au cas où vous auriez des utilisateurs en ligne tout le temps, ils n'expireront pas. Vous voudrez peut-être donc nettoyer ce transitoire périodiquement en ajoutant une autre fonction à un événement bi-quotidien ou quelque chose comme ça. Cette fonction supprimerait les anciennes entrées $logged_in_users ...

    
réponse donnée onetrickpony 22.11.2011 - 01:52
1

À ma connaissance, il n’existe aucun moyen de le faire en utilisant les fonctions WordPress intégrées , mais ne les laissons pas vous décourager écrire un plugin!

Pour ce faire, vous pouvez créer une nouvelle table dans la base de données qui trace simplement la dernière fois que l'utilisateur a été actif sur le site. Vous pouvez également avoir une page de paramètres pour votre plug-in qui détermine le temps pendant lequel un utilisateur enregistré sera "connecté".

Pour ce faire, utilisez un hook WordPress . Je commencerais par me connecter à la connexion, de sorte qu'une fois qu'un utilisateur se connecte, votre plug-in enregistre l'heure dans la base de données. Vous pouvez ensuite explorer d'autres options, telles que définir leur statut sur "absent" s'ils cliquent sur la déconnexion ou sur "inactif" si leur temps de connexion est supérieur à deux heures.

Vous pourriez rencontrer un problème s’ils sont connectés et actifs sur le site, mais au-delà de cette fenêtre de deux heures. Dans ce cas, vous devez être connecté à la section wp-admin pour pouvoir effectuer quoi que ce soit dans wp-admin, il met à jour votre base de données à l'heure actuelle.

Ensuite, sur les messages, vous devrez faire deux choses: obtenir l'auteur du message en cours:

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

puis interrogez votre base de données pour déterminer si elles sont connectées:

<?php if your_plugin_function($user_login)... ?>
...display something...
    
réponse donnée brock 22.11.2011 - 00:21

Lire d'autres questions sur les étiquettes