Jak sprawdzić, czy użytkownik (nie bieżący) jest zalogowany?

22

Muszę wyświetlić status online (online / offline) dla każdej strony autora (niestandardowy szablon strony autora).

is_user_logged_in () dotyczy tylko bieżącego użytkownika i nie mogę znaleźć odpowiedniego podejścia skierowanego do bieżącego autora, np. is_author_logged_in ()

Jakieś pomysły?

Odpowiedź

Jeden Trick Pony był na tyle miły, że przygotował kodowanie dla dwóch do trzech funkcji za pomocą transjentów, czego wcześniej nie używałem.

http://codex.wordpress.org/Transients_API

Dodaj to do 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);
    }

  }
}

Dodaj to do autor.php (lub innego szablonu strony):

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

Druga odpowiedź (nie używać)

Ta odpowiedź jest dołączona w celach informacyjnych. Jak zauważył One Trick Pony, jest to niepożądane podejście, ponieważ baza danych jest aktualizowana przy każdym ładowaniu strony. Po dalszej analizie kod wydawał się raczej wykrywać status zalogowania bieżącego użytkownika niż dodatkowo dopasowywać go do bieżącego autora.

1) Zainstaluj tę wtyczkę: http://wordpress.org/extend/plugins/who-is-online/

2) Dodaj następujące elementy do szablonu strony:

//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
źródło
To jedno z najgorszych rozwiązań, jakie można znaleźć. Ta wtyczka aktualizuje db przy każdym ładowaniu strony ...
onetrickpony 22.11.11
Dzięki za sprawdzenie. Będę omijać. Odpowiedziałem na twoją odpowiedź (poniżej). Utknąłem na tworzeniu funkcji.
Dominor Novus,

Odpowiedzi:

15

Użyłbym nieustalone , aby to zrobić:

  • utwórz funkcję aktualizacji online, którą podpinasz init; wyglądałoby to tak:

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

    Powinno to więc działać przy każdym ładowaniu strony, ale stan przejściowy zostanie zaktualizowany tylko w razie potrzeby. Jeśli masz dużą liczbę użytkowników online, możesz chcieć zwiększyć przedział czasowy „ostatniej aktywności”, aby zmniejszyć liczbę zapisów db, ale 15 minut to więcej niż wystarcza dla większości witryn ...

  • teraz, aby sprawdzić, czy użytkownik jest online, po prostu zajrzyj do tego przejściowego, aby zobaczyć, czy dany użytkownik jest online, tak jak to zrobiłeś powyżej:

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

Transient wygasa po 30 minutach, jeśli nie ma żadnej aktywności. Ale jeśli masz użytkowników online przez cały czas, to nie wygasa, więc możesz chcieć okresowo usuwać przejściowe, przechwytując inną funkcję na zdarzeniu dwa razy dziennie lub coś w tym rodzaju. Ta funkcja usuwa stare $logged_in_userswpisy ...

onetrickpony
źródło
Przejściowe są dla mnie nowe. Dzięki za kod. Nie mogę wdrożyć pierwszego kroku. Skopiowałem twój pierwszy blok kodu i wkleiłem go do function user_online_update() {[TWÓJ KOD] }add_action('init', 'user_online_update');w moim pliku functions.php - Otrzymuję błąd serwera, który sugeruje, że coś nie analizuje poprawnie lub źle zinterpretowałem twoje instrukcje.
Dominor Novus,
1
+1 za sugerowanie użycia stanów nieustalonych. Niewiele osób o nich wie.
Dwayne Charrington
@Dominor: pełny kod .
onetrickpony
@OneTrickPony: Dodałem akcję do functions.php. Gdzie mogę dodać drugą funkcję (patrz wiersz 27 pełnego kodu)? Próbowałem autorskich.php, a następnie functions.php, ale bezskutecznie. Próbowałem użyć warunku w wierszu 25 pełnego kodu. Za każdym razem strona zwraca błąd serwera, w przeciwnym razie nie analizuje niczego na mojej stronie poza twoim kodem. Usunąłem swój oryginalny kod i dezaktywowałem „Kto jest online?” podłącz. Co przeoczam?
Dominor Novus
wymienić $time_limitz 15i upewnij się, że prawidłowo otwarte / zamknięte tagi php ...
onetrickpony
1

Według mojej wiedzy nie ma sposobu, aby to zrobić za pomocą wbudowanych funkcji WordPress , ale nie zniechęcaj się; napisz wtyczkę!

Jednym ze sposobów na to jest utworzenie nowej tabeli w bazie danych, która po prostu śledzi ostatnią aktywność użytkownika w witrynie. Możesz także mieć stronę ustawień wtyczki, która określa, jak długo uważasz zarejestrowanego użytkownika za „Zalogowanego”.

Zaimplementowałbyś to za pomocą haka WordPress . Zacznę od podpięcia się do loginu, aby po zalogowaniu użytkownika wtyczka rejestrowała czas w bazie danych. Następnie możesz zbadać inne rzeczy, takie jak ustawienie ich statusu na „nieobecny”, jeśli klikną się wylogować, lub „bezczynny”, jeśli ich czas logowania był dłuższy niż dwie godziny temu.

Wystąpiłby problem, jeśli są oni zalogowani i aktywni w witrynie, ale po upływie tego dwugodzinnego okna. W takim przypadku konieczne będzie zaczepienie się w sekcji wp-admin, aby za każdym razem, gdy zrobią cokolwiek w ramach wp-admin, zaktualizuje bazę danych do bieżącego czasu.

Następnie na postach musisz zrobić dwie rzeczy: uzyskać autora bieżącego postu:

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

następnie zapytaj bazę danych, aby ustalić, czy są zalogowani:

<?php if your_plugin_function($user_login)... ?>
...display something...
śmierdziel
źródło
W oparciu o twoje rozwiązanie znalazłem wtyczkę, która tworzy tabelę i pozwala zdefiniować upływ czasu za pomocą ustawień. Po przejrzeniu plików wtyczek nie jestem pewien, jak manipulować kodem, aby wyświetlać online / offline na mojej stronie szablonu autora. Jeśli mógłbyś rzucić okiem na pliki wtyczek i skierować mnie we właściwym kierunku, byłbym wdzięczny: wordpress.org/extend/plugins/who-is-online (Korzystając z twoich instrukcji, posunę się tak daleko, jak to możliwe w międzyczasie za pomocą haka w moim pliku functions.php)
Dominor Novus
Sukces! Zapytałem bazę danych wtyczek o identyfikator użytkownika i identyfikator autora. Wkleiłem kod w swoim pytaniu (powyżej).
Dominor Novus