Фильтрация продуктов через pre_get_posts по минимальной и максимальной цене (используйте VARIATION продукта, установленную через атрибут default_attribute для результатов фильтрации)

У меня есть список продуктов, и в настоящее время я реализую различные функции фильтров.

Каждому продукту назначено 12 вариантов, и каждому варианту назначена своя цена.

У каждого продукта есть самый дешевый вариант, определенный по умолчанию (через свойство атрибутов продукта по умолчанию)

Я хочу, чтобы приспособить запрос WordPress в действии pre_get_posts, чтобы соответствовать только продукты между макс и мин в цене - однако, глядя на PostMeta я вижу, что для каждого изменения продукта есть запись - например,

product_id: 10, _price: 100 (-> default variation)
product_id: 10, _price: 110
product_id: 10, _price: 120
product_id: 11, _price: 110 (-> default variation)
product_id: 11, _price: 120
product_id: 11, _price: 130

....

если я сделаю что-то вроде этого:

    $currentMetaQuery = $query->get('meta_query');

    $currentMetaQuery[] = [
        'key' => '_price',
        'value' => array($minMax['min'], $minMax['max']),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    ];

    $query->set('meta_query', $currentMetaQuery);

с минимум 110 и максимумом 200 я получаю продукты с идентификаторами 10 и 11 (поскольку оба продукта содержат варианты, которые соответствуют запросу фильтра)

hower: я хочу, чтобы варианты по умолчанию были основой для значения фильтрации -> запрос выше должен возвращать только продукт с идентификатором 11.

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

Кто-нибудь знает, как это сделать?

Спасибо за любой вклад или решения, которые вы могли мне показать!

1 ответ

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

        $sql = "SELECT product_id FROM {$wpdb->wc_product_meta_lookup} WHERE min_price BETWEEN %d AND %d";
        $queryString = $wpdb->prepare($sql, $minMax['min'], $minMax['max']);
        $result = $wpdb->get_results($queryString, ARRAY_N);

        if (!is_array($result)) {
            return;
        }

        $flatProductIds = array_unique(
            array_map(function($item) {
                return $item[0];
            }, $result)
        );

        if (empty($flatProductIds)) {
            $flatProductIds = [-1]; // Passing an empty array to post__in will return has_posts() as true (and all posts will be returned)
        }

        // restrict query to post matching the price selection
        $query->set('post__in', $flatProductIds);
Другие вопросы по тегам