WordPress

【WordPress(ワードプレス)】メインクエリとサブクエリとは?初心者向け解説

 

こんにちは、イケゾーです。

WordPressを勉強中の人が必ずハマる「クエリ」という言葉。直感的に意味が分かりづらいし、コードも複雑で壁を感じる方も多いのでは?挫折しちゃう方も中にはいるのでは無いでしょうか。

 

【WordPress(ワードプレス)】メインクエリとサブクエリとは?初心者向け解説

この記事では、超初心者向けに丁寧に「クエリ」について解説し、最後まで読むと「メインクエリ」「サブクエリ」の違いまで理解できちゃうという内容になっております。

 

この記事はこんな人におすすめ!

  • WordPressの「クエリ」ってなに
  • WordPress参考書の「サブクエリ」でつまづいた
  • メインクエリとサブクエリの違いが分からない

 

 

ワードプレスおすすめ参考書
【WordPress(ワードプレス)初心者におすすめ本】「仕事の現場でサッと使える! デザイン教科書」のレビュー

続きを見る

当ブログでは、WordPressテーマ 「WING(AFFINGER5)」 を使用しています。

 

WordPress(ワードプレス)のクエリとは

まず、クエリのイメージを正しく持っていただく必要があります。参考書っぽくない言い方をすると、クエリとは「データベースさん、この記事の中身をくれ!という命令」のことです。

「クエリを発行する」という言い方もありますが、これは「条件に合致した投稿データをくれ!」と要求する意味になります。

 

では、図を使ってさらにイメージを正確なものにしていきます。

ワードプレスでは、投稿画面で投稿した記事の内容は、データベース(MySQL)に保存されます。

そのデータベースにクエリを発行すると、条件に合致したデータを取得することができるのです。

イケゾー
トップページには、投稿記事の最新3件を表示したいな

この場合には、「データベースさん、投稿記事の最新3件をくれ」というクエリを発行して、情報を取得して表示するといった流れになります。

 

このように、クエリ発行には、「カテゴリ名」「投稿ID」「取得する順番」「取得するデータ数」を指定して、必要なデータを取得します。

取得できる投稿データに含まれるデータは下記の通りです。

  • 本文
  • 投稿日時
  • 更新日時
  • ID
  • ページの種類(カテゴリページ / 固定ページ / 投稿ページなど)
  • コメント数

 

 

ワードプレスおすすめ参考書
【WordPress(ワードプレス)初心者におすすめ本】「仕事の現場でサッと使える! デザイン教科書」のレビュー

続きを見る

WordPress(ワードプレス)のメインクエリとは

メインクエリもクエリのひとつです。サブクエリと異なる点は下記の3つです。

  1. メインクエリは、ワードプレスが自動で作成する
  2. メインクエリは、URLを基に作られる
  3. メインクエリは、ワードプレス起動時に発行される

 

メインクエリは、ワードプレスが自動で作成する

本来クエリは、自分で発行して投稿データを取得するものです。しかし、ワードプレスでは自動的にクエリが発行されています。自分でクエリを発行せずにデータを取得することができます。これをメインクエリと呼びます。

 

メインクエリは、URLを基に作られる

メインクエリは、自動で発行されるモノですが、どんなデータを取得するモノなのでしょうか。

メインクエリは、ユーザが表示したURLのページ作成に必要な投稿データを取得するモノです。URLが投稿ページの場合、その投稿ページを表示するのに必要な投稿データ(タイトルや本文)を取得するメインクエリが自動発行されます。

 

イケゾー
少し難しいですよね。図を使って説明しますね

 

投稿ページの場合

投稿記事ID=3を表示するときは、そのIDを指定して、1つの投稿データ(タイトルや本文)を取得するメインクエリが自動発行されます。このメインクエリが発行されれば、URLに対応する投稿情報を取得することができます。

 

カテゴリページの場合

URLがカテゴリページの場合は、メインクエリはそのカテゴリに属する複数の投稿ページの投稿IDを指定し、投稿データを取得できます。

当ブログのヘッダーの「code」をクリックすると、codeカテゴリに分類された記事の一覧が メインクエリで表示されています。

 

このように、ページに表示したい情報は、メインクエリで取得されたデータを使用することができます。自分でクエリを発行しなくても、ワードプレスが自動でやってくれているわけですね。

 

 

ワードプレスおすすめ参考書
【WordPress(ワードプレス)初心者におすすめ本】「仕事の現場でサッと使える! デザイン教科書」のレビュー

続きを見る

WordPress(ワードプレス)のサブクエリとは

では、「サブクエリ」は何?となりますね。
サブクエリとは、メインクエリ以外のクエリのことをいいます。

 

サブクエリは、自分が欲しい投稿データを取得できる

メインクエリはURLによって自動で投稿データを取得するモノですが、他の投稿データを取得したい場合もあります。

他の投稿データを取得したい場合は、サブクエリを自分で発行する必要があります。

 

サブクエリはここで使う

具体的な例をあげて説明します。では、サブクエリが使われる代表的な場面をご紹介します。

 

サブクエリはここで使う

投稿ページ(記事詳細)のサイドバーにカテゴリの記事一覧を表示するケースです。

 

URLは、投稿ページなので、投稿内容を取得するメインクエリ(図の左側)が発行されます。図の右側の「カテゴリ記事一覧」を表示したいと思っても、メインクエリでは不可能です。

そこで、サブクエリを発行して、カテゴリの属する記事の一覧を取得して、記事タイトルを並べるといったことができるようになります。このようにメインクエリで取得できないデータを、サブクエリを使用して取得できるようになります。

 

