Показывать сообщения, которые имеют определенное значение meta_key или вообще не имеют meta_key

У меня есть этот цикл, в котором мне нужно отобразить все заголовки сообщений, которые имеют определенное значение meta_value или не имеют meta_key 'the_status'.

Мои сообщения в настоящее время используют мета_ключ под названием «the_status» и могут иметь любое из этих значений мета_ключа:

помощь не_помощь завершена_помощь

... или сообщение может вообще не иметь мета_ключа 'the_status'.

Вот что у меня есть:

<?php
$the_query = array(
    'posts_per_page'    => -1, 
    'author'            => $current_user->ID,
    'post_status'       => 'publish',
    'meta_key'          => 'the_status',
    'meta_value'        => array('helping')
);
$help_posts = new WP_Query($the_query);
while($help_posts->have_posts()) : $help_posts->the_post();
?>

<p><?php the_title(); ?></p>

<?php
endwhile;
?>

Это, очевидно, дает мне только заголовки сообщений, у которых есть meta_value «помощь», но также нужно показывать заголовки сообщений, у которых вообще нет meta_key «the_status».

Спасибо за чтение.


person User_FTW    schedule 15.04.2016    source источник


Ответы (1)


заменять

'meta_key'          => 'the_status',
'meta_value'        => array('helping')

С

'meta_query' => array(
    'relation' => 'OR',
    array(
       'key' => 'the_status',
       'compare' => 'NOT EXISTS',
       'value' => '' //can be omitted in WP 3.9+
    ),
    array(
       'key' => 'the_status',
       'value' => array('helping')
    )
person trex005    schedule 15.04.2016
comment
Спасибо. Это работает и отвечает на мой вопрос. Но с тех пор я узнал, что некоторые мета_значения имеют значение NULL (я заметил, когда был в PHPMyAdmin). Как мне изменить это, чтобы включить мета_значения NULL? - person User_FTW; 15.04.2016
comment
У меня нет установки WP, с которой я мог бы поиграть для проверки, но я бы попробовал добавить еще один массив: array( 'key' => 'the_status', 'value' => NULL ) - person trex005; 15.04.2016
comment
Это не сработало (хотя я согласен, что должно было сработать). Я открыт для альтернативных предложений. Я отметил ваш исходный ответ как правильный. Спасибо! - person User_FTW; 15.04.2016
comment
Ну, это некрасиво, но вы могли бы 1. повторить запрос, чтобы выяснить, как он присоединяется к таблице postmeta 2. добавить фильтр к posts_where 3. выполнить запрос 4. удалить фильтр - person trex005; 15.04.2016