Як перевірити, чи ввійшов користувач (не поточний користувач)?


22

Мені потрібно відображати статус в Інтернеті (онлайн / офлайн) для кожної сторінки автора (користувацький шаблон авторської сторінки).

is_user_logged_in () стосується лише поточного користувача, і я не можу знайти відповідний підхід, орієнтований на поточного автора, наприклад is_author_logged_in ()

Будь-які ідеї?

Відповідь

Один Трік Поні був досить люб’язним, щоб підготувати кодування двох-трьох функцій за допомогою перехідних процесів, чого я раніше не використовував.

http://codex.wordpress.org/Transients_API

Додайте це до function.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);
    }

  }
}

Додайте це до author.php (або іншого шаблону сторінки):

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

Другий відповідь (не використовувати)

Ця відповідь включена для довідок. Як вказував One Trick Pony, це підхід не бажаний, оскільки база даних оновлюється при кожному завантаженні сторінки. Після подальшої перевірки код, здавалося, лише виявляє статус входу поточного користувача, а не додатково співпадає з цим поточним автором.

1) Встановіть цей плагін: http://wordpress.org/extend/plugins/who-is-online/

2) Додайте до шаблону сторінки наступне:

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

Це одне з найгірших рішень, які ви могли знайти. Цей плагін оновлює db для кожного завантаження сторінки ...
onetrickpony

Дякуємо за перегляд. Я буду триматися ясно. Я відповів на вашу відповідь (нижче). Я застряг у створенні функції.
Домінор Новус

Відповіді:


15

Для цього я використовую перехідні процеси :

  • створити функцію оновлення користувача через Інтернет, яку ви підключите init; це виглядатиме приблизно так:

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

    Отже, це має працювати на кожному завантаженні сторінки, але перехідний час буде оновлюватися лише за потреби. Якщо у вас є велика кількість користувачів в Інтернеті, можливо, ви захочете збільшити часовий інтервал "останньої активності", щоб зменшити кількість записів на db, але 15 хвилин більш ніж достатньо для більшості сайтів ...

  • Тепер, щоб перевірити, чи користувач в Інтернеті, просто загляньте всередину цього перехідного періоду, щоб побачити, чи є певний користувач в Інтернеті, як ви робили вище:

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

Перехідний час закінчується через 30 хвилин, якщо взагалі немає активності. Але якщо у вас є користувачі в Інтернеті весь час, це не закінчується, тому ви можете періодично очищати цей перехідний період, підключаючи іншу функцію на подію двічі на день або щось подібне. Ця функція видалить старі $logged_in_usersзаписи ...


Перехідні для мене нові. Дякуємо за код. Я не можу реалізувати перший крок. Я скопіював ваш перший код коду і вставив його у function user_online_update() {[ВАШ КОД] }add_action('init', 'user_online_update');у файл function.php - я отримую помилку на сервері, яка говорить про те, що щось неправильно розбирається або я неправильно інтерпретував ваші інструкції.
Домінор Новус

1
+1 за пропозицію використовувати перехідні процеси. Не багато людей знають про них.
Дуейн Чаррінгтон


@OneTrickPony: Я додав дію до function.php. Де я додам другу функцію (див. Рядок 27 вашого повного коду)? Я спробував avtor.php, а потім function.php, але безрезультатно. Я спробував використати умову в рядку 25 вашого повного коду. Кожен раз, коли сторінка повертає помилку сервера, інакше нічого не аналізується на моїй сторінці, крім вашого коду. Я видалив свій початковий код і деактивував "Хто в мережі?" підключати. Що я оглядаю?
Dominor Novus

замінити $time_limitз 15і переконайтеся , що ви правильно відкрити / закрити PHP теги ...
onetrickpony

1

Наскільки мені відомо, немає способу зробити це за допомогою вбудованих функцій WordPress , але не дозволяйте це відштовхувати вас; написати плагін!

Один із способів зробити це можна, створивши нову таблицю в базі даних, яка просто відстежує останній раз, коли користувач був активним на сайті. Ви також можете мати сторінку налаштувань для свого плагіна, яка визначає, як довго ви вважатимете зареєстрованого користувача "Увійти".

Ви реалізуєте це за допомогою гачка WordPress . Я б почав з підключення до логіна, щоб після входу користувача ваш плагін записував час у базі даних. Потім ви можете вивчити інші речі, такі як встановлення їх статусу "у відсутності", якщо вони натискають вихід, або "в режимі очікування", якщо час їх входу був більше двох годин тому.

Ви можете зіткнутися з проблемою, якщо вони ввійшли в систему та діють на сайті, але минули ці два години. У цьому випадку вам потрібно буде підключити його до розділу wp-admin, щоб у будь-який час вони зробили що-небудь у wp-admin, він оновлює вашу базу даних до поточного часу.

Потім у публікаціях вам слід зробити дві речі: отримати автора поточної публікації:

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

потім запитайте вашу базу даних, щоб визначити, чи вони ввійшли:

<?php if your_plugin_function($user_login)... ?>
...display something...

На основі вашого рішення я знайшов плагін, який створює таблицю і дозволяє визначати пропущений час через налаштування. Переглянувши файли плагінів, я не впевнений, як маніпулювати кодом для виведення в Інтернет / офлайн на моїй сторінці шаблона автора. Якщо ви можете поглянути на файли плагінів і вказати мені в правильному напрямку, я вдячний: wordpress.org/extend/plugins/who-is-online (Використовуючи ваші вказівки, я піду наскільки я можу піти тим часом, використовуючи гачок у моєму файлі function.php)
Домінор Ноус

Успіху! Я запитав базу даних плагінів щодо ідентифікації користувача та ідентифікатора автора. Я вставив код у своєму запитанні (вище).
Домінор Новус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.