meta_query 'Compare' => 'IN' не працює


14

Перш за все, я знаю, що це дублікат, але жодна із старих відповідей не була корисною.

Я шукаю в публікаціях наскрізь 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
  • Там є пост зі значенням «одного» в «system_power_supply». Однак поля публікації створюються розширеними спеціальними полями .

це system_power_supplyсеріалізовать?
Howdy_McGee

Так. Ось значення в таблиці постмета a:1:{i:0;s:6:"single";}
Rizwan

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',
    );
}

Дякую тобі, брате. Я не можу тобі сказати, наскільки великий головний біль ти вирішив у мене.
Різван

btw, чому мета_значення, що містить серіалізовані дані, якщо ми не в змозі здійснити запит через мета_запит? Це помилка WordPress?
Різван

1
Я жінка, не "брато", але немає проблем. Мета_значення містить серіалізовані дані через спосіб збереження даних Advanced Custom Fields. Це не ідеально, точно.
Джен

1
ха-ха, я вибачте свою пані. Другий і третій спрацювали добре, не спробували першого.
Різван

2
ви можете видалити перший, він не працює
Toskan

4

Я знаю, що минуло давно, але про всяк випадок, якщо хтось має те саме питання. Добре, що я тягнув волосся за години, перш ніж я знайшов проблему: "мета_запит" з "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'- так здається, краще просто дати йому масив.
Бананапс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.