ms3RecentlyViewed - Недавно просмотренные товары для MiniShop3

Компонент для MiniShop3: вывод блока «Недавно просмотренные товары». Список хранится в браузере (localStorage или cookie) или в БД для авторизованных, заполняется автоматически при посещении страниц товаров.
Возможности
- Блок «Недавно просмотренные» — вывод по списку ID (AJAX через коннектор или серверный вызов сниппета)
- Хранение в браузере — localStorage (по умолчанию) или cookie, без регистрации
- Синхронизация в БД — для авторизованных: при входе данные из localStorage переносятся в БД
- Автосинхронизация при входе — анонимные просмотры из localStorage автоматически переносятся в БД при первом заходе после авторизации
- Месячное архивирование — настройка ms3recentlyviewed.archive_enabled (по умолчанию включено): агрегация в сводную таблицу, уменьшение размера основной таблицы
- Исключение ботов — настройка ms3recentlyviewed.block_bots: просмотры от краулеров (Googlebot, Yandex и др.) не сохраняются в БД
- Сниппет «Похожие на просмотренные» — товары из тех же категорий (ms3recentlyviewedSimilar)
- Админка — дашборд (KPI, топ товаров), история просмотров с фильтрами, экспорт CSV
- Локализация — MODX Lexicon (ru, en), на фронте — сниппет ms3rvLexiconScript
- Кастомизация — Fenom-чанки, BEM-классы (префикс ms3rv), CSS-переменные



Системные требования
MODX 3.0+, MiniShop3, PHP 8.1+, Fenom (pdoTools) 3.x, VueTools (для админки)
После установки
Подключите лексикон, CSS и JS на сайте, передайте ID товара на странице товара и выведите блок «Недавно просмотренные».
Подробнее: Быстрый старт и Подключение на сайте.
В админке: Extras → ms3RecentlyViewed — дашборд и история просмотров.
Компонент на модерации в modstore.pro. Буду рад обратной связи и постараюсь оперативно реагировать на баги и предложения.
Поблагодарить автора
Отправить деньги
Комментарии: 2
Привет! Дай распрошу)
как ботов отслеживаешь? Пару раз сталкивался, интересны подходы.
И вот что думаешь, большой каталог + большое кол-во пользователей не убьет таблицу просмотров в БД? Как ни крути именно просмотров может быть ну очень много, особенно если не всех ботов получится отсечь.
как ботов отслеживаешь? Пару раз сталкивался, интересны подходы.
И вот что думаешь, большой каталог + большое кол-во пользователей не убьет таблицу просмотров в БД? Как ни крути именно просмотров может быть ну очень много, особенно если не всех ботов получится отсечь.
Привет, Алексей.
1. Как определяем ботов
Проверка идёт по User-Agent в ms3rv_is_bot() (helpers.php). Используется regex по типичным маркерам краулеров:
2. Большой каталог и много пользователей
Есть несколько механизмов, чтобы таблица не росла бесконечно:
Ограничение дублей. UNIQUE по (user_id, session_id, product_id) — для каждой пары «пользователь + товар» хранится одна строка. Повторный просмотр того же товара только обновляет viewed_at, новых строк не добавляется.
TTL и автоочистка. По умолчанию ttl_days=90 и auto_cleanup_enabled=true. Плагин на OnWebPageInit раз в день удаляет записи старше 90 дней.
Месячное архивирование. При archive_enabled=true (по умолчанию) данные за прошедший месяц агрегируются в ms3recentlyviewed_monthly (product_id, view_count, unique_users), а детальные строки из основной таблицы удаляются. Объём основной таблицы остаётся ограниченным.
Итог: Рост таблицы ограничен числом уникальных пар «пользователь × товар» за последние 90 дней, а не количеством просмотров. Архив уменьшает объём основной таблицы, сохраняя агрегаты для аналитики.
1. Как определяем ботов
Проверка идёт по User-Agent в ms3rv_is_bot() (helpers.php). Используется regex по типичным маркерам краулеров:
bot|crawl|slurp|spider|mediapartners|googlebot|bingbot|yandex|baiduspider|duckduckbot|teoma|ahrefs|semrush|mj12bot|dotbot|rogerbot|screaming|petalbot|bytespiderПроверка выполняется до сохранения в БД — при block_bots=true (по умолчанию) запросы от таких User-Agent не пишутся. Это не идеально (подделка UA, новые боты), но отсекает большую часть краулеров.2. Большой каталог и много пользователей
Есть несколько механизмов, чтобы таблица не росла бесконечно:
Ограничение дублей. UNIQUE по (user_id, session_id, product_id) — для каждой пары «пользователь + товар» хранится одна строка. Повторный просмотр того же товара только обновляет viewed_at, новых строк не добавляется.
TTL и автоочистка. По умолчанию ttl_days=90 и auto_cleanup_enabled=true. Плагин на OnWebPageInit раз в день удаляет записи старше 90 дней.
Месячное архивирование. При archive_enabled=true (по умолчанию) данные за прошедший месяц агрегируются в ms3recentlyviewed_monthly (product_id, view_count, unique_users), а детальные строки из основной таблицы удаляются. Объём основной таблицы остаётся ограниченным.
Итог: Рост таблицы ограничен числом уникальных пар «пользователь × товар» за последние 90 дней, а не количеством просмотров. Архив уменьшает объём основной таблицы, сохраняя агрегаты для аналитики.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.