Как проверить, вошел ли пользователь (не текущий пользователь) в систему?

22

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

is_user_logged_in () применяется только к текущему пользователю, и я не могу найти подходящий подход, нацеленный на текущего автора, например is_author_logged_in ()

Любые идеи?

Ответ

Один Trick Pony был достаточно любезен, чтобы подготовить кодирование для двух-трех функций с использованием переходных процессов, чего я раньше не использовал.

http://codex.wordpress.org/Transients_API

Добавьте это в 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);
    }

  }
}

Добавьте это в 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>";
}
Доминор Новус
источник
Это одно из худших решений, которое вы можете найти. Этот плагин обновляет базу данных при каждой загрузке страницы ...
onetrickpony
Спасибо за обзор. Я буду держаться подальше. Я ответил на ваш ответ (ниже). Я застрял на создании функции.
Dominor Novus

Ответы:

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 
    }

    Так что это должно выполняться при каждой загрузке страницы, но переходный процесс будет обновляться только при необходимости. Если у вас большое количество пользователей в сети, возможно, вы захотите увеличить период «последней активности», чтобы уменьшить количество записей в БД, но 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записи ...

onetrickpony
источник
Переходные процессы являются новыми для меня. Спасибо за код. Я не могу реализовать первый шаг. Я скопировал ваш первый блок кода и вставил его в function user_online_update() {[ВАШ КОД] }add_action('init', 'user_online_update');в моем файле functions.php - я получаю сообщение об ошибке сервера, которое указывает на то, что что-то не так, или я неправильно истолковал ваши инструкции.
Dominor Novus
1
+1 за предложение использовать переходные процессы. Не многие люди знают о них.
Дуэйн Чаррингтон
@ Доминор: полный код .
onetrickpony
@OneTrickPony: я добавил действие в functions.php. Куда мне добавить вторую функцию (см. Строку 27 вашего полного кода)? Я попробовал авторы.php, а затем функции.фп, но безрезультатно. Я попытался использовать условие в строке 25 вашего полного кода. Каждый раз, страница возвращает ошибку сервера или не анализирует ничего на моей странице, кроме вашего кода. Я удалил свой исходный код и деактивировал "Кто онлайн?" плагин. Что я пропускаю?
Dominor Novus 22.11.11
заменить $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 (Используя ваши инструкции, я пойду настолько далеко, насколько смогу тем временем используя хук в моем файле functions.php)
Dominor Novus
Успех! Я запросил базу данных плагинов для совпадения идентификатора пользователя и идентификатора автора. Я вставил код в мой вопрос (выше).
Dominor Novus