1С Битрикс · 6 мин чтения

Отзывы на сайте Битрикс: хранение, модерация и вывод

Отзывы на сайте Битрикс напрямую влияют на конверсию карточки товара и на то, как страница попадает в выдачу со звёздами рейтинга под Яндексом и 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 он в товарной разметке не учитывает.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно