Категория:
Опубликовано:

Создаем счетчик просмотров материала

Счетчик просмотров

Конечно же можно просто включить стандартный модуль Statistic и с его помощью считать просмотры.

Но этот модуль крайне не производителен, особо неповоротлив и работает с ошибками.

Наш счетчик будет уметь:

  • Считать просмотры - общее количество
  • Считать просмотры за сегодня
  • Считать просмотры пользователей с определенной ролью
  • Добавлять просмотры только опубликованным материалам
  • Можно будет установить количество просмотров для каждого материала

Все это мы реализуем без владения языками программирования.

Шаг 1. Установка необходимых модулей

Нам понадобится установить следующие модули:

Устанавливаем их в папку sites/default/files, переходим на страницу включения модулей (admin/modules) и включаем следующие:

  • Date
  • Date API
  • Date Views
  • Entity API
  • Rules
  • Rules UI
  • Views Bulk Operations

Запускаем cron, чистим кеш (на всякий случай) и переходим к следующему разделу.

Шаг 2. Настройка материала

Настроим наш материал. Для этого перейдем на страницу управления полями.

Добавляем следующие поля:

Поле "Количество просмотров"

  • Метка - Количество просмотров
  • Машинное имя - counter_total
  • Тип поля - Целое число (Integer)
  • Виджет - Текстовое поле
Counter total

В настройках указываем поле обязательным для заполнения, минимальное значение "0" и значение по умолчанию "0". Скриншот настроек.

Поле "Просмотров сегодня"

  • Метка - Просмотров сегодня
  • Машинное имя - counter_today
  • Тип поля - Целое число (Integer)
  • Виджет - Текстовое поле

Настройки аналогичны прошлому полю.

Поле "Дата последнего просмотра"

  • Метка - Последний просмотр
  • Машинное имя - counter_date
  • Тип поля - Date (Unix timestamp)
  • Виджет - Текстовое поле

В настройках так же выбираем поле обязательным для заполнения. В дополнительных настройках убираем положение меток части даты и устанавливаем значение по умолчанию "Сейчас". Обработка часового пояса ставим "Без обработки часового пояса". Скриншот настроек.

Обратите внимание, если Вы планируете считать статистику нескольких типов материала - нужно добавить эти же поля в каждом из них.

Наш материал готов, перейдем к следующему шагу.

Шаг 3. Создание правила

Добавляем новое правило

Переходим на страницу admin/config/workflow/rules и создаем правило:

Add new rule

Даем нашему правилу название "Счетчик материалов", машинное название "views_counter", триггер (Реакция на событие) "После просмотра материала" и выбираем материал, при просмотре которого должно срабатывать правило.

Save rule

События

Наше правило создано, перейдем к его настройке.

В блоке "События" Events устанавливаются триггеры правила. При создании правила мы установили уже реакцию на прсмотр материала. Если нужно добавить, например, триггер на просмотр материала другого типа - нажимаем кнопку "Добавить событие" и добавляем точно также как при создании правила.

Условия

В блоке "Условия" устанавливается проверка материала на соответствия определенным условиям. Добавим несколько проверок:

Add condition

Проверяем роль пользователя

Первое условие будет проверять роль пользователя, просматривающего материал. Сделаем чтоб счетчик реагировал только на не авторизировавшихся (анонимных) пользователей.

Выбираем условие "Пользователь имеет роль(и)".

Condition 1

На открывшейся странице, в селекторе данных выбираем site:current-user.

Curren user

В следующем блоке выбираем роль пользователя Анонимный пользователь.

Anonim

Сохраняем условие.

Проверяем опубликован ли материал

Добавляем еще одно условие, в котором будем проверять опубликован ли материал:

Published

В селекторе данных выбираем node

Published node

Этих условий нам хватит для выполнения нашего задания. Если Вам нужно делать более детальную проверку - добавляйте свои.

Действия

