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>";
}
Odpowiedzi:
Użyłbym nieustalone , aby to zrobić:
utwórz funkcję aktualizacji online, którą podpinasz
init
; wyglądałoby to tak: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:
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_users
wpisy ...źródło
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.$time_limit
z15
i upewnij się, że prawidłowo otwarte / zamknięte tagi php ...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:
następnie zapytaj bazę danych, aby ustalić, czy są zalogowani:
źródło