ワードプレスのクエリとは?メインクエリとサブクエリの違いは?

クエリー解説ページのアイキャッチ

このページにはプロモーションが含まれています

ワードプレスについて調べていると必ず遭遇する「クエリ」という言葉。またテーマ開発のサイトや参考書を見ていても「メインクエリ」や「サブクエリ」という言葉が使われることが多いと思います。

このクエリというのはワードプレスにおいて非常に重要な言葉になります。そしてメインクエリとサブクエリは特にワードプレスのテーマ開発者においては重要なものになります。ワードプレスに関わっていくのであればこれらの言葉をしっかりと理解しておいた方が良いと思います。

このページではそのクエリ・メインクエリ・サブクエリについての解説とクエリの作成 / 発行方法について解説していきたいと思います。

クエリとは

まず最初にイメージがつきやすいようにざっくり言うと、ワードプレスにおけるクエリとは「データベースへの投稿データ取得の要求」のことです。

一般的に「クエリ」とは「問い合わせ」や「条件に合致するデータへの処理の要求」という意味を持ちます。特にデータベース分野でよく使われる言葉です。

また「条件に合致するデータへの処理を要求する」ことを「クエリを発行する」と言います。

ワードプレスでは投稿画面から投稿した記事(投稿データ)はデータベース(MySQL)に格納されます。

投稿データがデータベースに格納される様子

そのデータベースにクエリを発行することで「条件に合致するデータへの処理を要求する」ことが可能です。

基本的にテーマ開発においてクエリを発行して要求するのは投稿データの取得です。ですので、ワードプレス(のテーマ開発)におけるクエリの発行とは、ワードプレスがデータベースに対して条件に合致するデータの取得を要求することと考えて良いです(データを格納するクエリの発行は管理画面側で行われます)。

クエリー発行のイメージ

ワードプレスでは、この条件として「カテゴリ名」「投稿ID」「取得する順番」「取得投稿データ数」などなど様々なものを指定することが可能です。

クエリーを発行して投稿データを取得する様子

取得される投稿データに含まれるデータには例えば下記のようなものがあります。

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

クエリ発行の流れは下記のようになります。

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

前述の通り、ワードプレスではデータベースに投稿内容が保存されていますので、基本的に上記の3ステップを行なって投稿データを取得し、そのデータを利用してページを作成することになります。

ここまでの内容をまとめておきます。

  • ワードプレスにおけるクエリとは「投稿データの取得要求」
  • クエリには条件を指定することが可能
  • クエリを発行することで要求した条件に応じたデータが取得可能
  • ワードプレスではクエリ発行により投稿データを取得し、そのデータを利用してページを作成

メインクエリとは

メインクエリはクエリの一つです。他のクエリと異なる点は下記の3つです。

  • メインクエリはワードプレス によって自動的に作成 / 発行される
  • メインクエリは URL に基づいて作成される
  • メインクエリはワードプレス起動直後に発行される

スポンサーリンク

メインクエリはワードプレス によって自動的に作成 / 発行される

基本的にワードプレスでは必要に応じてクエリ作成 / 発行するプログラムを自分で作成して投稿データを取得する必要があります。

しかしメインクエリの場合は別で、メインクエリはワードプレス本体によって自動的に作成され、自動的に発行されます。

ですので、テーマ作成者などはメインクエリを作成する必要はありません(後述するサブクエリは必要に応じて作成する必要があります)。

メインクエリは URL に基づいて作成される

ではメインクエリとはどのような要求なのでしょうか?

メインクエリは、ユーザーが表示を要求した URL のページ作成に必要な投稿データを取得する要求になります。

例えば URL が投稿ページを表示するものであれば、その投稿ページを表示するために必要な投稿データの取得を要求するメインクエリが作成されます。イメージとしては投稿 IDを1つ指定し、その投稿データを取得するクエリを作成する感じです。

メインクエリーの発行のイメージ

このメインクエリが発行されれば、URL に対応する投稿ページ1つ分の投稿データが取得されます。

また URL がカテゴリーページを表示するものである場合は、メインクエリはそのカテゴリーに属する複数の投稿ページの投稿 ID を指定し、それらの投稿データを取得するクエリとなります。

カテゴリーページ表示のためのメインクエリーの発行のイメージ

このメインクエリが発行されれば、URL に対応するカテゴリに属する複数の投稿の投稿データが取得されます。

ページのメインの部分はこのメインクエリ発行で取得された投稿データを用いて作成されていることが多いです。

