Мне нужно отображать онлайн-статус (онлайн / оффлайн) для каждой страницы автора (пользовательский шаблон страницы автора).
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>";
}
Ответы:
Я бы использовал переходные процессы для этого:
создайте пользовательскую функцию онлайн-обновления, которую вы подключите
init
; это будет выглядеть примерно так:Так что это должно выполняться при каждой загрузке страницы, но переходный процесс будет обновляться только при необходимости. Если у вас большое количество пользователей в сети, возможно, вы захотите увеличить период «последней активности», чтобы уменьшить количество записей в БД, но 15 минут более чем достаточно для большинства сайтов ...
Теперь, чтобы проверить, находится ли пользователь в сети, просто загляните внутрь этого переходного процесса, чтобы увидеть, находится ли определенный пользователь в сети, как вы это делали выше:
Переходный процесс истекает через 30 минут, если нет никакой активности вообще. Но в случае, если у вас есть постоянные пользователи в сети, срок его действия не истечет, поэтому вы можете периодически очищать этот переходный процесс, подключая другую функцию к событию два раза в день или что-то в этом роде. Эта функция удалит старые
$logged_in_users
записи ...источник
function user_online_update() {
[ВАШ КОД]}add_action('init', 'user_online_update');
в моем файле functions.php - я получаю сообщение об ошибке сервера, которое указывает на то, что что-то не так, или я неправильно истолковал ваши инструкции.$time_limit
с15
и убедитесь , что вы правильно открыть / закрыть PHP теги ...Насколько мне известно, нет способа сделать это с помощью встроенных функций WordPress , но не позволяйте этому обескураживать вас; написать плагин!
Один из способов сделать это - создать новую таблицу в базе данных, которая просто отслеживает, когда в последний раз пользователь был активен на сайте. Вы также можете иметь страницу настроек для вашего плагина, которая определяет, как долго вы будете считать зарегистрированного пользователя «авторизованным».
Вы бы реализовали это с помощью хука WordPress . Я бы начал с того, что подключился к логину, чтобы после входа в систему ваш плагин регистрировал время в базе данных. Затем вы могли бы исследовать другие вещи, такие как установка их статуса «прочь», если они нажимают кнопку «Выйти», или «неактивна», если время их входа было более двух часов назад.
Вы столкнетесь с проблемой, если они вошли в систему и активны на сайте, но после этого двухчасового окна. В этом случае вам необходимо подключиться к разделу wp-admin, чтобы в любое время, когда они что-либо делали в wp-admin, он обновлял вашу базу данных до текущего времени.
Затем над сообщениями вам нужно будет сделать две вещи: получить автора текущего сообщения:
затем запросите вашу базу данных, чтобы определить, вошли ли они в систему:
источник