Отзывы на сайте Битрикс напрямую влияют на конверсию карточки товара и на то, как страница попадает в выдачу со звёздами рейтинга под Яндексом и Google. Я подключал модуль отзывов к интернет-магазинам на 1С-Битрикс десятки раз: где-то расширял типовой каталог, где-то строил отдельное хранилище на highload-блоках с собственной админкой и премодерацией через бизнес-процессы. Собрал рабочую схему: где хранить отзывы, как отсеивать спам до попадания на витрину и как вывести рейтинг с микроразметкой, чтобы он подсвечивался в поиске.
Где хранить отзывы: инфоблок или highload-блок
Отзывы к товару храню отдельно от каталога: либо в инфоблоке, привязанном к товару через свойство с привязкой к элементам, либо в highload-блоке с собственной таблицей в базе. Выбор зависит от объёма данных и от того, нужна ли отзывам своя админка с фильтрами и групповыми действиями без доработок.
| Критерий | Инфоблок | Highload-блок |
|---|---|---|
| Админка из коробки | Полноценный список, фильтры и групповые действия без доработок | Базовая таблица, интерфейс администратора обычно приходится дорабатывать |
| Кэш и версии элементов | Поддерживает историю версий элемента и стандартный компонентный кэш | Кэшируется вручную, версии записей не ведутся |
| Скорость при большом объёме | При 50-100 тысячах отзывов выборки без индексов заметно замедляются | Работает как обычная таблица MySQL, индексы настраиваю сам, держит нагрузку увереннее |
| Когда выбираю | Каталог до нескольких тысяч товаров, отзывов не больше нескольких десятков тысяч | Крупный каталог, десятки тысяч отзывов, нужна выборка сразу по нескольким полям |
Для небольшого магазина почти всегда беру инфоблок: админка уже готова, товаровед сам видит очередь на модерацию без моего участия. Highload-блок ставлю там, где отзывов реально много и важна скорость выборки под фильтрами «по рейтингу», «с фото», «с ответом продавца».
Какие поля нужны для карточки отзыва
Помимо текста и оценки, в структуре отзыва обычно заводится набор полей, без которых модерация и вывод превращаются в ручную возню:
- Имя автора и email - email на фронте не показываю, использую для ответа и для антиспам-проверки повторных отправок
- Оценка от 1 до 5 - числовое свойство, из него же считаю агрегированный рейтинг товара
- Текст отзыва, при необходимости отдельно поля «Достоинства» и «Недостатки»
- Фото - свойство типа «Файл», множественное значение
- Статус модерации - поле ACTIVE элемента инфоблока, вручную его не трогаю, меняется через бизнес-процесс
- IP и User-Agent отправителя - для антиспам-фильтра и на случай спорных ситуаций с покупателем
- Дата публикации отдельно от даты создания, чтобы одобренный с задержкой отзыв не проваливался в конец ленты
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Модерация отзывов: премодерация, бизнес-процессы и антиспам
Каждый новый отзыв попадает в базу со статусом ACTIVE = N, то есть на витрине его не видно, пока модератор не одобрит. Чтобы менеджер не проверял форму вручную каждый день, вешаю на добавление элемента бизнес-процесс: он смотрит на длину текста, наличие ссылок и повторяемость email за последние сутки, и либо публикует отзыв автоматически при высокой оценке и чистом тексте, либо откладывает его в очередь на ручную проверку.
Очередь на модерацию в админке обычно строю поверх простой выборки:
$res = \CIBlockElement::GetList(
array("SORT" => "DESC"),
array("IBLOCK_ID" => REVIEWS_IBLOCK_ID, "ACTIVE" => "N"),
false,
false,
array("ID", "NAME", "PROPERTY_RATING", "PROPERTY_TEXT", "DATE_CREATE")
);
while ($review = $res->GetNext()) {
// очередь на ручную модерацию
}
От спама помогает связка из нескольких простых приёмов: скрытое honeypot-поле в форме, ограничение на количество отправок с одного IP в час, запрет второго отзыва с того же email на тот же товар и капча только для гостей без регистрации на сайте. Отдельно ставлю чекбокс согласия на обработку персональных данных в форме отзыва и храню имена и email в базе на своём сервере в РФ, не выгружая их во внешние таблицы вроде Google Таблиц - это прямое требование 152-ФЗ о локализации персональных данных.
Вывод отзывов на карточке товара
Карточку товара кэширую отдельно от блока отзывов: сам товар меняется редко, а отзывы добавляются часто, и без разделения на два блока кэш всей карточки пришлось бы сбрасывать при каждом новом отзыве. Компонентный кэш на блок отзывов ставлю с большим временем жизни, а сбрасываю его тегированным кэшем в момент публикации нового отзыва, а не по таймауту.
Форму добавления отзыва обычно веду через AJAX-экшены компонентов D7 (BX.ajax.runAction), чтобы страница не перезагружалась и кэш карточки товара не сбрасывался целиком, обновляется только сам блок с отзывами и счётчик рейтинга. По умолчанию сортирую ленту по дате, но добавляю переключатель «сначала полезные» на основе счётчика голосов «полезно / не полезно» - его храню тем же способом, отдельным числовым свойством у элемента.
Рейтинг и микроразметка для сниппетов в поиске
Средний рейтинг товара не пересчитываю при каждом открытии страницы - он считается и сохраняется в свойство товара в момент публикации нового отзыва, иначе на карточке с сотней отзывов агрегация ощутимо нагружает базу при каждом визите. Для сниппета в Google рейтинг оборачиваю в микроразметку schema.org: у Google под отзывы есть отдельный тип расширенных результатов, где оценка берётся из Review и aggregateRating. С Яндексом так не выйдет: в товарной разметке он учитывает закрытый список свойств, у Product это name, description, brand и image, у Offer или AggregateOffer - availability, price или lowPrice и priceCurrency, а aggregateRating в этот список не входит.
<div itemscope itemtype="https://schema.org/Product">
<span itemprop="name">Название товара</span>
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<span itemprop="ratingValue">4.7</span>
<span itemprop="reviewCount">128</span>
</div>
</div>
После разметки звёзды в выдаче появляются не сразу - поисковику нужно переобойти страницу и убедиться, что данные не накручены, это может занять от нескольких дней до нескольких недель.
Сколько стоит внедрение и когда делать самому
Простой блок «оценка плюс текст» на существующем каталоге - разовая доработка, объём которой удобно оценить заранее. Если магазин ещё не запущен, модуль отзывов закладываю в проект с самого начала - это часть моей услуги разработка интернет-магазина под ключ, стоимость которой начинается от 80 000 ₽. Для готового сайта на Битрикс, где нужно добавить премодерацию, антиспам-правила и микроразметку, дальнейшее сопровождение и подкрутку фильтров обычно веду по подписке на техподдержку от 15 000 ₽ в месяц. Оценить конкретную задачу и подобрать между инфоблоком и highload-блоком можно на консультации.
1С-Битрикс регулярно обновляется, поэтому перед внедрением я сверяюсь с актуальной документацией.
Частые вопросы
Можно ли добавить отзывы в Битрикс без программиста?
Простой блок «оценка плюс текст» на базе штатного модуля голосований и рейтингов иногда получается подключить силами администратора сайта, если шаблон каталога уже поддерживает вывод такого компонента. А премодерация через бизнес-процессы, антиспам-фильтры и микроразметка schema.org - это уже задача для разработчика, потому что требует доработки типового шаблона и логики на стороне сервера.
Как защитить отзывы от спама и накрутки рейтинга?
Работает связка из нескольких приёмов сразу: скрытое honeypot-поле, лимит отправок с одного IP в час, запрет повторного отзыва с того же email на тот же товар, отложенная премодерация для анонимных отправок и капча только там, где пользователь не авторизован на сайте.
Нужно ли согласие на обработку персональных данных в форме отзыва?
Да, если форма собирает имя и email - ставлю чекбокс с ссылкой на политику обработки персональных данных, не показываю email в открытом виде на фронте и храню данные в базе на сервере в РФ, а не в сторонних сервисах.
Почему рейтинг из отзывов не сразу появляется в поиске?
Звёзды в сниппете Google зависят не только от микроразметки на странице, но и от того, когда поисковик переобойдёт страницу и сколько отзывов накопилось у товара - это может занять от нескольких дней до нескольких недель после публикации разметки. В Яндексе ждать звёзд от такой разметки не стоит: aggregateRating он в товарной разметке не учитывает.