Фильтр цен возвращает неправильные результаты - Цена сохраняется как 0 вместо нуля и устанавливается в специальную цену


У нас проблема с нашим ценовым фильтром. Мы используем magento 2.2.6 и Smile-SA/elasticsuite 2.6.x-dev.

Когда я перехожу в категорию и устанавливаю фильтр ценового диапазона 0-0,99, я получаю результаты с более высокой ценой. URL-адрес выглядит так: /baelle/?цена=0-1 Categories with filter example Когда я запрашиваю ElasticSearch вручную для одного из заданных артикулов, цена всегда выглядит следующим образом для всех групп клиентов:

price: [
    {
        price: "0.0000",
        original_price: "79.9500",
        is_discount: true,
        customer_group_id: "0"
    }
],

В бэкэнде продукт настроен с ценой 79,95 и без предварительной цены. В каталоге __товар_индекс_таблица цен хранится следующим образом:catalog_products_index_price

Но когда я устанавливаю special_price в серверной части, цена в ElasticSearch меняется на соответствующую special_price. Подобно записям в catalog_product_index_price, теперь это выглядит так:catalog_product_index_price with special 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 ". Не удалось сохранить товар

Может ли эта ошибка привести к неправильному индексу?

Author: Daniel, 2018-10-19

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-запрос для получения данных. Проверьте, вызывается ли эта функция, возможно, какое-то расширение переопределяет ее. Если это называется, проверьте данные, которые получает запрос. Удачи!

 2
Author: Sebastian, 2018-11-27 17:19:20

Проблема здесь заключалась в том, что индекс 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.

 1
Author: Daniel, 2019-04-04 12:15:11