Налаштування відображення кількості переглядів товару 1С-Бітрікс
Лічильник переглядів на картці товару створює ефект популярності. На відміну від покупок, перегляди накопичуються швидше — навіть у нового товару за кілька днів з'являються реальні цифри. Бітрікс не веде лічильник переглядів за товарами за замовчуванням, але надає інструменти для його реалізації.
Вбудований модуль статистики
Модуль statistic веде таблицю b_stat_page_hit — кожне звернення до сторінки пишеться туди з полем PATH (URI сторінки). З цієї таблиці можна отримати кількість переглядів детальної сторінки товару за її URL. Але це важкий спосіб: таблиця зростає швидко, запити до неї повільні, і модуль статистики часто відключений на навантажених сайтах.
Власний лічильник переглядів
Правильний підхід — зберігати лічильник прямо у властивості інфоблока. Створюється числова властивість VIEW_COUNT у b_iblock_property. При кожному відкритті детальної сторінки товару обробник події інкрементує значення.
Подія спрацьовує в компоненті bitrix:catalog.element, у component_epilog.php:
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
$elementId = $arResult["ID"];
$iblockId = $arResult["IBLOCK_ID"];
$currentCount = (int)$arResult["PROPERTIES"]["VIEW_COUNT"]["VALUE"];
CIBlockElement::SetPropertyValuesEx(
$elementId,
$iblockId,
["VIEW_COUNT" => $currentCount + 1]
);
Запис у component_epilog.php не блокує відрисовку сторінки — виконується після відправки відповіді клієнту (при використанні ob_flush/flush або вбудованих механізмів Бітрікс).
Проблема ботів і повторних переглядів
Без фільтрації лічильник накрутять пошукові роботи. Мінімальний захист — не рахувати перегляди, якщо:
- У
$_SERVER['HTTP_USER_AGENT']є ознаки бота (Googlebot, YandexBot, Bingbot) - IP-адреса відвідувача вже дивилася цей товар за останні N хвилин
Для фільтрації повторів використовується сесія: $_SESSION['viewed_products'][$elementId] = time(). Якщо запис є і минуло менше 30 хвилин — лічильник не інкрементується.
Кешування та продуктивність
Якщо детальна сторінка кешується (а вона повинна кешуватися), component_epilog.php викликається при кожному перегляді, навіть якщо основний контент взятий із кешу. Це саме та поведінка, яка потрібна — лічильник працює незалежно від кешу сторінки.
При високому навантаженні (>100 переглядів на хвилину на один товар) прямий запис у b_iblock_element_prop створює конкурентні оновлення одного рядка. Рішення: інкремент через атомарний UPDATE:
$DB->Query("UPDATE b_iblock_element_prop_s{$iblockId}
SET PROPERTY_VIEW_COUNT = COALESCE(PROPERTY_VIEW_COUNT, 0) + 1
WHERE IBLOCK_ELEMENT_ID = " . intval($elementId));
Назва колонки залежить від ID властивості — генерується Бітрікс автоматично при створенні властивості.
Вивід лічильника
У шаблоні bitrix:catalog.element додається вивід значення властивості:
$viewCount = (int)$arResult["PROPERTIES"]["VIEW_COUNT"]["VALUE"];
echo '<span>' . $viewCount . ' переглядів</span>';
Значення виводиться з правильним відмінюванням: «перегляд», «перегляди», «переглядів» залежно від числа.
Що входить у налаштування
- Створення властивості
VIEW_COUNTв інфоблоці каталогу - Додавання обробника в
component_epilog.phpз фільтрацією ботів - Реалізація захисту від повторного підрахунку через сесію
- Атомарний INCREMENT для навантажених магазинів
- Вивід лічильника з правильними закінченнями в шаблоні картки