メインクエリはワードプレス起動直後に発行される

メインクエリはワードプレス起動直後に発行されます。発行するのは前述の通りワードプレス本体です。

そのため single.php や archive.php などのテーマのテンプレートファイルが実行される時点で投稿データの取得が完了しています。

ですので、テンプレートファイルではクエリーを発行することなく、すでに取得された投稿データを利用してページを生成することが可能です。

スポンサーリンク

サブクエリとは

サブクエリとはメインクエリ以外のクエリ全てのことを言います。

新たに投稿データを取得するための要求

メインクエリは URL に基づいて作成されるため、メインクエリはその URL のページの表示に必要な最低限の投稿データのみを取得するクエリとなります。ですのでメインクエリが発行されてもそれ以外の投稿データは取得されません。

ページを作成するために他の投稿データを利用したい場合は、サブクエリを発行して別途投稿データを取得する必要があります。

サブクエリの使用例

サブクエリの使い所の分かりやすい例は、投稿ページのサイドバーに表示するカテゴリの記事一覧だと思います。

サブクエリーの使用例

URL 自体は投稿ページのものなので、投稿ページを表示するのに必要な投稿データのみがメインクエリ発行により取得されます。しかし、カテゴリに属する他の投稿の投稿データは取得されません。

したがって、カテゴリの記事一覧を表示しようと思っても、メインクエリ発行で取得した投稿データのみでは表示することができません。

投稿データが足りない様子

こんなときに利用するのがサブクエリです。サブクエリを発行することにより、メインクエリで取得されていない投稿データを別途取得することが可能です。

カテゴリ記事一覧を表示するのであれば、そのカテゴリに属する投稿を取得するようなサブクエリを作成します。そしてそのサブクエリを発行して投稿データを取得すれば、サイドバーのカテゴリーの記事一覧をサブクエリで取得した投稿データを用いて作成することができます。

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

ページにいろんな情報を表示すればするほどサブクエリが活躍します。サブクエリがどんなものであるかはしっかり覚えておきましょう!

スポンサーリンク

クエリの作成・発行方法

サブクエリはメインクエリと違ってテーマ内(プラグイン内)で自分でプログラムを書いてクエリの作成・発行を行う必要があります。そのクエリの作成・発行方法をここから解説していきたいと思います。

クエリの作成・発行

クエリの作成・発行は WP_Query クラスのインスタンスを作成することで同時に実行することが可能です。

WP_Query クラスのインスタンスを作成するプログラムは下記の通りです。

$my_query = new WP_Query( $args );

このプログラムで WP_Query クラスのインスタンスを作成すれば、引数の $args で指定する条件に応じてクエリの作成と発行が行われます

クエリが発行されると、その応答として作成したインスタンスに、クエリ発行により取得された投稿データが格納され、さらに左辺に記述した変数($my_query)がその投稿データが格納されたインスタンスを参照することになります。

WP_Queryインスタンスの作成の詳細

これにより、$my_query から取得した投稿データを使用することが可能になります。$my_query が参照している投稿データを1つずつ取得して内容を表示するためには、下記のようなループ処理を行えば良いです。

while ( $my_query->have_posts() ) {
	$my_query->the_post();
	/* the_post で取得した投稿データを表示 */
}
wp_reset_postdata();

このループはサブクエリで取得したデータに対するループなのでサブループと呼ばれます。ちなみにメインクエリで取得したデータに対するループはメインループと呼ばれます。

最後の wp_reset_postdata 関数はメインループに影響を及ぼさないようにするために実行する関数です。サブループを利用した後は必ず wp_reset_post 関数を実行するようにしましょう。

ちなみにですが、実際のデータベースに発行されるクエリは下記のようなものになります。

SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.ID = 7 AND wp_posts.post_type = 'page'  ORDER BY wp_posts.post_modified ASC

いわゆる SQL 文というものです。SQL に詳しい方にとっては馴染みがあるかもしれませんが、私は SQL 詳しくないので何をやってるかほとんど分かりません…。

ですが、ワードプレスでは条件設定さえすれば WP_Query が SQL 文のクエリを作成してデータを取得してくれますので SQL に詳しくなくてもワードプレスを使いこなしたりテーマ開発したりすることが可能です。

クエリの条件設定

クエリの条件設定は WP_Query() の引数で指定することができます。

条件設定の基本的な書き方は下記のようになります。

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