Название блока "Действия" говорит само за себя. Сюда будем добавлять действия, которые нужно будет производить если вышеуказанные условия будут соблюдены.

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

Добавим новое действие.

Add new action.png

Вычисляем общее количество просмотров

Выбираем из списка "Вычислить значение".

Вычислить значение

В настройках действия, в селекторе Входящее значение 1 выбираем наше поле "node:field-counter-total".

Calculate

Оператор оставляем "+".

Входящее значение 2 указываем "1"

В настройках переменных пишем Метка переменной - "Количество просмотров (+1)" и Имя переменной - "total".

Сохраняем действие. Скриншот настроек.

Вычисляем количество просмотров за сегодня

Добавляем действие "Вычислить значение" еще раз.

Теперь в селекторе выбираем поле просмотров за сегодня "node:field-counter-today".

Calc.png

Настройки как повторяем, кроме настроек переменных. Там пишем Метка переменной - "Просмотров сегодня (+1)" и Имя переменной - "today".

Сохраняем действие. Скриншот настроек.

Устанавливаем вычисленные значения счетчика

Общее количество просмотров

Добавляем действие "Установить значение".

Add value

В селекторе выбираем "node:field-counter-total".

Add total

В блоке Значение переключаемся в режим выбора данных.

Switch to selector

И выбираем нашу переменную "total".

Total counter.png

Сохраняем действие.

Количество просмотров за сегодня

Делаем все тоже что и с прошлым действием, только для поля "Просмотров сегодня" (в селекторе node:field-counter-today).

Ну и в качестве значения добавляем переменную "today".

Значения сохранили. Идем дальше...

Устанавливаем дату последнего просмотра

Добавляем знакомое нам действие Установить значение.

В селекторе выбираем "node:field-counter-date".

Date

Далее, в качестве значения устанавливаем текущую дату ("now").

Now value

Сохраняем действие.

Собственно, наше правило готово (Скриншот того что должно получится). Теперь, когда пользователь будет просматривать ноду - правило будет считать количество просмотров и сохранять их в базу данных.

Идем дальше ))

Шаг 4. Сброс просмотров "за сегодня"

С нашим правилом все будет отлично работать, кроме одного "Но": счетчик просмотров за сегодня будет точно таким же, как и счетчик общих просмотров.

Нам нужно обнулять счетчики просмотров "за сегодня", когда сегодня заканчивается ))

В этом нам снова поможет модуль Rules, теперь уже со связкой с VBO.

Добавляем представление VBO

Перейдем на страницу создания представлений (admin/structure/views/add) и добавим представление со следующими параметрами:

  • Название представления - "Сброс просмотров за сегодня"
  • Машинное имя - "clear_today_counter"
  • Показать - "Содержимое"
  • Тип содержимого - "Статья" (или Ваш собственный тип материала)
  • Сортировку убираем
  • Страницы и блоки нам ни к чему, поэтому их не создаем

Скриншот настройки.

Сохраняем представление и переходим к добавлению полей.

В принципе, поля нас не особо интересуют, потому мы не будем ничего там править, только вот добавим поле VBO:

Добавить поле

Находим поле "Массовые операции: Содержимое" и добавляем его в представление.

Add VBO field

Настройки можно никакие не вносить, просто сохраняем поле.

В блоке "Постраничный навигатор" выбираем в настройках отображения всех элементов.

Settings paginator
View all

Еще стоит удалить фильтр с проверкой публикации материала. Ведь может быть ситуация, когда материал был снят с публикации, и у него был положительный счетчик просмотров за сегодня. И тогда этот материал не будет участвовать в очистке значений счетчика.

Жмем на фильтр "Содержимое: Опубликовано" в блоке Критерии фильтрации, и нажимаем "Удалить".

Теперь добавим пару своих фильтров.

Добавить фильтр

Добавим фильтр по количеству просмотров за сегодня:

Фильтр по просмотрам за сегодня

