web-dev-qa-db-fra.com

Comment vérifier si un utilisateur est déjà connecté?

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 () ne s'applique qu'à 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éponse

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

http://codex.wordpress.org/Transients_API

Ajoutez 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 l'état de connexion de l'utilisateur actuel plutôt que de le faire correspondre à l'auteur actuel.

1) Installez ce plugin: http://wordpress.org/extend/plugins/who-is-online/

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>";
}
22
Dominor Novus

Je voudrais utiliser transitoires pour faire ceci:

  • créer une fonction de mise à jour en ligne de l'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 être exécuté à 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 sur la base de données, mais 15 minutes sont plus que suffisantes 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 si les utilisateurs sont en ligne tout le temps, ils n'expireront pas. Vous pouvez donc nettoyer périodiquement ce problème passager en ajoutant une autre fonction à un événement deux fois par jour ou quelque chose du genre. Cette fonction supprimerait les anciennes entrées $logged_in_users ...

15
onetrickpony

À ma connaissance, il n’existe aucun moyen de le faire à l’aide des fonctions intégrées de WordPress , mais ne vous découragez pas; écrire un plugin!

Pour ce faire, vous pouvez notamment 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é".

Vous pouvez implémenter ceci en utilisant un WordPress hook . 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 rencontreriez un problème s'ils étaient 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 devez faire deux choses: obtenir l’auteur du message actuel:

<?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...
1
brock