Como obter uma matriz de dados de postagem do resultado wp_query?

35

Ao executar uma consulta com o método WP_Query, recebi um objeto. Entendo que posso fazer o loop para exibir coisas. Mas, meu objetivo não é exibir nada. Em vez disso, quero obter alguns dados da postagem fazendo algo como "foreach ...". Como posso obter uma matriz de dados de postagem que eu possa percorrer e obter dados?

Jenny
fonte
2
Uma diferença importante a ser lembrada entre o acesso direto aos dados de postagem e o uso de tags de modelo é que os filtros não são aplicados aos dados e algumas funcionalidades podem ser interrompidas.
Milo

Respostas:

73

Você deve ler a referência de função para WP_Query no codex do WordPress. Lá você tem muitos exemplos para olhar. Se você não quer varrer o conjunto de resultados usando um while, você pode obter todas as mensagens retornadas pela consulta com o WP_Queryna propriedade posts.

Por exemplo

$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
fonte
11
Porém, nenhum dos exemplos aos quais você vincula demonstra como processar postagens. Então é bom que você tenha respondido, pena que eles não tenham isso na documentação. Outra dica: se você estiver fazendo uma correspondência em uma postagem exclusiva, poderá usar uma função como esta 'posts_per_page'=>1em args. 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; }
Henrik Erlandsson
@rofflox: Você é um santo! Ótimo para contornar get_the_title / ID / younameit.
Vial
8
Você deve usar $query->posts, em vez disso, $query->get_posts()acionará uma reexecução da análise de consultas e consultas adicionais desnecessárias ao banco de dados
Tom J Nowell
$ query-> get_posts (); não está funcionando como esperado. Não sei por que, mas retorna menos post que a consulta. Veja aqui: stackoverflow.com/questions/25395299/…
Laxmana 12/16
11
Esta resposta está totalmente errada. Quando você cria uma nova WP_Query com alguns argumentos, o método get_posts () é chamado internamente imediatamente e você NÃO DEVE LIGAR NOVAMENTE! Se você chamá-lo novamente, como mostrado no exemplo acima, ele executará uma consulta DIFERENTE, dependendo dos argumentos e resultados da execução inicial (conjunto de sinalizadores internos, etc.) e poderá retornar um conjunto de resultados diferente (menor) ou nenhum resultado. Como TomJNowell e Laxmana sugeriram acima, deve-se usar $ query-> posts para obter os dados da postagem.
ivanhoe
11

Na verdade, você não precisa se recusar a usar o while()loop. O mesmo objeto WP_Post já está armazenado na postpropriedade

        $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
fonte
2
ifé redundante.
Akkumulator
2
Não, ifnão é redundante. Nesse caso exato, mas na maioria das situações de produção, você tem código para executar entre o if e o while.
magi182
2
@ magi182 O que a torna redundante, neste caso exato. As pessoas devem aprender quando usar isso.
Frodeborli 3/04
4
@frodeborli, O bom das declarações que começam com "as pessoas deveriam" é que você quase sempre pode substituir "as pessoas não" e a declaração ainda testa como verdadeira.
magi182
11
@ magi182 Eu provavelmente poderia fazer uma boa centena de linhas de código para complementar o código acima.
Frodeborli
-1

você também pode usar em get_posts( $args )vez de wp_Query(), o que fornecerá uma lista de postagens

Alon Gouldman
fonte