В настройках фильтра выбираем:

  • Оператор - "Больше, чем"
  • Значение - "0"
Настройка фильтра по просмотрам за сегодня

Сохраняем фильтр и добавляем еще один, по дате последнего просмотра:

Фильтр по дате последнего просмотра

Настройки следующие:

  • Date selection form element - "Текст"
  • Filter granularity - "День"
Настройки фильтра по дате последнего просмотра

Жмем "Применить и продолжить"

  • Оператор - "Меньше либо равно"
  • В селекте выбираем "Enter a relative date"
  • В появившееся поле вводим "yesterday"
Фильтр по дате последнего просмотра

Сохраняем фильтр.

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

Сохраняем представление. Скриншот настроек.

Добавляем компонент обнуляющий счетчик просмотров за сегодня

Перейдем на страницу компонентов (admin/config/workflow/rules/components) и добавим новый компонент:

Добавить компонент правил

В качестве плагина компонента выбираем "Правило".

Component plugin.png

Настройки компонента:

  • Имя - "Обнуление счетчика за сегодня"
  • Машинное имя - "null_today_counter"
  • Переменные (Тип данных) - "Материал"
  • Переменные (Метка) - "Нода"
  • Переменные (Машинное имя) - "node"
  • Переменные (Использование) - "Параметр"

Сохраняем компонент. Скриншот настроек.

На странице компонента добавляем условие "Тип материала".

В настройках условия, в селекторе указываем параметр "node". Тип материала выбираем "Статья" (или же свой, с которым Вы работаете). Скриншот настройки.

Добавляем действие "Установить значение".

В селекторе данных вводим значение "node:field-counter-today".

В качестве устанавливаемого значения пишем "0" и сохраняем действие. Скриншот настройки.

Добавляем правило обрабатывающее список VBO

Переходим на страницу добавления правил (admin/config/workflow/rules) и создаем новое со следующими параметрами:

  • Имя - "Очистка просмотров за сегодня"
  • Машинное имя - "clear_today_views"
  • Реакция на событие - "Выполняются регулярные задачи Cron"
Add rule

Сохраняем правило и добавляем новое действие "Загрузить список ID сущностей из VBO view"

Загрузить список ID сущностей из VBO view

View and display - выбираем наше недавно созданное представление "Сброс просмотров зв сегодня | Master".

Аргументы не задаем.

В настройках переменных пишем:

  • Метка переменной - "Список материалов"
  • Имя переменной - "node_list"

И сохраняем настройки. Скриншот настроек.

Теперь добавляем цикл по извлеченным нодам:

Add loop

В качестве цикла выбираем node-list, и сохраняем настройки.

Добавляем действие в цикл:

Добавить действие в цикл

Действие "Извлечь сущность по ID". В качестве значения выбираем материал.

Блок "Идентификатор" переключаем в режим выбора данных, и в селекторе вводим "list-item".

Сохраняем действие. Скриншот настройки.

Добавляем еще одно действие в цикл. Выбираем созданный нами компонент правил (в конце списка, в блоке "Компоненты") "Обнуление счетчика за сегодня".

В селекторе данных вводим "entity-fetched" и сохраняем действие.

Готово, теперь правило будет обнулять счетчик просмотров "за сегодня", если дата просмотра вчерашняя или еще старше. Скриншот правила.

Главное теперь настроить запуск Cron на сервере, хотя бы раз в сутки.

Если у Вас возникли вопросы, замечания, предложения или просто благодарность - пишите в комментариях.
Делитесь полезными материалами в социальных сетях.

Комментарии

