Пишем счетчик посещений за текущий день
Популярные запросы: Open Graph, плагин Reading Time, тема Quebec, плагин Telegram, набор иконок Analogue
- 120 просмотров +1
- 13 декабря, 2025
- Обновлено: 2 января, 2026
- admin
- Время чтения: 5 минут
- 2 (Подробно)
Счетчик просмотров страниц сайта является одной из возможностей модуля Pages из дистрибутива CMS Cotonti Siena. Точность замеров – предмет отдельного обсуждения, поэтому в рамках данной публикации для данного показателя будем использовать термин number of pages served.
Подготовка к созданию счетчика
Для формирования и хранения данных просмотра конкретной страницы за текущие сутки нам необходимо два динамических элемента:
- значение текущей даты,
- значение счетчика каждой страницы.
Если фиксируется изменение даты (переход на следующий день), нам необходимо обновить значение текущей даты и обнулить счетчики для всех страниц.
Исходя из данного алгоритма, определим места хранения данных. Логично будет предположить, что для счетчика посещений оптимальнее всего будет использовать экстраполе page_today_visits. Поскольку значение текущей даты одно, его проще зафиксировать в таблице cot_stats плагина Hits.
Теперь определимся с хуком – точкой входа, в которой будет встроен наш код. Нам необходимо сформировать значение нашего экстраполе прежде, чем оно будет добавлено в массив $pag функцией cot_generate_pagetags().
Используем самый первый хук – page.first. На данном этапе уже выполнена проверка доступности страницы для пользователя:
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', 'any');
cot_block(Cot::$usr['auth_read']);
и импортированы переменные:
$id = cot_import('id', 'G', 'INT');
$al = Cot::$db->prep(cot_import('al', 'G', 'TXT'));
$c = cot_import('c', 'G', 'TXT');
$pg = cot_import('pg', 'G', 'INT');
Из них для доступа к экстраполю страницы нам потребуются $id и $al. Теперь можем начинать. В проектном плагине создадим файл my_plugin.page.first.php со следующим содержимым:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=page.main
[END_COT_EXT]
==================== */
defined('COT_CODE') or die('Wrong URL');
Выгрузим файл на удаленный сервер и обновим плагин в админке для подключения данной его части.
Выполняем необходимые проверки и формируем SQL-запрос
Прежде всего, определим текущую дату и возьмем соответствующее значение из таблицы cot_stats:
$today = cot_date('ymd', Cot::$sys['now']);
$current_today = cot_stat_get('today');
Мы используем формат ymd, с помощью которого текущая дата представляется в виде шестизначного целого числа. Например, 251213 для 13 декабря 2025 года.
Проверим, существует ли запись today в таблице cot_stats и указана ли в ней текущая дата:
if ($current_today === null || $current_today < $today) {
// Запись в cot_stats не существут или указанная в ней дата меньше текущей
}
Если одно из условий не выполняются, запишем в таблицу cot_stats текущую дату и обнулим для всех страниц счетчики суточных просмотров:
if ($current_today === null || $current_today < $today) {
cot_stat_set('today', $today);
Cot::$db->query("UPDATE $db_pages SET page_today_visits = 0");
}
Теперь определим, просматривает ли страницу администратор и учитываются ли модулем Pages просмотры страниц администратором:
if (!Cot::$usr['isadmin'] || Cot::$cfg['page']['count_admin']) {
// Не админ или просмотры страниц админами не учитываются
}
Если наше условие истинно, определим WHERE-условие для MySQL-запроса к просматриваемой странице:
$where = (!empty($al)) ? "page_alias='" . $al . "'" : 'page_id=' . $id;
… и увеличим значение ее экстраполя page_today_visits на единицу:
Cot::$db->query("UPDATE $db_pages SET page_today_visits = page_today_visits + 1 WHERE $where");
Выводим значения счетчика за день в TPL-шаблоне
Проверим экстраполе на ненулевое значение и выведем его значение, например, в шаблоне страницы с использованием класса Bootstrap:
<!-- IF {PAGE_TODAY_VISITS} -->
<sup class="text-danger">+{PAGE_TODAY_VISITS}</sup>
<!-- ENDIF -->
Если все выполнено правильно, получим следующий вывод:
Для вывода статистики по суточным посещениям в админке используем плагин Pagelist. Вызов функции будет следующим:
{PHP|sedby_pagelist('pagelist.admin.today', 10, 'page_today_visits DESC', 'page_today_visits > 0')}
TPL-шаблон следующего вида:
<!-- BEGIN: MAIN -->
<div class="wrapper">
<div class="table-responsive">
<table class="table table-striped">
<!-- BEGIN: PAGE_ROW -->
<tr>
<td class="w-75">
<a href="{PAGE_ROW_URL}">{PAGE_ROW_TITLE}</a>
</td>
<td class="w-25 text-end text-nowrap">
{PHP.R.icon-eye} {PAGE_ROW_TODAY_VISITS}
</td>
</tr>
<!-- END: PAGE_ROW -->
<!-- BEGIN: NO_ROW -->
<tr>
<td colSpan="2">
<div class="alert alert-danger mb-0 py-2">{PHP.L.nf}</div>
</td>
</tr>
<!-- END: NO_ROW -->
</table>
</div>
</div>
<!-- END: MAIN -->
Заключение
Как и предполагалось, наш код поместился ровно в 10 строк:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=page.first
[END_COT_EXT]
==================== */
defined('COT_CODE') or die('Wrong URL');
$today = cot_date('ymd', Cot::$sys['now']);
$current_today = cot_stat_get('today');
if ($current_today === null || $current_today < $today) {
cot_stat_set('today', $today);
Cot::$db->query("UPDATE $db_pages SET page_today_visits = 0");
}
if (!Cot::$usr['isadmin'] || Cot::$cfg['page']['count_admin']) {
$where = (!empty($al)) ? "page_alias='" . $al . "'" : 'page_id=' . $id;
Cot::$db->query("UPDATE $db_pages SET page_today_visits = page_today_visits + 1 WHERE $where AND page_state = 0");
}
Если у вас есть вопросы или более оптимальный вариант, ждем откликов в комментариях или на форуме.
Happy coding!
В предыдущем посте мы выясняли различия между cookies, local storage и session.
Спасибо, попробую применить в своём проекте! А какие еще ресурсы по Cotonti можно почитать?
Новый комментарий
Ошибка
Выполнено