WP Query значение произвольного поля

18 нояб. 2014 г., 16:58:05
Просмотры: 35.2K
Голосов: 6

Я пытаюсь получить записи, у которых установлено мета-значение 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? На данный момент я не получаю никаких записей.

0
Все ответы на вопрос 3
0

Спасибо @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 );
18 нояб. 2014 г. 17:24:45
0

Я не думаю, что можно точно сравнивать значения для Сериализованного Массива, что происходит каждый раз, когда вы передаёте массив в update_post_meta. Вам нужно получать всё значение целиком во время цикла, используя:

get_post_meta( $post->ID, 'enterprise_on_page', 1 )

Если вам нужно выполнять запросы на основе этих значений, лучше сохранять их отдельно.

Для получения дополнительной информации ознакомьтесь с этим вопросом:

meta_query с мета-значениями в виде сериализованных массивов

18 нояб. 2014 г. 17:14:03
0

При текущей структуре ваших данных вы не можете использовать SQL для этого (по крайней мере, не эффективно). У вас есть два варианта:

  1. Получить ВСЕ записи и вручную перебирать их в памяти, ища нужные метаданные, или
  2. Хранить значения метаданных отдельно.

Из этих двух вариантов я рекомендую второй. 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);

18 нояб. 2014 г. 17:23:09