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>";
}
Réponses:
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: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:
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_users
entrées ...la source
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.$time_limit
par15
et assurez-vous que vous avez correctement ouvert / fermé les balises php ...À 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:
puis interrogez votre base de données pour déterminer si elles sont connectées:
la source