Добро пожаловать на сайт SEDBY

Кастомизируем плагин Whosonline

  • 239 просмотров +1
  • 3 декабря, 2025
  • Обновлено: 29 января, 2026
  • admin
  • Время чтения: 5 минут
Кастомизируем плагин Whosonline

Кастомизация плагина Whosonline назрела после определенного периода его использования в различных проектах, в том числе по просьбам заказчиков и оптимизаторов. Касается она всего нескольких принципиальных вещей, но, на мой взгляд, информативность расширения повысилась в разы.

Кастомизация шаблона whosonline.tpl

Верстка шаблонов расширений – дело сугубо личное и часто вызывающее болезненные реакции и споры. Поэтому деталей касаться мы не будем и раскроем только принципиальные вещи.

Поскольку просмотр текущих посетителей часто производится с мобильного устройства, первым делом решаем вопрос с адаптивностью. Для фреймворка Bootstrap это решается привычной “оберткой” для таблицы:

<div class="table-responsive">
<!-- Собственно, сама таблица посетителей -->
</div>

Теперь на мобильных устройствах у вас будет не каша, а scrollable таблица. Уже лучше.

Дальше у нас колонка с группой пользователей. Интересно, но далеко не принципиально, поэтому изначально скроем ее и покажем только после того, как ширина рабочей области превысит 991px:

<th class="d-none d-lg-table-cell">{PHP.L.Group}</th>

То же самое сделаем в блоке USERS:

<td class="d-none d-lg-table-cell">{USER_MAIN_GROUP}</td>

и GUESTS:

<td class="d-none d-lg-table-cell">&ndash;</td>

В колонке “Локация” оставим только TPL-теги {USER_SUBLOCATION} и {GUEST_SUBLOCATION} для блоков USERS и GUESTS соответственно. Пояснение ниже.

Наконец, последнее: добавим колонку “Хост”. Она позволит нам не только полюбоваться IP-адресом посетителя или бота, но и понять (если это возможно) кто или что это такое. Для этого добавим в шапку таблицы новую колонку:

<!-- IF {PHP.usr.isadmin} -->
<th>{PHP.L.Ip}</th>
<th>{PHP.L.Host}</th>
<!-- ENDIF -->

Аналогично поступим с блоками USERS и GUESTS:

<!-- IF {PHP.usr.isadmin} -->
<td>{USER_IP}</td>
<td>{HOST}</td>
<!-- ENDIF -->

и

<!-- IF {PHP.usr.isadmin} -->
<td>{GUEST_IP}</td>
<td>{HOST}</td>
<!-- ENDIF -->

Создание новых TPL-тегов пользовательским плагином

Настал момент реализации программной части нашей кастомизации. Поскольку все модификации коснутся регулярных блоков, создаем часть проектного плагина с двумя хуками (да, это тоже возможно):

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=whosonline.users.loop,whosonline.guests.loop
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

Сперва займемся определением хоста. Сделать это можно с помощью сетевой функции gethostbyaddr(). Аргументом для нее является IP-адрес. Поскольку в массиве $row он у нас уже присутствует, код будет простой:

$host = gethostbyaddr($row['online_ip']);
$host = ($host == $row['online_ip']) ? $L['na'] : $host;

Обратите внимание на то, что если определение хоста невозможно, gethostbyaddr() вернет аргумент, т. е. IP-адрес. Для таких случаев выводим человекопонятный ответ.

Блок генерации TPL-тегов:

$t->assign([
  'HOST' => $host,
]);

Теперь история с локациями и сублокациями. Здесь немного мудрено: локация это имя модуля или элемента ядра (home, page, message и проч.), и сублокация – имя конкретного элемента. Например:

  • page / Обратная связь
  • home

В принципе, все понятно, но немного clumsy. Лично для себя я решил это следующим алгоритмом:

  • теги {USER_LOCATION} и {GUEST_LOCATION} попросту удаляем,
  • если сублокация пуста, генерим для нее человекопонятное имя через локацию.

