Come ottenere una matrice di dati post dal risultato wp_query?


35

Quando eseguo una query con il metodo WP_Query, ho ottenuto un oggetto. Capisco che posso quindi fare il ciclo per visualizzare materiale. Ma il mio obiettivo non è mostrare nulla, invece, voglio ottenere alcuni dati post facendo qualcosa come "foreach ...". Come posso ottenere una matrice di dati di post che posso scorrere e ottenere dati?


2
Una differenza importante da tenere a mente tra l'accesso ai dati dei post direttamente rispetto all'utilizzo dei tag modello è che i filtri non vengono applicati ai dati e alcune funzionalità potrebbero non funzionare.
Milo,

Risposte:


73

Dovresti leggere il riferimento della funzione per WP_Query sul codice WordPress. Lì hai molti esempi da guardare. Se non si desidera eseguire il ciclo sul set di risultati utilizzando a while, è possibile ottenere tutti i post restituiti dalla query con WP_Querynella proprietà posts.

Per esempio

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

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}

1
Tuttavia, nessuno degli esempi a cui ti colleghi mostra come elaborare i post. Quindi è un bene che tu abbia risposto, peccato che non ce l'hanno nella documentazione. Un altro consiglio: se stai facendo una corrispondenza su un post unico puoi usare una funzione come questa con 'posts_per_page'=>1in 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: sei un santo! Ottimo per aggirare get_the_title / ID / younameit.
Fiala

8
Dovresti $query->postsinvece utilizzare , $query->get_posts()attiverà una nuova esecuzione dell'analisi delle query e ulteriori query di database non necessarie
Tom J Nowell

$ query-> get_posts (); non funziona come previsto. Non so perché, ma restituisce meno post rispetto alla query. Vedi qui: stackoverflow.com/questions/25395299/...
Laxmana

1
Questa risposta è chiaramente sbagliata, quando si crea un nuovo WP_Query con alcuni argomenti, il metodo get_posts () viene chiamato internamente immediatamente e NON DOVREBBE CHIAMARLO DI NUOVO! Se lo chiami di nuovo come mostrato nell'esempio sopra, eseguirà una query DIVERSA, a seconda degli argomenti e dei risultati della corsa iniziale (set di flag interni, ecc.) E può potenzialmente restituire un set di risultati diverso (più piccolo) o nessun risultato. Come TomJNowell e Laxmana hanno suggerito sopra, si dovrebbero usare $ query-> post per ottenere i dati dei post.
Ivanhoe il

11

In realtà, non è necessario rifiutare di utilizzare while()loop. Lo stesso oggetto WP_Post è già archiviato nella postproprietà:

        $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.

            }

        }

2
ifè ridondante.
Akkumulator il

2
No, ifnon è ridondante. In questo caso, lo è, ma nella maggior parte delle situazioni di produzione, è necessario eseguire il codice tra if e the while.
magi182,

2
@ magi182 Il che lo rende ridondante, in questo caso esatto. Le persone dovrebbero imparare quando usarlo.
frodeborli,

4
@frodeborli, La cosa bella delle affermazioni che iniziano con "persone dovrebbero" è che puoi quasi sempre sostituire "le persone non lo faranno" e l'affermazione è ancora vera.
magi182,

1
@ magi182 Probabilmente potrei renderne un centinaio bello avere linee di codice per integrare il codice sopra.
frodeborli,

-1

puoi anche usare al get_posts( $args )posto di wp_Query(), che ti darà un elenco di post

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.