Вопрос или проблема
Я пытаюсь отсортировать продукты woocommerce по наличию конкретного мета-ключа, в частности: мне нужно сначала отобразить продукты, которые имеют этот мета-ключ, а затем все продукты, которые не имеют мета-ключа “price_sale_custom”, поэтому я написал этот код:
args['meta_query'][] = [
'relation' => 'OR',
'promo_exists' => [
'key' => 'price_sale_custom',
'compare' => 'EXISTS',
],
'promo_not_exists' => [
'key' => 'price_sale_custom',
'compare' => 'NOT EXISTS',
],
];
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = 'price_sale_custom';
$args['order'] = 'DESC';
Основная проблема заключается в том, что я получаю только продукты, которые имеют мета-ключ “price_sale_custom”, но не получаю те, у которых его нет. Что я сделал не так?
Параметр meta_key
указывает WP_Query
возвращать только посты, которые имеют данные мета price_sale_custom
. Удалите его сначала, а затем измените orderby
, чтобы он ссылался на значения meta_query
:
Это что-то, что WordPress добавил в поддержку в версии 4.2: https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/
https://stackoverflow.com/questions/17745334/how-to-order-by-multiple-meta-keys
.
Ответ или решение
Чтобы правильно организовать размещение товаров в WooCommerce на основе наличия определенного мета-ключа, в вашем случае – "price_sale_custom", необходимо внести несколько изменений в ваш запрос WP_Query
. Рассмотрим, как правильно настроить запрос, чтобы сначала отобразить товары с заданным мета-ключом, а затем все остальные товары без него.
Шаг 1: Удаление ограничений по meta_key
Ваша текущая структура запроса ограничивает выборку только теми постами, которые содержат мета-ключ "price_sale_custom", поскольку используется параметр meta_key
. Чтобы исправить это, необходимо убрать meta_key
из вашего запроса.
Шаг 2: Настройка meta_query
для фильтрации и сортировки
Вы можете использовать параметр meta_query
, который позволяет гибко фильтровать посты на основе существования или отсутствия мета-данных. Также необходимо скорректировать порядок сортировки, чтобы он основывался на существовании мета-ключа.
Вместо вашего первоначального кода, используйте приведенный ниже пример:
$args = [
'post_type' => 'product',
'posts_per_page' => -1, // или любое другое число
'meta_query' => [
'relation' => 'OR',
[
'key' => 'price_sale_custom',
'compare' => 'EXISTS'
],
[
'key' => 'price_sale_custom',
'compare' => 'NOT EXISTS'
]
],
'orderby' => 'FIELD(`price_sale_custom`, "EXISTS", "NOT EXISTS")',
'order' => 'ASC'
];
// Выполняем запрос
$the_query = new WP_Query($args);
Объяснение кода
-
meta_query: Здесь мы задаем
OR
для двух условий:- Первое условие ищет товара с мета-ключом "price_sale_custom", используя
compare => 'EXISTS'
. - Второе условие – для товаров, у которых отсутствует этот мета-ключ, с
compare => 'NOT EXISTS'
.
- Первое условие ищет товара с мета-ключом "price_sale_custom", используя
-
orderby: Используем
FIELD
для определения порядка сортировки. Чтобы гарантировать, что товары с мета-ключом будут первыми, можно создавать кастомную сортировку. Однако функцияFIELD
может быть недоступна в WP_Query, и для ее использования могут понадобиться другие решения, такие как использованиеorderby
для работы с отдельными значениями. -
order: Устанавливаем порядок сортировки на "ASC", при этом товары с существующим мета-ключом будут первыми, за ними следуют остальные товары.
Заключение
Помните, что при работе с WP_Query, важно правильно настраивать параметры запроса. Ваш первоначальный подход к использованию meta_key
ограничивал выборку только товарами с мета-ключом, в то время как мы хотим получить как товары с ним, так и без него. Такой подход не только упростит ваш запрос, но и улучшит читаемость кода, что является важным аспектом поддерживаемости.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться за поддержкой!