Объяснение сложное, зато код простой:

if (htmlspecialchars($row['online_subloc']) == '') {
  $t->assign([
    'USER_SUBLOCATION' => $L['theme_whosonline_' . $row['online_location']],
    'GUEST_SUBLOCATION' => $L['theme_whosonline_' . $row['online_location']],
  ]);
}

Остается только создать lang-строки типа:

$L['theme_whosonline_home'] = 'Главная страница';
$L['theme_whosonline_messages'] = 'Системные сообщения';

Их я разместил в файле локализации темы.

Конечно, если контента на сайта много, а структура сложная, можно добавить логику и сформировать более понятные имена локаций и сгенерить ссылки на них. 

Если планируете сформировать ссылки, примите решение о необходимости использования в них атрибута rel=”nofollow”

У меня же такой задачи не было, поэтому я ограничился именно такой кастомизацией.

Отмечаем ботов в таблице

Теперь, когда мы вывели и увидели в списке доступные имена хостов, можно отметить такие записи. Например, классом для элемента tr. Но прежде всего, определим подстроки для поиска. Примерно так:

$bots = ['google', 'yandex', 'ahrefs', 'msn.com', 'bot', 'twttr', 'uptimerobot', 'fbsv', 'amazonbot'];

Теперь проверим наличие в переменной $host элемента массива $bots:

$class = (str_replace($bots, '', $host) !== $host) ? 'isbot' : 'isnotbot';

Обновление от 18.01.26

Можно отмечать не только ботов, но и "неботов". Для этого сформируем еще один массив с безопасными подстроками для хостов:

$notbots = ['byfly', 'telecom.by'];

Условие немного изменится:

if (str_replace($bots, '', $host) !== $host) {
  $class = "isbot";
} elseif (str_replace($notbots, '', $host) !== $host) {
  $class = "isnotbot";
} else {
  $class = '';
}

Добавим новые TPL-теги:

$t->assign([
  'HOST' => $host,
  'CLASS' => $class,
]);

И, конечно, определим CSS-стили для ботов и "неботов":

.isbot td { background: fade(@red, 50%); }
.isnotbot td { background: fade(@green, 50%); }

При желании проверить тот или иной IP-адрес, можно добавить ссылку на проверочный сервис. Например, такую:

<a href="https://www.abuseipdb.com/check/{PHP.row.online_ip}" target="_blank">
  {PHP.R.icon_plug_hiddengroups}
</a>

В результате сумбурная "штатная" таблица:

Коробочный вид таблицы Whosonline
Коробочный вид таблицы Whosonline

у меня превратилась в более информативную:

Таблица Whosonline после кастомизации
Таблица Whosonline после кастомизации

Теперь для того, чтобы увидеть ботов Фэйсбука, Яндекса и Гугла мне не нужно анализировать каждый отдельный IP-адрес.

Заключение

С помощью несложных действий у меня получилось сделать вывод плагина Whosonline из дистрибутива Cotonti Siena более компактным и информативным. Главным образом, хотелось видеть общую картину не только по IP-адресам, но и хостам. Используя хуки, задачу удалось решить просто и, не изменяя код дистрибутива.

Happy coding!

В предыдущей статье был решен вопрос запрета индексации страниц.


Комментарии:
Аватар

С правами правда не получится: иначе плагин не сможет собирать данные. Необходимо с хуком whosonline.main добавить следующую строку:

(Cot::$usr['id'] == 0) && $t = new XTemplate(cot_tplfile('whosonline.guests', 'plug'));

И рядом с шаблоном whosonline.tpl положить whosonline.guests.tpl

Аватар

Можно ли сделать просмотр данных Whosonline недоступным для незарегистрированных пользователей? 

Если удалить права, сбор данных вообще прекращается.


Новый комментарий

Ваш комментарий будет доступен для редактирования 10 минут
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость