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

13

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

Я ищу в сообщениях через 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это работает. Я уверен в этих вещах:

Ризван
источник
это system_power_supplyсериализовать?
Howdy_McGee
да это так. Вот значение в таблице postmeta a:1:{i:0;s:6:"single";}
Ризван
2
Ну, это ваша проблема, мета-запрос не будет работать с сериализованными данными. если вы будете искать на этом сайте сериализованные данные, вы найдете ответы на некоторые вопросы, но ни один метод не будет идеальным.
Майло

Ответы:

13

Нет простого способа поиска сериализованных значений в мета-запросе. Если список значений не слишком длинный, потенциально вы можете настроить несколько мета-запросов:

'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?
Ризван
1
Я женщина, а не "братан", но не проблема. Значение meta_value содержит сериализованные данные, так как расширенные настраиваемые поля сохраняют данные. Это не идеально, конечно.
Джен
1
хаха, я прошу прощения у моей леди. Второе и третье работали хорошо, первый не пробовал.
Ризван
2
Вы можете удалить первый, он не работает
Toskan
4

Я знаю, что это было давно, но на тот случай, если у кого-то возникла такая же проблема. Ну, я потянул свои волосы в течение нескольких часов, прежде чем обнаружил проблему: «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 вы можете просто передать массив непосредственно ключу значения. Если вы добавите ее в строку, вы можете получить неожиданные результаты в отношении того, как wp разбивает строку на сегменты для IN()детали. Например, 'this that', 'and', 'that'становится 'this','that','and','that'- так что, кажется, лучше просто дать ему массив.
Bananaapple