Фильтр цен возвращает неправильные результаты - Цена сохраняется как 0 вместо нуля и устанавливается в специальную цену
У нас проблема с нашим ценовым фильтром. Мы используем magento 2.2.6 и Smile-SA/elasticsuite 2.6.x-dev.
Когда я перехожу в категорию и устанавливаю фильтр ценового диапазона 0-0,99, я получаю результаты с более высокой ценой. URL-адрес выглядит так: /baelle/?цена=0-1
Когда я запрашиваю ElasticSearch вручную для одного из заданных артикулов, цена всегда выглядит следующим образом для всех групп клиентов:
price: [
{
price: "0.0000",
original_price: "79.9500",
is_discount: true,
customer_group_id: "0"
}
],
В бэкэнде продукт настроен с ценой 79,95 и без предварительной цены. В каталоге __товар_индекс_таблица цен хранится следующим образом:
Но когда я устанавливаю special_price в серверной части, цена в ElasticSearch меняется на соответствующую special_price. Подобно записям в catalog_product_index_price, теперь это выглядит так:
Все это происходит как с настраиваемыми, так и с простыми продуктами, и мы понятия не имеем, где и в чем может быть проблема.
Любые идеи почему ценовой фильтр работает не так, как ожидалось?
Обновление
Я выяснил, что у нас есть некоторые продукты, в которых индексатор работает должным образом, но для большинства это не так. \Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::prepareFinalPriceDataForType()
В любом случае, это не называется "быть".
Я выполнил php bin/magento dev:tests:run unit
, чтобы проверить, не провалился ли тест для индексатора, но только один тест провалился, и это не имеет никакого отношения к индексатору.
Я попытался найти шаблон, какие продукты работают должным образом, а какие нет, но мне не повезло с ним.
Обновление 2
Я начал отключать все сторонние модули. После отключения всех, очистки всех кэшей и выполнения bin/magento setup:di:compile
по-прежнему нет никакой разницы.
Обновление 3
Я попытался запустить тесты интеграции dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Price
, чтобы выяснить некоторые дополнительные детали, но тесты сразу провалились со следующей ошибкой:
Ошибка в креплении:"dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php ". Не удалось сохранить товар
Может ли эта ошибка привести к неправильному индексу?
2 answers
Определенно похоже, что индексатор цен работает неправильно. Я проверил это на Magento 2.2.6 vanilla и final_price, min_price и max_price имеют то же значение, что и столбец цены.
В тот момент, когда я изменяю цену в admin, все значения изменяются (индексатор установлен в значение при сохранении). Может быть, какое-то расширение портит индексатор?
Без доступа к коду трудно сказать, но я бы предложил начать отладку с
\Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::prepareFinalPriceDataForType()
Функция - это функция, которая подготавливает окончательные данные о ценах для определенного типа продукта. В этой функции вы можете найти вызов getSelect(), который генерирует sql-запрос для получения данных. Проверьте, вызывается ли эта функция, возможно, какое-то расширение переопределяет ее. Если это называется, проверьте данные, которые получает запрос. Удачи!
Проблема здесь заключалась в том, что индекс catalog_product_price
был построен неправильно. Если у продукта есть набор special_from_date
, но нет набора special_price
, индексатор установит final_price
, min_price
и max_price
к 0.0000
.
Такое поведение одинаково влияет на цены на настраиваемые продукты и индекс эластичного поиска.
Чтобы исправить это, убедитесь, что если не задано special_price
, то также не задано special_from_date
.
Или примените этот коммит в качестве исправления. Или обновите Magento до версии 2.2.8 или 3.0.