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

Сортировка товаров в разделе - поле сортировки, наличие, цена

Разбираемся, чем задаётся порядок товаров в разделе и как получить наличие сверху, цену по возрастанию и стабильную постраничную навигацию.

Решение

Смотрим, чем сортирует компонент сейчас:

$APPLICATION->IncludeComponent('bitrix:catalog.section', '', [
'ELEMENT_SORT_FIELD' => 'sort', // первое поле сортировки
'ELEMENT_SORT_ORDER' => 'asc',
'ELEMENT_SORT_FIELD2' => 'id', // второе поле разводит равные значения
'ELEMENT_SORT_ORDER2' => 'desc',
]);

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

Задаём свой порядок числовым полем:

$el = new CIBlockElement();
$el->Update($elementId, ['SORT' => 100]); // меньше значение - выше в списке
// шаг в сто оставляет место для вставки между позициями

Ручной порядок хранится обычным полем элемента. Одинаковое значение у всех товаров означает отсутствие порядка вовсе, и тогда список выстраивается по второму полю сортировки.

Поднимаем товары в наличии наверх:

$APPLICATION->IncludeComponent('bitrix:catalog.section', '', [
'ELEMENT_SORT_FIELD' => 'catalog_AVAILABLE', // доступность к покупке
'ELEMENT_SORT_ORDER' => 'desc',
'ELEMENT_SORT_FIELD2' => 'sort',
]);

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

Сортируем по цене и даём выбор покупателю:

'ELEMENT_SORT_FIELD' => 'catalog_PRICE_1', // номер типа цены, а не его код
'PRICE_CODE' => ['BASE'], // без этого параметра цены не выбираются
// варианты для покупателя - пары поля и направления, а не готовые строки

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

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

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

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

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

На второй странице повторяются товары с первой.

В параметрах компонента не задано второе поле сортировки. Равные значения первого поля выстраиваются в произвольном порядке при каждом новом запросе к базе.

Сортировка по цене ничего не меняет.

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

Ручной порядок не работает.

У всех товаров раздела одинаковое значение поля сортировки. Порядок в этом случае определяется вторым полем сортировки.

Выбор сортировки не влияет на список.

Выбранное значение не попадает в ключ кэша компонента. Страница отдаётся из кэша, который собран с прежним порядком товаров раздела.

Товары дублируются в списке.

Сортировка идёт по свойству с несколькими значениями. Каждое значение такого свойства даёт товару отдельную строку в общей выборке раздела.

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

Как поднять несколько товаров на первое место?

Меньшим значением поля сортировки у этих товаров. Шаг в сотню между значениями оставляет место для будущих вставок.

Можно ли сортировать по свойству?

Да, полем с именем свойства в параметрах компонента. Для множественных свойств это даёт повторы строк.

Почему после обмена порядок сбился?

Учётная система выгружает своё значение сортировки поверх ручного. Ручной порядок держат свойством, которое обмен не трогает.

Как сортировать по популярности?

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

Смежное

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