Может ошиблась где-то в пути, выполняла шаг за шагом, но в статьях показывается только поле Последний просмотр
Счетчиков - ни одного ни другого нет. :(

Счетчики нужно выводить на странице управления отображениями (admin/structure/types/manage/[ТИП_МАТЕРИАЛА]/display), для нужного способа вывода. Ну или же во Views, если там нужно вывести, как обычное поле.

Да, конечно они там выведены, но показывается только поле Дата. В журнале ошибок такие ошибки:
0 ms Reacting on event После просмотра материала.
16.163 ms Evaluating conditions of rule Счетчик материалов. [edit]
19.075 ms The condition node_is_published evaluated to TRUE [edit]
19.094 ms AND evaluated to TRUE.

0 ms Rule Счетчик материалов fires.
5.353 ms The variable or parameter input_1 is empty.
6.07 ms Unable to evaluate action data_calc. [edit]
7.6 ms Unable to get variable total, it is not defined.
8.266 ms Unable to evaluate action data_set. [edit]
8.925 ms Evaluating the action data_set. [edit]
10.254 ms Rule Счетчик материалов has fired.

Могу предположить, что у Ваших материалов (которые просматриваются) не установлены значения полей счетчика. Т.е. поля пустые.

Такое может произойти, если добавить функционал подсчета на сайт с уже имеющимися материалами. В этом случае правилу просто не к чему прибавлять значения.

Можно сделать следующее:

  • С помощью VBO назначить всем материалам значение счетчиков "0", по примеру этого поста.
  • Добавить в правило проверку на существование значений, перед выполнением инкрементирования.
  • Вручную, если материалов не много, установить во всех просмотрах "0".

Да, Вы правы. Установила значение для всех статей на 0, и все заработало. Спасибо.

Обнаружилась еще одна проблема. При настройке Компонента - Переменные (Тип данных) - "Материал" у меня не доступен тип данных Материал.
Есть Список и Сущность (в которой можно выбрать Содержимое), но с Содержимое не работает очистка
Что нужно сделать чтобы появился Материал, как у Вас?

Выбирайте из селекта, из группы Сущность (в конце списка) материал, или содержимое, или ноду - зависит от перевода. Остальные настройки как в мануале. Вот так выглядит у меня:
Node.png

Благодарю за фидбек, на похожую ошибку уже были жалобы. Уже провожу меры по их устранению.

Подскажите, а как сделать, чтобы считало статистику только для нод, привязанных к определенному термину таксономии?

Добавить в правило условие "Список содержит пункт" или "Сравнение данных". Там проверять наличие термина.

Вернее, чтоб была статистика для всех терминов таксономии, но по отдельности.

Нужно создать счетчик (поля) и считать в них значения по необходимым условиям.

Спасибо за статью. А как сделать счетчик просмотров для одной недели и одного месяца, обнулять по запуску Cron не получиться, есть еще какие-нибудь способы?

Если Вы не имеете доступ к настройке автоматического запуска Cron - Drupal может его запускать сам. Настроить интервал можно на странице admin/config/system/cron.

Для сброса счетчика за прошлую неделю можно настроить фильтр во Views на отображение результатов со значением более недели (now - 7 day)

Доброго времени суток. Каким образом можно ограничить увеличение счётчика по конкретному материалу от конкретно посетителя (IP)? чтобы допустим один человек не смог накрутить просмотры? Урок отличный, даже нет ничего аналогичного на буржуйских ресурсах (лично мне не попалось, а читаю на них много). Благодарю, за предстоящий ответ заранее.

Не уверен что в правилах можно получить IP текущего пользователя. Такое разве-что программно делать.

Да и IP уже давно не показатель уникальности пользователя. Более правильно сверять по сессии/кукам, чего Rules не позволяет реализовать штатными средствами.

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

ЗЫ - благодарю за положительную оценку, но материал рассчитан больше как показ возможностей Rules'ов, нежели рабочее решение.

Здравствуйте, а как можно обнулять счетчик раз в квартал (now - 3 month)?

Так будут удаляться счетчики дата которых более 30ти дней.

Для очистки раз в 3 мес. нужно с таким интервалом запускать правило очистки, например использовать планировщик правил, или создать еще одно поле "дата последней очистки", и по нему уже фильтровать.