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
コメントが承認されるまで時間がかかります。