Intereting Posts
Удалить «Проверить совместимость» в меню «Плагины» Добавить стандартные атрибуты страницы Metabox для страницы Parent Могу ли я разместить WP-admin локально для удаленного блога? customize_register с несколькими элементами управления / настройками – как получить значения? Список URL-адресов WordPress по умолчанию Может ли WordPress изменять размеры BMP-файлов? Как перенести веб-сайт на основе пользовательской базы данных в WordPress? Фильтровать медиабиблиотеку по размеру Как сохранить страницу, на которой я включен в URL, при поиске в таксономии? Google Page Speed ​​Insights не распознает настройки WP-Cofig? Отслеживание даты публикации как пользовательской переменной для Google Analytics Как заставить мой сайт использовать HTTPS для изображений или как вставлять изображения в качестве относительных путей? Пользовательская таксономия не возвращает сообщений Как перенаправить wp-admin / index.php на пользовательский тип сообщения? WordPress SLOW, все!

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

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

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

Solutions Collecting From Web of "Как проверить, зарегистрирован ли пользователь (не текущий пользователь)?"

Я бы использовал переходные процессы для этого:

  • создать функцию онлайн-обновления, которую вы используете для 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

Насколько я знаю, нет возможности сделать это, используя встроенные функции WordPress , но не позволяйте этому препятствовать вам; написать плагин!

Один из способов сделать это – создать новую таблицу в базе данных, которая просто отслеживает последний раз, когда пользователь был активен на сайте. У вас также может быть страница настроек для вашего плагина, которая определила, как долго вы будете считать зарегистрированного пользователя «вошедшим в систему».

Это можно реализовать с помощью WordPress . Я бы начал подключаться к логину, так что, как только пользователь войдет в систему, ваш плагин регистрирует время в базе данных. Затем вы можете исследовать другие вещи, такие как установление своего статуса на «прочь», если они нажмут «выйти» или «простаивают», если их время входа в систему было более двух часов назад.

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

Затем, на должностях, вам нужно будет сделать две вещи: получить автора текущего сообщения:

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

затем запросите свою базу данных, чтобы определить, вошли ли они в систему:

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