WordPressのメインクエリとサブクエリについて

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を使ったほうがいいようです。
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

コメントが承認されるまで時間がかかります。

2021年4月
 123
45678910
11121314151617
18192021222324
252627282930