ワードプレスおすすめ参考書
【WordPress(ワードプレス)初心者におすすめ本】「仕事の現場でサッと使える! デザイン教科書」のレビュー

続きを見る

 

WordPress(ワードプレス)のクエリの作成方法をステップ解説

サブクエリは自分でクエリの作成と発行をする必要があります。 (完成版ソースコードはこちら)

  1. 条件を設定したクエリを作成
  2. データベースにクエリを発行
  3. データベースから投稿データを取得

 

 

クエリの作成と発行

クエリの作成と発行は、WP_Queryクラスのインスタンスを作成するプログラムを書くだけで実行できます。

$my_query = new WP_Query( $args );

 

引数$argsに条件を指定してあげれば、クエリの作成と発行が実行されます。

クエリが発行されると、作成したインスタンスにクエリ発酵によって取得された投稿データが保存され、変数($my_query)がその投稿データが保存されたインスタンスを参照します。

 

このプログラムによって$my_queryから取得した投稿データを使用できます。$my_queryが参照している投稿データを1つずつ取得して表示するには、下記のプログラムで可能です。

メインクエリで使われるメインループに対し、サブクエリではサブループと呼ばれます。プログラムの違いは、$my_query->の部分に注意しましょう。また$wp_reset_postdata();は、サブループの最後に必要で、メインループに影響を及ぼさないための記述です。忘れないようにしましょう。

<?php
  if ( $my_query->;have_posts()):
    while ( $my_query->;have_posts() ): $my_query->;the_post();
     the_title();
     the_content();
    endwhile;
  endif;
  wp_reset_postdata();
?>

 

 

クエリの条件設定

クエリの条件設定はWP_Queryの引数($args)で指定します。

下記のように引数(パラメータと設定値)を設定します。

$args = array(
  'パラメータ名1' => 設定値1,
  'パラメータ名2' => 設定値2,
);

 

それをWP_Query()の引数に与えれば、WP_Queryの中で条件に基づいたクエリが作成され、発行とデータの取得が実行されます。

条件設定の例

カテゴリ「Code」の記事を降順で3件取り出す場合は、下記の配列$argsを作成します。

$args = array(
  'category_name'  => 'code',
  'orderby'        => 'date',
  'order'          => 'DESC',
  'posts_per_page' => 3,
);

 

この配列$argsをWP_Query()の引数にすると、指定した投稿データを取得できます。

$my_query = new WP_Query( $args );

 

 

 

条件設定のサンプル

条件を上手に設定すれば、サイトの中で色々な情報を表示することができます。ここからは、実際にどのような条件設定ができるか紹介します。

 

特定のカテゴリの投稿データを取得

category_nameカテゴリのスラッグを指定すれば、スラッグが「code」の投稿データを取得できます。カテゴリ名ではないので注意してください。また、catを使えばカテゴリIDによる指定も可能です。

category_name:カテゴリのスラッグを指定

cat:カテゴリ ID を指定

 

$args = array(
  'category_name' => 'code',
);
$my_query = new WP_Query( $args );

 

もちろん下記のように書いてもOKです。

$my_query = new WP_Query( 'category_name' => 'code');

 

特定の日時に投稿された投稿データを取得

下記のように指定することで、特定の日時に投稿された投稿データを取得できます。2020年12月に投稿された投稿データを取得するプログラムを作成してみました。

year:西暦の年

monthnum:月(1 から 12)

w:週番号(0 から 53)

day:日(1 から 31)

hour:時(0 から 23)

minute:分(0 から 60)

 

$args = array(
  'year' => 2020,
  'monthnum' => 12,
);
$my_query = new WP_Query( $args );

 

 

条件設定のパラメータ

紹介した以外にも、たくさんの条件設定ができます。

WordPress公式サイト(こちら)で紹介されていますので、ご自身のサイト設計に使えるものを確認してください。

 

完成版ソースコード

$args = array(
  'category_name'  => 'code',
  'orderby'        => 'date',
  'order'          => 'DESC',
  'posts_per_page' => 3,
);

$my_query = new WP_Query( $args );
<?php
  if ( $my_query->;have_posts()):
    while ( $my_query->;have_posts() ): $my_query->;the_post();
     the_title();
     the_content();
    endwhile;
  endif;
  wp_reset_postdata();
?>

 

 

他にも実案件でよく使うサブクエリを下にまとめました。ぜひご覧ください。

子ページの情報を取得したいとき
【WordPress(ワードプレス)】子ページの情報を取得(post_parent)して表示するサブクエリ|コード公開

続きを見る

 

まとめ

WordPressを勉強中の人が必ずハマる「クエリ」という言葉に対して、少しは距離を縮められたでしょうか。参考書を読むだけでなく、自分のPC上で動かしてみると簡単に理解ができたりもします。ぜひ、実践してみてください。

では、今回の内容をまとめておきます。

  • クエリは、データベースに対して、投稿データ取得の命令を出すもの
  • メインクエリは、URLに基づいてWordPressが自動で発行してくれるもの
  • サブクエリは、自分で条件指定して記事を取得するもの

 

イケゾー
最後まで読んでいただき、ありがとうございました。
ご不明点やご意見は、コメントやTwitterにて、お寄せください 🙂
では、またお会いしましょう

  • この記事を書いた人

ikezooo

愛知県30歳のフリーランスエンジニア。 サイト制作とブログで生き抜く。 ブログでは、月10〜15万ほど稼いでいます。 SEO検定3級保有。

-WordPress