it-swarm.com.de

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

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

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

  • erstelle eine User-Online-Update-Funktion, die du auf init einhängst; 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 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_users Einträge entfernen ...

15
onetrickpony

Meines Wissens gibt es keine Möglichkeit, dies mithilfe der 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 Sie einen registrierten Benutzer als "Angemeldet" betrachten würden.

Sie würden dies mit einem WordPress-Hook implementieren . Ich beginne damit, mich anzumelden, dass Ihr Plugin nach dem Anmelden eines Benutzers die Zeit in der Datenbank protokolliert. 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...
1
brock