Цена не меняется при выборе варианта - разбор причин
Покупатель переключает размер или цвет, а число в блоке цены остаётся прежним либо становится пустым. Разбираем причины по убыванию частоты, начиная с самих цен вариантов.
С чего начать
Смотрим цены всех вариантов товара:
\Bitrix\Main\Loader::includeModule('catalog');$offers = \CCatalogSKU::getOffersList($productId, 0, ['ACTIVE' => 'Y'], ['ID', 'NAME']);$rows = \Bitrix\Catalog\PriceTable::getList(['filter' => ['@PRODUCT_ID' => array_keys($offers[$productId] ?? [])], 'select' => ['PRODUCT_ID', 'CATALOG_GROUP_ID', 'PRICE']])->fetchAll();print_r($rows);// вариант без строки в этом списке цены не имеет вовсе, и карточке нечего показывать// CATALOG_GROUP_ID показывает тип цены: у части вариантов он может отличатьсяЧисло строк сравнивают с числом вариантов сразу. Разница между ними означает, что часть размеров приехала без цены, и дальше разбирают именно обмен, а не шаблон карточки.
Считаем цену варианта так, как её видит покупатель:
$optimal = \CCatalogProduct::GetOptimalPrice($offerId, 1, $USER->GetUserGroupArray(), 'N', [], SITE_ID, []);printf("итог: %s, тип цены: %s\n", $optimal['DISCOUNT_PRICE'] ?? 'нет', $optimal['PRICE']['CATALOG_GROUP_NAME'] ?? 'недоступен');// под администратором результат будет другим: группы пользователя влияют на расчётРасчёт под гостем и под своей учётной записью различают всегда. Цена, которая считается у администратора и пропадает у покупателя, указывает на права группы, а не на данные каталога.
Смотрим, что компонент отдал шаблону карточки:
// result_modifier.php шаблона карточки товараforeach ($arResult['JS_OFFERS'] as $offer) { printf("%d: %s\n", $offer['ID'], $offer['PRICE']['PRINT_RATIO_PRICE'] ?? 'пусто');}// скрипт карточки берёт цены отсюда: пустые значения здесь означают проблему до шаблона// заполненные цены здесь переводят разбор к разметке блока цены в шаблонеПричины
-
Свой шаблон выводит цену товара, а не выбранного варианта примерно 30% случаев
ПризнакЦена меняется только после перезагрузки страницы с адресом конкретного варианта.
ПроверкаСмотрим, есть ли в шаблоне блок цены с идентификатором, который обновляет скрипт карточки.
Что делатьВозвращаем разметку блока цены из типового шаблона либо перерисовываем её своим обработчиком выбора.
-
Цены заведены не всем вариантам примерно 25% случаев
ПризнакУ части размеров цена пустая, а у остальных показывается корректно.
ПроверкаСравниваем число строк цен с числом активных предложений товара в каталоге.
Что делатьДогружаем цены обменом или заводим их вручную: вариант без цены купить нельзя.
-
Тип цены недоступен группе покупателя примерно 20% случаев
ПризнакПод администратором цены видны, под гостем блок цены пуст у всех вариантов.
ПроверкаПроверяем права группы на нужный тип цены и список типов в параметрах компонента.
Что делатьВыдаём группе право видеть тип цены и перечисляем этот тип в вызове каталога.
-
Карточка отдаёт старую копию из кэша примерно 15% случаев
ПризнакВ базе новая цена варианта, а витрина показывает прежнее число всем посетителям.
ПроверкаСбрасываем кэш компонента карточки и повторяем проверку на той же странице.
Что делатьВключаем тегированный кэш каталога, чтобы обмен сбрасывал карточки изменённых товаров.
-
Скидка посчитана для одного варианта примерно 10% случаев
ПризнакПеречёркнутая цена и процент скидки одинаковы у всех размеров подряд.
ПроверкаСмотрим список применённых скидок в расчёте оптимальной цены каждого варианта.
Что делатьПравим условия скидки и берём в шаблоне значения выбранного варианта, а не первого.
Частые вопросы
Почему цена пропадает только у гостя?
Группе гостей не выдано право видеть нужный тип цены, а администратор видит все типы. Права на тип цены проверяют отдельно от наличия самой цены.
Как проверить цену конкретного варианта?
Штатным расчётом оптимальной цены по идентификатору предложения с группами покупателя. Вызов повторяет логику витрины и возвращает список применённых скидок.
Почему после обмена цены старые?
Карточка отдаётся из кэша компонента, который обмен сам по себе не сбрасывает. Помогает тегированный кэш каталога либо сброс кэша по событию обмена.
Цена в карточке есть, а в корзине другая. Почему?
В корзину попал другой вариант либо к позиции применилось правило корзины. Сравнивают идентификатор предложения в корзине с выбранным в карточке.
Можно ли показывать цену родителя?
Родитель своей цены обычно не имеет, а карточка показывает минимальную цену среди вариантов. Отдельную цену родителю заводят только для витрины и поддерживают вручную.
Смежное
- Торговые предложения - оглавление подтемы
- Торговые предложения изнутри: хранение, типы, выборка, корзина - почему цена принадлежит варианту
- Торговые предложения не выводятся: разбор причин - когда выбора вариантов нет вовсе
- Цена на витрине не та: разбор причин - когда цена показана, но неверная
- Путь цены: от типа цены до суммы в корзине - весь расчёт цены целиком
- Типы цен: розница и опт, права групп, цена по количеству - права группы на тип цены
- Тегированный кэш: сброс по изменению данных, а не по расписанию - сброс карточек после обмена
- Каталог и продажи - устройство продаж целиком