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

Пишем счетчик посещений за текущий день

  • 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.


Комментарии:
Аватар
  • 1. Антон
  • 29.12.2025 23:35

Спасибо, попробую применить в своём проекте! А какие еще ресурсы по Cotonti можно почитать?


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

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