Wie überprüfe ich, ob ein Benutzer (nicht aktueller Benutzer) angemeldet ist?

22

Ich muss den Onlinestatus (online / offline) für jede Autorenseite (benutzerdefinierte Autorenseitenvorlage) anzeigen.

is_user_logged_in () gilt nur für den aktuellen Benutzer und ich kann keinen relevanten Ansatz für den aktuellen Autor finden, z. B. is_author_logged_in ()

Irgendwelche Ideen?

Antworten

Ein Trick Pony war so nett, die Codierung für zwei bis drei Funktionen mit Hilfe von Transienten vorzubereiten, was ich vorher nicht benutzt hatte.

http://codex.wordpress.org/Transients_API

Füge dies zu functions.php hinzu:

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

  }
}

Fügen Sie dies zu author.php (oder einer anderen Seitenvorlage) hinzu:

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

Zweite Antwort (nicht verwenden)

Diese Antwort dient als Referenz. Wie von One Trick Pony hervorgehoben, ist dies ein unerwünschter Ansatz, da die Datenbank bei jedem Laden der Seite aktualisiert wird. Nach einer weiteren Überprüfung schien der Code nur den Anmeldestatus des aktuellen Benutzers zu erkennen, anstatt ihn zusätzlich mit dem aktuellen Autor abzugleichen.

1) Installiere dieses Plugin: http://wordpress.org/extend/plugins/who-is-online/

2) Fügen Sie Ihrer Seitenvorlage Folgendes hinzu:

//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
quelle
Das ist eine der schlechtesten Lösungen, die Sie finden konnten. Dieses Plugin aktualisiert die Datenbank bei jedem Laden der Seite ...
onetrickpony 22.11.11
Vielen Dank für die Überprüfung. Ich werde klar steuern. Ich habe auf Ihre Antwort geantwortet (siehe unten). Ich bin beim Erstellen der Funktion festgefahren.
Dominor Novus

Antworten:

15

Ich würde Transienten verwenden , um dies zu tun:

  • Erstellen Sie eine User-Online-Update-Funktion, die Sie einbinden init. es würde ungefähr so ​​aussehen:

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

    Dies sollte also bei jedem Laden der Seite ausgeführt werden, der Übergang wird jedoch nur aktualisiert, wenn dies erforderlich ist. Wenn Sie eine große Anzahl von Benutzern online haben, möchten Sie möglicherweise den Zeitrahmen für die "letzte Aktivität" verlängern, um die Anzahl der Datenbankschreibvorgänge zu verringern. Für die meisten Websites sind jedoch 15 Minuten mehr als ausreichend ...

  • Um jetzt zu überprüfen, ob der Benutzer online ist, schauen Sie einfach in diesen Übergang, um festzustellen, ob ein bestimmter Benutzer online ist, wie oben beschrieben:

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

Der Übergang läuft in 30 Minuten ab, wenn überhaupt keine Aktivität stattfindet. Wenn Sie jedoch ständig Benutzer online haben, läuft dieser nicht ab. Bereinigen Sie diesen Übergang daher in regelmäßigen Abständen, indem Sie eine andere Funktion für ein zweimal tägliches Ereignis oder ähnliches aktivieren. Diese Funktion würde alte $logged_in_usersEinträge entfernen ...

ein Trickpony
quelle
Übergänge sind neu für mich. Danke für den Code. Ich kann den ersten Schritt nicht ausführen. Ich habe Ihren ersten Codeblock kopiert und in function user_online_update() {[IHR CODE] }add_action('init', 'user_online_update');in meine functions.php-Datei eingefügt. Ich erhalte einen Serverfehler, der darauf hindeutet, dass etwas nicht richtig analysiert wurde oder ich Ihre Anweisungen falsch interpretiert habe.
Dominor Novus
1
+1 für den Vorschlag, Transienten zu verwenden. Nicht viele Leute kennen sie.
Dwayne Charrington
@Dominor: der vollständige Code .
onetrickpony
@OneTrickPony: Ich habe die Aktion zu functions.php hinzugefügt. Wo füge ich die zweite Funktion hinzu (siehe Zeile 27 Ihres vollständigen Codes)? Ich habe authors.php und dann functions.php ausprobiert, aber ohne Erfolg. Ich habe versucht, die Bedingung in Zeile 25 Ihres vollständigen Codes zu verwenden. Die Seite gibt jedes Mal einen Serverfehler zurück oder analysiert nur Ihren Code auf meiner Seite. Ich habe meinen ursprünglichen Code entfernt und die Option "Wer ist online?" Deaktiviert. Plugin. Was übersehe ich?
Dominor Novus
Ersetzen Sie $time_limitmit 15und stellen Sie sicher, dass Sie die PHP-Tags korrekt geöffnet / geschlossen haben ...
onetrickpony
1

Meines Wissens gibt es keine Möglichkeit, dies mit den integrierten WordPress-Funktionen zu tun, aber lassen Sie sich davon nicht entmutigen. schreibe ein Plugin!

Eine Möglichkeit besteht darin, eine neue Tabelle in der Datenbank zu erstellen, die lediglich die letzte Aktivität des Benutzers auf der Site protokolliert. Sie könnten auch eine Einstellungsseite für Ihr Plugin haben, die festlegt, wie lange ein registrierter Benutzer als "Angemeldet" eingestuft wird.

Sie würden dies mit einem WordPress-Hook implementieren . Ich beginne damit, mich anzumelden. Sobald sich ein Benutzer anmeldet, protokolliert Ihr Plugin die Zeit in der Datenbank. Sie können dann andere Dinge untersuchen, z. B. den Status auf "Abwesend" setzen, wenn sie auf "Abmelden" klicken, oder "Inaktiv", wenn ihre Anmeldezeit mehr als zwei Stunden zurückliegt.

Sie würden auf ein Problem stoßen, wenn sie angemeldet und auf der Site aktiv sind, aber nach diesem zweistündigen Fenster. In diesem Fall müssten Sie in den Abschnitt wp-admin eingebunden sein, damit Ihre Datenbank bei jeder Aktion in wp-admin auf die aktuelle Uhrzeit aktualisiert wird.

Dann müssten Sie für die Posts zwei Dinge tun: den Autor des aktuellen Posts abrufen:

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

Fragen Sie dann Ihre Datenbank ab, um festzustellen, ob sie angemeldet sind:

<?php if your_plugin_function($user_login)... ?>
...display something...
brock
quelle
Basierend auf Ihrer Lösung habe ich ein Plugin gefunden, mit dem die Tabelle erstellt und die abgelaufene Zeit über Einstellungen definiert werden kann. Nachdem ich die Plugin-Dateien überprüft habe, bin ich mir nicht sicher, wie ich den Code manipulieren soll, um ihn online / offline auf meiner Autorenvorlagenseite auszugeben. Wenn Sie einen Blick auf die Plugin-Dateien werfen und mich in die richtige Richtung lenken könnten, wäre ich Ihnen dankbar: wordpress.org/extend/plugins/who-is-online (Ich werde nach Ihren Anweisungen so weit wie möglich gehen In der Zwischenzeit benutze ich einen Haken in meiner Datei functions.php)
Dominor Novus
Erfolg! Ich habe die Plugin-Datenbank nach Übereinstimmungen mit Benutzer- und Autoren-ID durchsucht. Ich habe den Code in meine Frage (oben) eingefügt.
Dominor Novus