Кастомизируем плагин Whosonline
Популярные запросы: Open Graph, плагин Reading Time, тема Quebec, плагин Telegram, набор иконок Analogue
- 240 просмотров +2
- 3 декабря, 2025
- Обновлено: 29 января, 2026
- admin
- Время чтения: 5 минут
Кастомизация плагина 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">–</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>
В результате сумбурная "штатная" таблица:
у меня превратилась в более информативную:
Теперь для того, чтобы увидеть ботов Фэйсбука, Яндекса и Гугла мне не нужно анализировать каждый отдельный 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 недоступным для незарегистрированных пользователей?
Если удалить права, сбор данных вообще прекращается.
Новый комментарий
Ошибка
Выполнено