Фильтрация продуктов через 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);