つまり、パラメータ名とその設定値を条件として格納することで、クエリの条件を設定します。

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

条件を指定してクエリーの発行が行われる様子

例えば下記のように配列を作成したとします。

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

この配列 $args は下記の条件設定された配列となります。

  • カテゴリのスラッグ名: “WordPress”
  • 並び替える項目:投稿日時
  • データの並び順:降順
  • 取得投稿件数:3件

この配列 $args を WP_Query() の引数とすることで、上記条件に合致した投稿データが取得されることになります。

まさに最初に図示したクエリの発行ですね。

クエリーを発行して投稿データを取得する様子

条件を上手く設定することでさまざまな投稿データを取得でき、これによりいろんな構成のウェブサイトを作成することが可能になります。

スポンサーリンク

条件設定の例

その条件として実際にどのようなものが設定することができるかを解説していきます。

ここでは条件設定の例をいくつか紹介したいと思います。

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

特定のカテゴリのみの投稿データを取得するためには、下記のようなパラメータ名を用いて条件を設定します。

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

cat:カテゴリ ID を指定

下記のようにプログラムを組めば、スラッグが “programinng” のカテゴリに属する投稿の投稿データを取得することができます。

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

‘category_name’ に指定するのはカテゴリ名ではなくスラッグであるという点に注意です。

get_the_category 関数を使用してカテゴリ情報を取得する場合、その結果の “caregory_nicename” メンバの文字列を指定します(”cat_name” ではありません) 。

$pid      = get_the_ID();
$category = get_the_category( $pid );
$args     = array(
	'category_name' => $category[0]->category_nicename,
);
$my_query = new WP_Query( $args );

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

下記のパラメータを指定することで特定の日時に投稿された投稿データを要求することができます。

year:西暦の年

monthnum:月(1 から 12)

w:週番号(0 から 53)

day:日(1 から 31)

hour:時(0 から 23)

minute:分(0 から 60)

下記のようにプログラムを組めば、2019年6月に投稿された投稿の投稿データをを取得することができます。

$args = array(
	'year' => 2019,
	'monthnum' => 6,
);
$my_query = new WP_Query( $args );

コメントのある投稿データを取得する

コメント数に関する条件も設定可能です。コメントに関するパラメータ名としては下記があります。

comment_count:コメント数

また comment_count は配列として使用することができ、 value に対して指定した比較演算子による比較で真となる投稿の投稿データが取得されます。

comment_count

->value:コメント数

->compare:比較演算子

例えばコメントのある投稿のみを取得するためには下記のようにプログラムを組みます。

$args      = array(
	'comment_count' => array(
		'value'   => 0,
		'compare' => '>',
	),
);
$sub_query = new WP_Query( $args );

設定できるパラメータ名

このように様々なパラメータ名を使用し、様々な条件設定を行うことが可能です。

配列に与えられるパラメータ名には非常に多くのものが存在します。

全てのパラメータ名は下記のページで紹介されていますので、他のパラメータ名について知りたい方はこちらを参考にしていただければと思います。

https://wpdocs.osdn.jp/関数リファレンス/WP_Query#.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF

まとめ

このページではクエリとメインクエリ・サブクエリの違い・クエリの作成方法について解説しました。

ワードプレスは投稿されたデータはデータベースに格納されています。データベースにデータ取得を要求するのがクエリですので、このクエリは特にワードプレスのテーマ開発者にとっては重要な概念となります。

しっかり理解しておくと今後テーマ開発をしていくにあたって必ず役に立つ知識になりますので、ぜひこのページでクエリについて理解していただければと思います。

4 COMMENTS

ヒロ

むちゃくちゃわかりやすかったです!
素晴らしい記事をありがとうございます!

返信する
daeu

ヒロさん

コメントありがとうございます!

そう言っていただけると大変嬉しいです。
今後も出来るだけ有益な情報を分かりやすく発信していきたいと思いますので、
よろしければまた見ていただけると幸いです!

返信する
Yamaimo

非常に分かりやすくて助かりました。
頭の中のモヤが晴れました。ありがとうございました。

返信する
daeu

Yamaimo さん

コメントありがとうございます!
「頭のモヤが晴れた」のコメントはは素直に嬉しいです!

これからも「頭のモヤが晴れる」・「謎が解決して頭がスッキリする」記事を書いていきたいと思いますので、
今後ともよろしくお願いいたします!

返信する

Yamaimo へ返信する コメントをキャンセル

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