wp_queryの結果から投稿データの配列を取得する方法は?


35

WP_Queryメソッドでクエリを実行すると、オブジェクトが取得されました。その後、ループを実行して内容を表示できることを理解しています。しかし、私の目標は何も表示することではなく、「foreach ...」などの操作を行って投稿データを取得することです。ループしてデータを取得できる投稿データの配列を取得するにはどうすればよいですか?


2
投稿データに直接アクセスする場合とテンプレートタグを使用する場合の違いは、フィルターがデータに適用されず、一部の機能が破損する可能性があることです。
ミロ

回答:


73

WordPress codex でWP_Query関数リファレンスを読む必要があります。見るべき例がたくさんあります。を使用して結果セットをループしたくない場合は、プロパティでをwhile使用してクエリによって返されたすべての投稿を取得できWP_Queryます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;
}

1
ただし、リンク先の例はいずれも投稿の処理方法を示していません。ですから、ドキュメントにそれがないのは残念です。別のヒント:一意の投稿で一致を行う場合は'posts_per_page'=>1、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; }
ヘンリックアーランソン14年

@rofflox:あなたは聖人です!get_the_title / ID / younameitの回避に最適です。
バイアル

8
$query->posts代わりに使用する必要$query->get_posts()があります。クエリ解析の再実行と追加の不要なデータベースクエリをトリガーします
トムJノウェル

$ query-> get_posts(); 期待どおりに動作していません。理由はわかりませんが、クエリよりも少ない投稿を返します。こちらをご覧ください:stackoverflow.com/questions/25395299/…–
ラスマナ

1
この答えはまったく間違っています。いくつかの引数を指定して新しいWP_Queryを作成すると、メソッドget_posts()がすぐに内部的に呼び出され、再度呼び出してはなりません。上記の例に示すように再度呼び出すと、最初の実行(内部フラグセットなど)からの引数と結果に応じて、異なるクエリを実行し、異なる(より小さい)結果セットを返す可能性がありますまたはまったく結果がありません。TomJNowellとLaxmanaが上記で提案したように、投稿データを取得するには$ query-> postsを使用する必要があります。
ivanhoe 16

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.

            }

        }

2
if冗長です。
-Akkumulator

2
いいえ、if冗長ではありません。この正確なケースではそうですが、ほとんどの生産状況では、ifとwhileの間で実行するコードがあります。
magi182

2
@ magi182この場合、冗長になります。人々はこれをいつ使うべきかを学ぶべきです。
frodeborli

4
@frodeborli、 "people should"で始まるステートメントの良いところは、ほとんど常に "people will't"に置き換えることができ、ステートメントがまだtrueとしてテストされることです。
magi182

1
@ magi182おそらく、上記のコードを補完するコード行を追加して、100を作成できます。
frodeborli

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.