WP Query значение произвольного поля
Я пытаюсь получить записи, у которых установлено мета-значение trainees
.
$args = array(
'posts_per_page' => -1,
'orderby' => 'post_date',
'order' => 'DESC',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'enterprise_on_page',
'value' => array( 'trainees' ),
'compare' => 'IN',
),
),
);
$enterprise_posts = get_posts( $args );
В моём мета-поле с ключом enterprise_on_page я ранее сохранил array() используя update_post_meta( $post_id, 'enterprise_on_page', array('trainees', 'staff') );
.
Если я вызываю var_dump(get_post_meta($post->ID))
, я получаю следующий вывод:
'enterprise_on_page' =>
array (size=1)
0 => string 'a:2:{i:0;s:8:"trainees";i:1;s:7:"staff";}'
Как мне изменить запрос, чтобы отображались только записи с мета-значением trainees
? На данный момент я не получаю никаких записей.

Спасибо @Howdy_McGee. Он подсказал мне обратить внимание на сериализованные мета-запросы. С этим кодом я получил желаемый результат.
$args = array(
'posts_per_page' => -1,
'orderby' => 'post_date',
'order' => 'DESC',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'enterprise_on_page',
'value' => serialize(strval('trainees')),
'compare' => 'LIKE',
),
),
);
$enterprise_posts = get_posts( $args );

Я не думаю, что можно точно сравнивать значения для Сериализованного Массива, что происходит каждый раз, когда вы передаёте массив в update_post_meta
. Вам нужно получать всё значение целиком во время цикла, используя:
get_post_meta( $post->ID, 'enterprise_on_page', 1 )
Если вам нужно выполнять запросы на основе этих значений, лучше сохранять их отдельно.
Для получения дополнительной информации ознакомьтесь с этим вопросом:
meta_query с мета-значениями в виде сериализованных массивов

При текущей структуре ваших данных вы не можете использовать SQL для этого (по крайней мере, не эффективно). У вас есть два варианта:
- Получить ВСЕ записи и вручную перебирать их в памяти, ища нужные метаданные, или
- Хранить значения метаданных отдельно.
Из этих двух вариантов я рекомендую второй. WordPress позволяет хранить несколько строк одних и тех же метаданных для одной записи, так что вы можете получить массив данных без необходимости сериализации и хранения в одном ключе. Для этого вам нужно немного изменить способ взаимодействия с API метаданных записей. Вот как это можно сделать:
Для получения метаданных записи используйте:
get_post_meta($ID, 'enterprise_on_page', false);
Обновление будет отличаться сильнее всего. Если вы хотите просто добавить значение, используйте:
add_post_meta($ID, 'enterprise_on_page', $value);
Для обновления значения:
update_post_meta($ID, 'enterprise_on_page', $new_value, $old_value);
А для удаления значения:
delete_post_meta($ID, 'enterprise_on_page', $value_to_delete);
