Comment obtenir un tableau de données de poste à partir du résultat de wp_query?

35

Lors de l'exécution d'une requête avec la méthode WP_Query, j'ai obtenu un objet. Je comprends que je peux ensuite faire la boucle pour afficher des contenus. Mais, mon objectif n'est pas d'afficher quoi que ce soit, je veux obtenir des données de post en faisant quelque chose comme "foreach ...". Comment puis-je obtenir un tableau de données post que je peux parcourir et obtenir des données?

Jenny
la source
2
Une différence importante à garder à l’esprit entre l’accès direct aux données de publication et l’utilisation de balises de modèle est que les filtres ne sont pas appliqués aux données et que certaines fonctionnalités risquent de ne pas fonctionner correctement.
Milo

Réponses:

73

Vous devriez lire la référence de fonction pour WP_Query sur le codex WordPress. Là vous avez beaucoup d'exemples à regarder. Si vous ne souhaitez pas parcourir l'ensemble de résultats à l'aide de a while, vous pouvez obtenir toutes les publications renvoyées par la requête avec le WP_Querydans la propriété posts.

Par exemple

$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
la source
1
Aucun des exemples cités ne montre comment traiter les publications. C'est bien que vous ayez répondu, dommage qu'ils ne l'aient pas dans la documentation. Autre astuce: Si vous faites une correspondance sur un article unique, vous pouvez utiliser une fonction comme celle-ci avec '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: Vous êtes un saint! Idéal pour contourner get_the_title / ID / younameit.
Vial
8
Vous devez utiliser à la $query->postsplace, $query->get_posts()cela déclenchera une réexécution de l'analyse de la requête et d'autres requêtes inutiles sur la base de données
Tom J Nowell
$ query-> get_posts (); ne fonctionne pas comme prévu. Je ne sais pas pourquoi, mais cela renvoie moins de messages que la requête. Voir ici: stackoverflow.com/questions/25395299/…
Laxmana
1
Cette réponse est tout à fait fausse. Lorsque vous créez un nouveau WP_Query avec certains arguments, la méthode get_posts () est immédiatement appelée en interne et vous ne devez pas l'appeler à nouveau! Si vous l'appelez à nouveau comme indiqué dans l'exemple ci-dessus, une requête DIFFERENTE sera exécutée, en fonction des arguments et des résultats de l'exécution initiale (indicateurs internes définis, etc.), et pourra éventuellement renvoyer un ensemble de résultats différent (plus petit). ou aucun résultat du tout. Comme suggéré par TomJNowell et Laxmana ci-dessus, vous devez utiliser $ query-> posts pour obtenir les données de publication.
ivanhoe
11

En fait, vous n’avez pas besoin de refuser d’utiliser la while()boucle. Le même objet WP_Post est déjà stocké dans la postpropriété:

        $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
la source
2
ifest redondant.
Akkumulator
2
Non, ifn'est pas redondant. Dans ce cas précis, c’est le cas, mais dans la plupart des situations de production, vous devez exécuter du code entre le if et le while.
magi182
2
@ magi182 Ce qui le rend redondant, dans ce cas précis. Les gens devraient apprendre quand utiliser ceci.
frodeborli
4
@frodeborli, La bonne chose à propos des déclarations qui commencent par «les gens devraient» est que vous pouvez presque toujours remplacer «les gens ne vont pas» et que la déclaration est toujours vraie.
magi182
1
@ magi182 Je pourrais probablement en créer une centaine, avec des lignes de code complémentaires au code ci-dessus.
frodeborli
-1

vous pouvez également utiliser à la get_posts( $args )place de wp_Query(), ce qui vous donnera une liste de messages

Alon Gouldman
la source