Запрос WP не работает должным образом для вложений и пользовательского мета-запроса


Если я использую get_posts() подобным образом, я получаю ряд результатов со значением 1 для my_key meta_key:

$posts = get_posts( 
    array( 
        'post_type'  => 'attachment', 
        'meta_key'   => 'my_key', 
        'meta_value' => '1' 
    ) 
);

//this has a bunch of results as expected
print_r($posts);

Однако, если я создам аналогичный запрос с помощью WP_Query, я получу пустой массив результатов

$args = array(
   'post_type' => 'attachment',
   'meta_query' => array(
       array(
       'key'     => 'my_key',
       'value'   => '1',
       'compare' => '=',
       'type'    => 'BINARY'

      )
   )
);

$query = new WP_Query();
$results = $query->query($args);
//this is empty
print_r($results);

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

Author: EAMann, 2012-05-15

2 answers

Во-первых, просто передайте свои аргументы конструктору WP_Query, так как это и чище, и так, как вы должны это делать в соответствии с документацией Кодекса класса.

Вы должны создавать такие вещи:

$my_key_query_args = array(
   'post_type'   => 'attachment',
   'post_status' => 'inherit',
   'meta_query'  => array(
       array(
           'key'     => 'my_key',
           'value'   => '1',
           'compare' => '=',
           'type'    => 'BINARY'

      )
   )
);

$my_key_query = new WP_Query( $my_key_query_args );

Во-вторых, обратите внимание на добавленный параметр post_status моего массива. По умолчанию вложения добавляются со статусом записи "наследование", но WP_Query будет искать записи со статусом "опубликовано", "черновик" или "в ожидании". (См. документация этого параметра также).

Таким образом, здесь нет ошибки, мы просто забыли проверить значения по умолчанию для всех параметров, переданных в объект.

В опции "вложение" для параметра post_type есть примечание, в котором указано это требование:

WP_Query по умолчанию устанавливает 'post_status'=>'published', но вложения по умолчанию имеют значение 'post_status'=>'inherit', поэтому вам нужно будет установить статус 'inherit' или 'any'.

 12
Author: EAMann, 2012-05-16 17:44:14

Я полагаю, что ваша проблема в том, что вы пытаетесь использовать WP_Query как get_posts(). Кажется вполне возможным, что запрос работает, но вы просто не видите результатов. WP_Query возвращает объект запроса, который вы просматриваете в цикле следующим образом:

...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();

// do your thing

endwhile;

Также обратите внимание, что я использовал $my_query. Я немного неясен в этом, но я считаю, что $query может быть зарезервированной переменной из WordPress, и в любом случае часто бывает лучше, если вы сделаете этот запрос немного более понятным для человека (возможно, событие $attachment_meta_query или что-то в этом роде).

 0
Author: mrwweb, 2012-05-15 14:50:50