Come ottenere un array di dati dei post dal risultato di wp_query?
Quando eseguo una query con il metodo WP_Query, ottengo un oggetto. Capisco che posso quindi fare il loop per visualizzare i contenuti. Tuttavia, il mio obiettivo non è visualizzare nulla, ma piuttosto ottenere alcuni dati dei post facendo qualcosa come "foreach...". Come posso ottenere un array di dati dei post attraverso cui posso ciclare e ottenere i dati?
Dovresti leggere la documentazione di riferimento per WP_Query sul codex di WordPress. Lì troverai molti esempi da consultare. Se non vuoi iterare sul set di risultati usando un ciclo while, puoi ottenere tutti i post restituiti dalla query con la proprietà posts dell'oggetto WP_Query.
Ad esempio
$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;
foreach($posts as $post) {
// Fai quello che ti serve, ad esempio
// echo $post->post_name;
}
Nessuno degli esempi che hai linkato mostra come elaborare i post, però. Quindi è positivo che tu abbia risposto, peccato che non sia documentato. Un altro suggerimento: se stai cercando una corrispondenza su un post unico, puoi usare una funzione come questa con 'posts_per_page'=>1 negli argomenti. 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/oquellochevuoi.
Vial
Dovresti usare $query->posts invece, $query->get_posts() attiverà una riesecuzione del parsing della query e ulteriori query al database non necessarie
Tom J Nowell
$query->get_posts(); non funziona come previsto. Non sono sicuro del motivo, ma restituisce meno post rispetto alla query. Vedi qui: https://stackoverflow.com/questions/25395299/how-do-i-get-wordpress-wp-query-get-posts-on-multiple-categories-to-work
Laxmana
Questa risposta è completamente sbagliata. Quando crei una nuova WP_Query con alcuni argomenti, il metodo get_posts() viene chiamato internamente subito e NON DOVRESTI CHIAMARLO DI NUOVO! Se lo chiami nuovamente come mostrato nell'esempio sopra, eseguirà una query DIVERSA, in base agli argomenti e ai risultati della prima esecuzione (flag interni impostati, ecc..), e può potenzialmente restituire un insieme di risultati diverso (più piccolo) o nessun risultato. Come suggerito da TomJNowell e Laxmana sopra, si dovrebbe usare $query->posts per ottenere i dati dei post.
ivanhoe
In realtà, non è necessario evitare di utilizzare il ciclo while(). Lo stesso oggetto WP_Post è già memorizzato nella proprietà post:
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
// del codice qui se necessario.
while ( $query->have_posts() ) {
$query->the_post();
// ora $query->post è l'oggetto WP_Post, puoi usare:
// $query->post->ID, $query->post->post_title, ecc.
}
}
No, if non è ridondante. In questo caso specifico lo è, ma nella maggior parte delle situazioni di produzione, hai del codice da eseguire tra l'if e il while.
magi182
@magi182 Il che lo rende ridondante, in questo caso specifico. Le persone dovrebbero imparare quando usarlo.
frodeborli
@frodeborli, La cosa bella delle affermazioni che iniziano con "le persone dovrebbero" è che puoi quasi sempre sostituirle con "le persone non lo faranno" e l'affermazione risulta comunque vera.
magi182
@magi182 Probabilmente potrei scrivere un centinaio di righe di codice utili per integrare il codice sopra.
frodeborli