Как получить массив почтовых данных из результата wp_query?

35

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

Дженни
источник
2
Важное различие, которое следует иметь в виду при непосредственном доступе к данным публикации по сравнению с использованием тегов шаблонов, заключается в том, что фильтры не применяются к данным и некоторые функции могут нарушаться.
Майло

Ответы:

73

Вы должны прочитать ссылку на функцию для WP_Query в кодексе WordPress. Там у вас есть много примеров, чтобы посмотреть. Если вы не хотите перебирать результирующий набор с помощью a while, вы можете получить все сообщения, возвращаемые запросом с WP_Queryпомощью свойства in posts.

Например

$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}
rofflox
источник
1
Однако ни один из примеров, на которые вы ссылаетесь, не демонстрирует, как обрабатывать сообщения. Так что хорошо, что вы ответили, жаль, что их нет в документации. Еще один совет: если вы делаете совпадение с уникальным постом, вы можете использовать такую ​​функцию '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 / younameit.
Флакон
8
$query->postsВместо этого следует использовать , что $query->get_posts()приведет к повторному запуску парсинга запросов и дополнительных ненужных запросов к базе данных
Том Дж. Новелл
$ query-> get_posts (); не работает, как ожидалось. Не уверен, почему, но он возвращает меньше сообщений, чем запрос. Смотрите здесь: stackoverflow.com/questions/25395299/…
Laxmana
1
Этот ответ совершенно неверен, когда вы создаете новый WP_Query с некоторыми аргументами, метод get_posts () вызывается изнутри, и вы НЕ ДОЛЖНЫ ВЫЗВАТЬ ЭТО СНОВА! Если вы вызовете его снова, как показано в примере выше, он выполнит РАЗЛИЧНЫЙ запрос, в зависимости от аргументов и результатов из начального запуска (набор внутренних флагов и т. Д.), И потенциально может вернуть другой (меньший) набор результатов. или нет результатов вообще. Как предложили TomJNowell и Laxmana выше, для получения данных постов следует использовать $ query-> posts.
Иванго
11

На самом деле, вам не нужно отказываться от использования while()цикла. Тот же объект WP_Post уже хранится в postсвойстве:

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();

                // now $query->post is WP_Post Object, use:
                // $query->post->ID, $query->post->post_title, etc.

            }

        }
vladkras
источник
2
ifизбыточно
Akkumulator
2
Нет, ifне является лишним. В данном случае это так, но в большинстве производственных ситуаций у вас есть код, который нужно выполнить между if и while.
magi182
2
@ magi182 Что делает его избыточным, в данном случае. Люди должны учиться, когда использовать это.
frodeborli
4
@frodeborli, Хорошая вещь об утверждениях, которые начинаются с «люди должны», состоит в том, что вы почти всегда можете заменить «люди не будут», и утверждение все еще проверяется как истинное.
magi182
1
@ magi182 Я мог бы, наверное, сделать сто штук, чтобы строки кода дополняли приведенный выше код.
frodeborli
-1

Вы также можете использовать get_posts( $args )вместо wp_Query(), что даст вам список сообщений

Алон Гулдман
источник