WordPress メインクエリとサブクエリの概念

WordPressには、クエリという概念があります。

WordPressのクエリとは、ユーザーのリクエストを受けて、必要なデータを検索することです。

そしてクエリの中には、メインクエリとサブクエリの2種類あります。

メインクエリとサブクエリでは、テンプレートファイルに記載するPHPの記述の仕方が少し異なります。

そのため、WordPressをカスタマイズしたい人はメインクエリとサブクエリの概念とその違いを正確に理解しておく必要があります。

この記事では、一見わかりずらいメインクエリとサブクエリの違いについて解説をします。

メインクエリとサブクエリの理解が必要なとき

WordPressのデフォルト機能だけを使って、サイトを運営する場合であれば異なるクエリを理解する必要はありません。

しかし、企業サイトなど少し複雑な要件のサイトを作成する場合は、理解が必要となります。

メインクエリとサブクエリを使い分けるときの例

  • 同じページに複数の投稿タイプを表示したいとき
  • 投稿一覧をカスタム表示したいとき
  • テンプレートファイルとは関係なく、投稿データを表示したいとき
  • ・・・etc

同じページに複数の投稿タイプを表示したいとき

投稿タイプにはデフォルトとカスタムタイムの2つの投稿タイプがあります。

この2つの投稿タイプの一覧をfront-page.phpに表示したいときなどに、メインクエリとサブクエリが必要となります。

投稿一覧をカスタム表示したいとき

投稿タイプの件数やカテゴリーなど投稿タイプの一覧をカスタム表示したいときにもメインクエリとサブクエリの理解が必要なります。

テンプレートファイルとは関係なく、投稿データを表示したいとき

たとえば、固定ページのサイドバーにブログの投稿一覧(single/php)を表示したいときに、メインクエリとサブクエリが必要となります。

なぜ、メインクエリとサブクエリの理解が必要なのか?

それを理解するためには、WordPressがどのようにして登録されているデータをブラウザに表示しているのかという仕組みを理解する必要があります。

WordPressが特定の情報を表示する仕組み

先にも説明した通り、WordPressはユーザーからのリクエストをサーバーに飛ばし、リクエストに対してデータベース内のデータを検索するよう指令を出します。

この指令がメインクエリです。

たとえば、固定ページのURLをリクエストしたときは固定ページに必要な情報をデータベースに検索します。

しかし、固定ページ以外のURLを取得したいといったことがあります。

前項目3.の「テンプレートファイルとは関係なく、投稿データを表示したいとき」などです。

上記のたとえでは、すでに固定ページのURLのデータを検索するために、メインクエリを使用しています。

このとき別のURLの情報を検索したいときは、検索するための命令を増やす必要があります。

これが「サブクエリ」です。

サブクエリで固定ページ以外のURLを取得したい旨を記述することにより、リクエストに対してメインクエリとサブクエリを発信することができ、該当するデータをデータベースに検索することができます。

そして、集められた情報はサーバー内で$wp_queryというオブジェクトにまとめて生成され、PHPで処理をされてブラウザで表示されます。

つまり、メインクエリとサブクエリとはユーザーのリクエストに対して、メインクエリ以外のデータを抜き出すために必要なが概念であり、その記述方法が異なることから区別して理解する必要があるということです。

メインクエリの記述方法

例としてトップページにメインクエリを使って、お知らせ(デフォルト投稿タイプ)一覧を表示します。

トップページにお知らせ一覧を表示するためには、以下のような内容をfront-page.phpに記載します。

<section>
<dvi>お知らせ</div>
<ul>
<?php if(have_posts()) : while(have_posts()) : the_posts(): ?>
<li>
<a href="<?php the_permalink(); ?>">
<div><?php echo get_the_date("Y.m.d"); ?></div>
<div><?php the_title(); ?></div>
</a>
</li>
<?php endwhile; endif; ?>
</ul>
<div>
<a href="<?php bloginfo('url'); ?>/news">一覧を見る</a>
</div>
</section>

記述の解説

まず、デフォルト投稿タイプに投稿内容のオブジェクトがあれば、情報を表示するように以下のPHPを定義します。

<?php if(hav_posts()) : while(hav_posts()) : the_posts(): ?>

上記で、<li></li>の中身をループすることにより、投稿タイプに投稿があればその内容を表示するようにしています。

ちなみに、上記はデフォルト投稿タイプになるので表示件数などは、管理画面の「設定」にて表示する先のページと表示件数を制御しています。

表示件数や固定ページなどの一覧を表示したい場合は、「設定」の情報を書き換えることで表示内容を変更することができます。

サブクエリの記述方法

上記の他に「実績(カスタム投稿タイプ)」一覧などの情報をfront-page.php内に表示したいときはサブクエリを使って表示を制御します。

サブクエリではなくメインクエリを読み込むと、表示される内容が「お知らせ(デフォルト投稿タイプ)」の情報となってしまうからです。

<section>
<div>実績</div>
<div>
<?php
$args =array(
'post_type' => 'works';
'posts_per_page' => 3
);
$the_query = new WP_query($args);
<ul>
<php if($the_query->have_posts()): while($the_query->have_posts()): $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<div><?php echo get_the_date("Y.m.d"); ?></div>
<div><?php the_title(); ?></div>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php else; ?>
<?php endif; ?>
<div><a href="<?php bloginfo('url'); ?>/works">一覧を見る</a></div>
</section>

記述の解説

メインクエリとサブクエリの記述で大きく異なる点は、以下の一文です。

<php if($the_query->have_posts()): while($the_query->have_posts()): $the_query->the_post(); ?>

上記の記述では、ページ内にある$the_queryのオブジェクトが生成されていれば、それの取得をループし続けると定義されています。

$the_queryには、new WP_query($args);が代入されています。
new WP_queryは、新しいWordPressのクエリを生成するという関数で、その値として$argsという配列がパラメータとして記述されています。

つまり、配列$args内の内容を新しいWordPressのクエリとして生成し、そのクエリの中で新しくオブジェクトが生成(記事が更新)されたら、一覧に表示するという内容になっています。

メインクエリとサブクエリとは?

メインクエリは、URLに基づいて取得された情報を$wp_queryにまとめて格納し、それをループして投稿情報などのデータを取り出すことができます。

サブクリエは、URLに関係なく必要な情報を取得するために新しいオブジェクト$new WP_query();を生成して、それをループして情報を取り出すクエリです。