meta_query 'compare' => 'IN' не работает
Прежде всего, я знаю, что это дубликат, но ни один из предыдущих ответов не был полезным.
Я ищу записи через post_meta
. Вот мой код, который в настоящее время ничего не возвращает.
$args = array(
'numberposts' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => array('single', 'redundant'),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;
Если я удаляю meta_query
, то работает. Я уверен в следующем:
- Нет ошибок в написании
key
илиvalue
. - тип записи - это
post
- У меня есть запись со значением 'single' в 'system_power_supply'. Однако, поля записи генерируются с помощью Advanced Custom Fields.

Не существует простого способа поиска сериализованных значений в meta query. Если список значений не слишком длинный, можно настроить несколько meta queries:
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'system_power_supply',
'value' => 'single',
'compare' => 'LIKE',
),
array(
'key' => 'system_power_supply',
'value' => 'redundant',
'compare' => 'LIKE',
)
)
Или, если хотите сделать более изящное решение, можно настроить его динамически:
$values_to_search = array('single', 'redundant');
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
$meta_query[] = array(
'key' => 'system_power_supply',
'value' => $value,
'compare' => 'LIKE',
);
}

Огромное спасибо, братан. Не передать, какую огромную головную боль ты мне помог решить.

Кстати, почему meta_value содержит сериализованные данные, если мы не можем выполнять запросы через meta_query? Это баг WordPress?

Я женщина, а не "братан", но ничего страшного. Поле meta_value содержит сериализованные данные из-за того, как Advanced Custom Fields сохраняет данные. Это, конечно, не идеально.

Ха-ха, прошу прощения, моя леди. Второй и третий варианты сработали хорошо, первый не пробовал.

Я знаю, что прошло много времени, но на случай, если у кого-то возникнет такая же проблема. Я потратил часы, прежде чем нашел решение: похоже, что 'meta_query' с оператором сравнения 'IN' не принимает обычный массив. Вместо этого нужно сначала объединить его значения с помощью ', '.
Таким образом, в вашем случае должно сработать что-то вроде этого:
$args = array(
'posts_per_page' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => join(', ', array('single', 'redundant')),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;

В WP 5 вы можете напрямую передать массив в ключ value. Если вы преобразуете его в строку с помощью implode, могут возникнуть неожиданные результаты в том, как WordPress разбивает строку на сегменты для части IN()
. Например, 'this that', 'and', 'that'
превращается в 'this','that','and','that'
- поэтому лучше просто передавать массив.
