Перейти к содержимому

Подборки товаров - новинки, хиты и акции на витрине

Собираем на витрине блоки новинок, хитов и акций и следим, чтобы главная от них не замедлилась.

Решение

Заводим свойства-метки для подборок:

$prop = new CIBlockProperty();
$prop->Add([
'IBLOCK_ID' => 5, // инфоблок каталога товаров
'NAME' => 'Хит продаж', // подпись видна редактору в карточке
'CODE' => 'HIT',
'PROPERTY_TYPE' => 'L', // список с единственным значением «да»
'MULTIPLE' => 'N',
]);

Свойство-метка удобнее отдельного раздела: товар остаётся в своей ветке каталога и не двоится. Раздел «новинки» рядом с обычными разделами ломает и адреса, и хлебные крошки, и умный фильтр.

Собираем подборку выборкой:

$res = CIBlockElement::GetList(['SORT' => 'ASC'], [
'IBLOCK_ID' => 5,
'ACTIVE' => 'Y',
'PROPERTY_HIT_VALUE' => 'да',
], false, ['nTopCount' => 8], ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE']);

Ограничение количества здесь обязательно: без него выборка тянет всю подборку целиком, даже если на главной в итоге покажутся восемь позиций. На каталоге в десятки тысяч товаров разница видна сразу.

Выводим блок готовым компонентом:

$GLOBALS['hitFilter'] = ['PROPERTY_HIT_VALUE' => 'да'];
$APPLICATION->IncludeComponent('bitrix:catalog.section', 'main_block', [
'IBLOCK_ID' => 5,
'FILTER_NAME' => 'hitFilter',
'PAGE_ELEMENT_COUNT' => 8,
'CACHE_TIME' => 36000,
]);

Компонент списка умеет всё, что нужно подборке: фильтр, количество, кэш и разметку. Свой код здесь оправдан только там, где подборка собирается по данным, которых у компонента нет.

Собираем подборку по данным заказов:

use Bitrix\Sale\Internals\BasketTable;
$rows = BasketTable::getList([
'select' => ['PRODUCT_ID', new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)')],
'filter' => ['!=ORDER_ID' => null],
'group' => ['PRODUCT_ID'],
'order' => ['CNT' => 'DESC'],
'limit' => 8,
])->fetchAll();

Настоящие хиты продаж считаются по заказам, а не проставляются руками в карточке. Такой запрос заметно тяжелее обычной выборки, и его результат кэшируют на часы или складывают в свойство агентом, а не пересчитывают на каждой странице.

Каждый блок на главной странице - это отдельная выборка из каталога. Четыре подборки означают четыре запроса плюс дочитывание свойств, поэтому кэш компонента на главной включают всегда, а его время жизни считают часами, а не минутами.

Подборка на главной странице живёт заметно дольше, чем кажется её автору. Метки, проставленные при запуске сайта, остаются на товарах годами, и через год в новинках висит прошлогодняя коллекция. Поэтому подборки либо считают автоматически, либо заводят им срок жизни и напоминание пересобрать.

Акции удобнее показывать не меткой товара, а его специальной ценой. Товар со скидкой определяется правилом корзины или вторым типом цены, и отдельное свойство «акция» с ними рассинхронизируется через неделю.

Типичные проблемы

Главная стала открываться медленно.

Несколько подборок на странице собираются вообще без кэша. Каждый блок - отдельная выборка со своими дочитываниями.

В подборке пусто.

Свойство не заполнено ни у одного товара либо в фильтре указано не то значение. У свойств-списков сравнивается значение из справочника вариантов.

Подборка показывает снятые с продажи позиции.

В фильтре выборки нет проверки активности самого товара. Метка остаётся у товара после снятия с публикации.

Раздел «новинки» сломал адреса товаров.

Товар лежит в двух разделах, и адрес собирается по первому. Подборки помечают свойством самого товара, а не отдельным разделом каталога.

Хиты не совпадают с реальными продажами.

Метки подборок проставлены руками ещё год назад. Настоящие хиты продаж считаются по заказам и обновляются автоматически.

Частые вопросы

Сколько подборок держать на главной?

Две-три: новинки, хиты и акция. Каждая следующая добавляет запросы и удлиняет страницу, а внимание посетителя не резиновое.

Как обновлять хиты автоматически?

Агентом, который раз в сутки считает продажи и проставляет метки. Считать их на каждой странице слишком дорого.

Можно ли вывести случайные товары?

Да, сортировкой по случайному порядку, но такая выборка не кэшируется осмысленно. На нагруженной главной от неё отказываются.

Чем плох раздел вместо свойства?

Товар попадает в две ветки каталога: путаются адреса, крошки и фильтр. Свойство оставляет товар на месте и решает ту же задачу.

Смежное

Первоисточник