meta_query 'compare' => 'IN' не работает

3 апр. 2015 г., 22:43:26
Просмотры: 77.9K
Голосов: 21

Прежде всего, я знаю, что это дубликат, но ни один из предыдущих ответов не был полезным.

Я ищу записи через 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.
3
Комментарии

сериализован ли system_power_supply?

Howdy_McGee Howdy_McGee
3 апр. 2015 г. 22:52:46

да, сериализован. Вот значение из таблицы postmeta

a:1:{i:0;s:6:"single";}

Rizwan Rizwan
3 апр. 2015 г. 23:20:01

вот в чем проблема, meta query не работает с сериализованными данными. Если поискать на этом сайте запросы по сериализованным данным, вы найдете несколько ответов, но ни один метод не будет идеальным.

Milo Milo
3 апр. 2015 г. 23:30:36
Все ответы на вопрос 2
7
22

Не существует простого способа поиска сериализованных значений в 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',
    );
}
3 апр. 2015 г. 23:31:58
Комментарии

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

Rizwan Rizwan
3 апр. 2015 г. 23:52:29

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

Rizwan Rizwan
3 апр. 2015 г. 23:53:27

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

Jen Jen
6 апр. 2015 г. 18:38:30

Кстати, какой вариант сработал у тебя?

Jen Jen
6 апр. 2015 г. 18:40:18

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

Rizwan Rizwan
6 апр. 2015 г. 19:14:18

Нечасто встретишь программистку, которая совсем не кусается :D

Rizwan Rizwan
6 апр. 2015 г. 19:22:58

вы можете удалить первый, он не работает

Toskan Toskan
13 мар. 2016 г. 00:13:29
Показать остальные 2 комментариев
1

Я знаю, что прошло много времени, но на случай, если у кого-то возникнет такая же проблема. Я потратил часы, прежде чем нашел решение: похоже, что '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;
21 дек. 2017 г. 13:39:19
Комментарии

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

Bananaapple Bananaapple
3 мая 2019 г. 12:43:04