WordPressのメインクエリとサブクエリについて調べてみたのでメモ。
メインクエリ
WordPressでは、URLから記事を取得する条件(メインクエリ)を決めて、DBから記事データを取得してくるところまでを自動で行います。
URLがアーカイブページなどの場合、記事データが複数になる場合があるので、ループ処理(メインループ)で表示させる必要があります。
例えば、フロントページで投稿記事一覧を表示させたい場合、メインクエリを出力するので以下のような記述になります。
<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <div class="article"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <div class="sentence"><?php the_content(); ?></div> </div> <?php endwhile; else: ?> <div>記事がありませんでした。</div> <?php endif; ?>
しかし、同様の記述を固定ページに記述しても、投稿記事の一覧を表示させることはできず、その固定ページの記事1件のみが表示されるようになります。
これは、フロントページと固定ページでメインクエリが異なるためです。
サブクエリ
メインクエリとは異なるデータを取得したい場合、自分で取得する条件(サブクエリ)を決めることができます。
サブクエリを取得する方法として、WP_Queryを使う方法とget_postsを使う方法の2種類あります。
WP_Queryを使う場合
<?php $query = new WP_Query(array( 'post_type' => 'post', )); ?> <?php if($query->have_posts()) : ?> <?php while ($query->have_posts()) : $query->the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <div class="date"><?php echo get_the_date('Y.m.d'); ?></div> <div class="sentence"><?php the_content(); ?></div> <?php endwhile; wp_reset_postdata(); ?> <?php else : ?> <div>記事がありませんでした。</div> <?php endif; ?>
get_postsを使う場合
<?php $posts = get_posts(array( 'post_type' => 'post', )); ?> <?php if(!empty($posts)) : ?> <?php foreach($posts as $post) : setup_postdata($post); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <div class="date"><?php echo get_the_date('Y.m.d'); ?></div> <div class="sentence"><?php the_content(); ?></div> <?php endforeach; wp_reset_postdata(); ?> <?php else : ?> <div>記事がありませんでした。</div> <?php endif; ?>
単に記事データを取得するだけならどちらでも問題ないですが、WP_Queryの方が取得できる情報が多いので、複雑な処理を行いたい場合はWP_Queryを使ったほうがいいようです。
【参考サイト】
- WordPressループ生成まとめ – メインクエリとサブクエリ | hijiriworld Web
- WordPressで押さえておきたい!get_posts,WP_Query,query_posts の違いと用例|TECHNICAL BLOG|株式会社エムハンド
- WordPressループのメインクエリとサブクエリについて – y.o.designers-works
コメントが承認されるまで時間がかかります。