メニュー

WordPressのサブクエリWP_Queryを徹底解説

2021.06.10

WrordPress開発を行う過程で頻繁に登場するWP_Queryですが、開発を始めたばかりのプログラミング初心者はとりあえずコピペで乗り切って何となくで使っている方も多いのではないでしょうか。しかし、WordPress開発者として大きく飛躍するためにはWP_Queryをしっかり理解することは避けて通れません。ということでこの記事では何となくで理解している開発者向けにしっかり解説していきます。

WP_Query(サブクエリ)はどういったときに使うの?

WP_Queryは主に記事一覧を表示させるときに使っていると思いますが、WP_Queryはサブクエリということを認識せずとりあえず記事を表示させるために使うといった方も少なからずいらっしゃるはずです。まずはメインクエリとサブクエリを認識しましょう。

メインクエリとサブクエリの違い

WordPressにはメインクエリとサブクエリがあり、状況に応じてあらかじめデータベースから取得してくれるクエリ(投稿情報など)をメインクエリと言います。
一番わかりやすいのがトップページですが、トップページの場合はこちらで指示をしなくても「投稿」の情報一覧を取得してくれます。取得まで完了しているのであとは出力するソースを書けば記事の一覧が表示されるというわけです。

ということでトップページで「投稿」の記事を表示させるときに、既に「投稿」のクエリを取得しているのにわざわざWP_Queryを使って「投稿」を取得すと、二重でクエリを発生させている事になります。

では、固定ページのテンプレートに「投稿」の記事を表示させたいときはどうでしょう?固定ページではデフォルトでは「投稿」のクエリを取得してくれませんので、任意でクエリを読み込む必要があります。ここでサブクエリであるWP_Queryの出番です。
WordPressでは状況に応じてあらかじめ読み込んでくれるクエリ(メインクエリ)が存在しますが、自分の必要な情報がメインクエリで取得されないのであればサブクエリを使って取得することになります。

まとめると、メインループはテンプレートに応じで予め取得してくれるクエリ、サブループは自身で任意に取得するクエリというわけです。

私自身この違いが分からず何でもかんでもWP_Queryで取得して時代があったことは内緒です。

メインクエリのソース

メインクエリのソースをご覧いただくとわかりますが、何の記事を読み込むといった指示がありません。それでも記事の出力が出来るのは、既にクエリを読み込んでくれているからです。

/*-----------------------------------
 メインクエリ
-----------------------------------*/
if( have_posts() ) {
  echo '<ul class="newsList">';
  while( have_posts() ) {
    the_post();
    echo '<li><span class="date">' . get_the_time('Y年m月d日') . '</span><a href="' . the_permalink() . '">' . get_the_title() . '</a></li>';
  }
  echo '</ul>';
}

WP_Queryのソース

WP_Queryによるサブクエリのソースはメインクエリと異なり、任意のクエリを指示した上で取得してます。

/*-----------------------------------
 サブクエリ
-----------------------------------*/
//取得したい情報の指定
$args = array(
  'post_type' => 'post', //投稿タイプ
  'posts_per_page' => 5, //表示件数
  'orderby' => 'date', //並び順の参考情報(日付)
  'order' => 'DESC' //並び順の指定(降順)
);
//指定した情報をセットしてクエリを取得
$the_query = new WP_Query( $args );
//ループで一覧を出力
if( $the_query->have_posts() ) {
  echo '<ul class="newsList">';
  while( $the_query->have_posts() ) {
    the_post();
    echo '<li><span class="date">' . get_the_time('Y年m月d日') . '</span><a href="' . the_permalink() . '">' . get_the_title() . '</a></li>';
  }
  echo '</ul>';
}
//WP_Queryをリセット
wp_reset_query();

WP_Queryの使い方

ここではWP_Queryのソースを分割して詳しく説明していきます。

$argsで取得情報の指定

//取得したい情報の指定
$args = array(
  'post_type' => 'post', //投稿タイプ
  'posts_per_page' => 5, //表示件数
  'orderby' => 'date', //並び順の参考情報(日付)
  'order' => 'DESC' //並び順の指定(降順)
);

まずは配列でどの記事を何件、どういった並びでなどの指定を入れて$argsの変数にセットします。

この情報をもとにデータベースから情報を取得してきますので、ここでオーダー(注文票)を作成すると考えていただければわかりやすいかと思います。

上記は私が良く利用する基本的な形ですが、カテゴリの絞り込みやピンポイントで記事を指定したり除外したりと複雑に情報を指定できますので詳しくはこちらで紹介されてますので、必要なときはご確認ください。

指定した情報をセットしてクエリを取得

//指定した情報をセットしてクエリを取得
$the_query = new WP_Query( $args );

先ほど変数に配列でセットしたオーダーをnew WP_Query();に入れます。

new WP_Query( $args );としたことで、任意のクエリが取得されます。そしてそのままでは長くて使い勝手が悪いので取得したクエリを$the_queryの変数にセットします。

ここで使う「new」キーワードはインスタンスを生成するためのphpの作法ですので、一連のカタチで覚えていただければと思います。

ループで一覧を出力

//ループで一覧を出力
if( $the_query->have_posts() ) {
  echo '<ul class="newsList">';
  while( $the_query->have_posts() ) {
    the_post();
    echo '<li><span class="date">' . get_the_time('Y年m月d日') . '</span><a href="' . the_permalink() . '">' . get_the_title() . '</a></li>';
  }
  echo '</ul>';
}

最初のif文で$the_queryが記事を取得できているかを確認します。
記事を取得できていたら<ul></ul>のhtmlを出力してその中に記事をループ出力しています。

while文を使って取得したクエリをループを使って出力します。the_post();は特段何かを出力するわけではありませんが、出力する際に必要な情報を保持しているのでセットで使用しましょう。

ここでは<ul><li></li></ul>で記事を出力してますが、ご自身で使用されるときは必要に応じて編集してください。

WP_Queryをリセット

//WP_Queryをリセット
wp_reset_query();

最後にクエリをリセットします。

wp_reset_query();を使わなくても出力はできますが、これを使うことによってサブループを完了させてメインループのクエリへ復帰させているそうです。
メインクエリとサブクエリが混在するページであれば不具合を起こす可能性がありますので、こちらもセットで使用するようにしましょう。

最後に

以上がWP_Queryの基本的な使い方となります。

たびたび出てくる$argsや$the_queryなどの変数は任意で使用しているものですので別の変数でも大丈夫ですが、割と同じように記述しているソースを多く見かけますので、そのまま使った方が後々わかりやすいかと思います。

ここでは「投稿」に関しての説明で行いましたが、私自身はWP_Queryは「カスタム投稿」を表示させるときに使う機会が多いです。みなさんも「カスタム投稿」を使う機会になればさらにサブクエリを使う機会も増えると思いますのでしっかり使いこなしてより高度な開発が出来るよう頑張りましょう。

関連記事