Налаштування персоналізації контенту за поведінкою користувача в 1С-Bitrix
Персоналізація в Bitrix часто розуміється як «показати банер користувачам з Москви». Це геотаргетинг, а не персоналізація. Поведінкова персоналізація — це коли користувач, який три рази переглядав ноутбуки, бачить на головній сторінці блок з ноутбуками, а не випадковий акційний банер. Реалізувати це в Bitrix без зовнішніх платформ — завдання розв'язне, але потребує розуміння, де зберігати поведінковий профіль.
Збереження поведінкового профілю користувача
Для авторизованих користувачів дані зберігаються в b_user_field (UF-поля користувача) або в окремій таблиці. UF-поля зручні, але обмежені — вони не розраховані на JSON-блоби з історією переглядів. Найкраще рішення — користувацька таблиця, наприклад b_user_behavior:
CREATE TABLE b_user_behavior (
ID SERIAL PRIMARY KEY,
USER_ID INT NOT NULL,
SESSION_ID VARCHAR(64),
EVENT_TYPE VARCHAR(32) NOT NULL, -- 'view', 'cart', 'search'
ENTITY_TYPE VARCHAR(32), -- 'catalog_element', 'section'
ENTITY_ID INT,
VALUE TEXT,
DATE_CREATE TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_ubehav_user ON b_user_behavior(USER_ID, EVENT_TYPE, DATE_CREATE DESC);
Для анонімних користувачів — прив'язка до SESSION_ID. При авторизації сеансовий профіль об'єднується з користувацьким через обробник події OnAfterUserAuthorize.
Запис подій через AJAX
Кожна значима дія (перегляд карточки товару, додавання в корзину, пошуковий запит) записується асинхронно. В шаблоні catalog.element в кінці сторінки:
fetch('/local/ajax/behavior.php', {
method: 'POST',
headers: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'},
body: JSON.stringify({
event: 'view',
entity_type: 'catalog_element',
entity_id: <?= (int)$arResult['ID'] ?>,
session_id: '<?= session_id() ?>'
})
});
Файл behavior.php — контролер на D7 (Bitrix\Main\Engine\Controller), який валідує вхідні дані та пише в b_user_behavior. Важливо: запис повинен бути неблокуючим — жодних синхронних операцій з БД в основному потоці.
Використання профілю для відображення контенту
Компонент головної сторінки читає профіль поточного користувача та підбирає контент. Логіка пріоритетів:
- Категорії з найбільшою кількістю переглядів за останні 30 днів
- Товари, які додавалися в корзину, але не були придбані
- Пошукові запити без результату покупки
$userId = $GLOBALS['USER']->GetID();
$topCategories = [];
if ($userId) {
$res = $DB->Query("
SELECT ENTITY_ID, COUNT(*) as cnt
FROM b_user_behavior
WHERE USER_ID = {$userId}
AND EVENT_TYPE = 'view'
AND ENTITY_TYPE = 'section'
AND DATE_CREATE > NOW() - INTERVAL 30 DAY
GROUP BY ENTITY_ID
ORDER BY cnt DESC
LIMIT 3
");
while ($row = $res->Fetch()) {
$topCategories[] = (int)$row['ENTITY_ID'];
}
}
Потім компонент bitrix:catalog.section або bitrix:catalog викликається з фільтром за цими розділами.
Кеширування персоналізованого контенту
Персоналізований контент не можна кешувати стандартним кешем Bitrix — блок унікальний для кожного користувача. Вихід: компонент з CACHE_TYPE = 'N' тільки для персоналізованого блока, решта сторінки кешується звичайно. Або використовувати bitrix:main.include з AJAX-завантаженням персонального блока вже після завантаження сторінки.
Другий варіант краще для продуктивності: сторінка завантажується з кешу миттєво, персональний блок витягується окремим запитом після рендерингу.







