Как получить массив данных записей из результата wp_query?
Когда я выполняю запрос с помощью метода WP_Query, я получаю объект. Я понимаю, что могу использовать цикл для отображения данных. Но моя цель не в том, чтобы что-то отображать, а в том, чтобы получить данные записей с помощью чего-то вроде "foreach...". Как мне получить массив данных записей, по которому я могу пройтись циклом и получить нужные данные?

Вам следует ознакомиться с справочником функций для WP_Query в WordPress Codex. Там вы найдёте множество примеров для изучения. Если вы не хотите использовать цикл while
для перебора результатов запроса, вы можете получить все записи, возвращаемые запросом WP_Query
, через свойство posts
.
Например:
$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;
foreach($posts as $post) {
// Делайте что нужно, например:
// echo $post->post_name;
}

Ни один из примеров, на которые вы ссылаетесь, не демонстрирует обработку записей. Хорошо, что вы ответили, жаль, что этого нет в документации. Ещё совет: если вы ищете уникальную запись, можно использовать функцию с 'posts_per_page'=>1
в аргументах. function wp_queryfirstpost($args) {
$q=new WP_Query($args);
$pp=$q->get_posts();
$firstpost=false;if ($pp) $firstpost=$pp[0];
wp_reset_postdata();
return $firstpost;
}

@rofflox: Ты святой! Отличный способ обойти get_the_title/ID/и тому подобное.

Лучше использовать $query->posts
, так как $query->get_posts()
запускает повторный разбор запроса и дополнительные ненужные запросы к базе данных

Метод $query->get_posts(); работает не так, как ожидалось. Непонятно почему, но он возвращает меньше записей, чем в запросе. Смотрите здесь: https://stackoverflow.com/questions/25395299/how-do-i-get-wordpress-wp-query-get-posts-on-multiple-categories-to-work

Этот ответ совершенно неверен. Когда вы создаете новый WP_Query с некоторыми аргументами, метод get_posts() вызывается внутренне сразу же, и ВАМ НЕ СЛЕДУЕТ ВЫЗЫВАТЬ ЕГО СНОВА! Если вы вызовете его снова, как показано в примере выше, будет выполнен ДРУГОЙ запрос, в зависимости от аргументов и результатов первоначального выполнения (установленные внутренние флаги и т.д.), и он может вернуть другой (меньший) набор результатов или вообще не вернуть ничего. Как верно отметили TomJNowell и Laxmana выше, для получения данных записей следует использовать $query->posts.

На самом деле, вам не нужно отказываться от использования цикла while()
. Тот же объект WP_Post уже хранится в свойстве post
:
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
// какой-то код здесь, если нужно.
while ( $query->have_posts() ) {
$query->the_post();
// теперь $query->post - это объект WP_Post, используйте:
// $query->post->ID, $query->post->post_title и т.д.
}
}

Нет, if
не избыточен. В данном конкретном случае — да, но в большинстве рабочих ситуаций между if и while есть код для выполнения.

@magi182 Что делает его избыточным в данном конкретном случае. Люди должны учиться, когда это использовать.

@frodeborli, Приятная особенность утверждений, начинающихся с "люди должны" — почти всегда можно заменить на "люди не будут", и утверждение останется верным.

@magi182 Я мог бы написать сотню полезных строк кода в дополнение к приведённому выше коду.
