WP_Query не работает как ожидалось для вложений и пользовательского meta_query
Если я использую get_posts()
следующим образом, я получаю несколько результатов со значением 1 для метаполя my_key
:
$posts = get_posts(
array(
'post_type' => 'attachment',
'meta_key' => 'my_key',
'meta_value' => '1'
)
);
//это возвращает несколько результатов, как и ожидалось
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);
//это возвращает пустой массив
print_r($results);
Я пробовал различные варианты массива meta_query, но безрезультатно. Я предполагаю, что это может быть ошибка, но хотел убедиться, что не упускаю что-то важное.

Во-первых, просто передайте свои аргументы в конструктор WP_Query
, так как это более чисто и соответствует документации Codex для этого класса.
Вы должны создавать запросы следующим образом:
$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
в моем массиве. По умолчанию вложения добавляются со статусом "inherit", но WP_Query
ищет записи со статусом "published", "draft" или "pending". (См. также документацию по этому параметру).
Таким образом, здесь нет ошибки, мы просто забыли проверить значения по умолчанию для всех параметров, передаваемых в объект.
В документации для параметра post_type
со значением "attachment" есть примечание, которое указывает на это требование:
По умолчанию WP_Query устанавливает
'post_status'=>'published'
, но для вложений по умолчанию используется'post_status'=>'inherit'
, поэтому вам нужно установить статус в'inherit'
или'any'
.

Смотрите мое обновление. Этот обновленный код протестирован и работает.

Я думаю, ваша проблема в том, что вы пытаетесь использовать WP_Query
как get_posts()
. Вполне возможно, что запрос работает, но вы просто не видите результаты. WP_Query
возвращает объект запроса, который нужно перебирать в цикле следующим образом:
...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();
// делайте что вам нужно
endwhile;
Также обратите внимание, что я использовал $my_query. Я не совсем уверен в этом, но кажется, что $query может быть зарезервированной переменной в WordPress, и в любом случае лучше делать запрос более читаемым (например, $attachment_meta_query или что-то подобное).

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