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

22

Je dois afficher l'état en ligne (en ligne / hors ligne) pour 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 ciblant l'auteur actuel, par exemple is_author_logged_in ()

Des idées?

Répondre

Un Trick Pony a eu la gentillesse de préparer le codage de deux à trois fonctions en utilisant des transitoires, ce que je n'avais pas 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 n'est pas souhaitable 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 ce qui suit à 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>";
}
Dominor Novus
la source
C'est l'une des pires solutions que vous puissiez trouver. Ce plug - in est mise à jour le db sur chaque chargement de page ...
onetrickpony
Merci de l'avoir examiné. Je vais rester clair. J'ai répondu à votre réponse (ci-dessous). Je suis bloqué sur la création de la fonction.
Dominor Novus

Réponses:

15

J'utiliserais des transitoires pour ce faire:

  • créer une fonction de mise à jour utilisateur en ligne à laquelle vous vous connectez init; cela ressemblerait à quelque chose comme ceci:

    // 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 sera mis à jour uniquement si nécessaire. Si vous avez un grand nombre d'utilisateurs en ligne, vous voudrez peut-être augmenter le délai de "dernière activité" pour réduire les écritures de 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, regardez simplement à l'intérieur de ce transitoire pour voir si un certain 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, il n'expirerait pas, alors vous voudrez peut-être nettoyer ce transitoire périodiquement en connectant une autre fonction à un événement deux fois par jour ou quelque chose comme ça. Cette fonction supprimerait les anciennes $logged_in_usersentrées ...

onetrickpony
la source
Les transitoires sont nouveaux pour moi. Merci pour le code. Je ne peux pas implémenter la première étape. J'ai copié votre premier bloc de code et l'ai collé dans function user_online_update() {[VOTRE CODE] }add_action('init', 'user_online_update');dans mon fichier functions.php - je reçois une erreur de serveur qui suggère que quelque chose ne se passe pas bien ou j'ai mal interprété vos instructions.
Dominor Novus
1
+1 pour avoir suggéré d'utiliser des transitoires. Peu de gens les connaissent.
Dwayne Charrington
@Dominor: le code complet .
onetrickpony
@OneTrickPony: J'ai ajouté l'action à functions.php. Où dois-je ajouter la deuxième fonction (voir la ligne 27 de votre code complet)? J'ai essayé auteurs.php et ensuite functions.php mais en vain. J'ai essayé d'utiliser la condition à la ligne 25 de votre code complet. Chaque fois, la page renvoie une erreur de serveur ou bien n'analyse rien dans ma page au-delà de votre code. J'ai supprimé mon code d'origine et désactivé le "Qui est en ligne?" brancher. Qu'est-ce que je néglige?
Dominor Novus
remplacer $time_limitpar 15et assurez-vous que vous avez correctement ouvert / fermé les balises php ...
onetrickpony
1

À ma connaissance, il n'y a aucun moyen de le faire en utilisant les fonctions WordPress intégrées , mais ne vous laissez pas décourager; écrire un plugin!

Une façon de le faire est de créer une nouvelle table dans la base de données qui suit simplement la dernière fois que l'utilisateur était actif sur le site. Vous pouvez également avoir une page de paramètres pour votre plugin qui détermine la durée pendant laquelle vous considérerez qu'un utilisateur enregistré est «connecté».

Vous implémenteriez cela en utilisant un hook WordPress . Je commencerais par me connecter à la connexion, de sorte qu'une fois qu'un utilisateur se connecte, votre plugin enregistre l'heure dans la base de données. Vous pouvez ensuite explorer d'autres choses, comme définir leur statut sur «absent» s'ils cliquent sur la déconnexion, ou «inactif» si leur heure de connexion est supérieure à deux heures.

Vous rencontriez 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 que chaque fois qu'ils font 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...
brock
la source
Sur la base de votre solution, j'ai trouvé un plugin qui crée la table et permet de définir le temps écoulé via les paramètres. Après avoir examiné les fichiers du plugin, je ne sais pas comment manipuler le code pour sortir en ligne / hors ligne dans ma page de modèle d'auteur. Si vous pouviez jeter un coup d'œil aux fichiers du plugin et me diriger dans la bonne direction, j'apprécierais: wordpress.org/extend/plugins/who-is-online (En utilisant vos instructions, j'irai aussi loin que je peux en attendant en utilisant un crochet dans mon fichier functions.php)
Dominor Novus
Succès! J'ai interrogé la base de données du plugin pour les correspondances entre l'ID utilisateur et l'ID auteur. J'ai collé le code dans ma question (ci-dessus).
Dominor Novus