メインクエリとサブクエリにwp_queryを駆使する(記事出力の入れ子)

メインクエリとサブクエリにwp_queryを駆使する(記事出力の入れ子)

メインクエリとサブクエリにwp_queryを駆使する(記事出力の入れ子)

Wordpressのデータ出力にはWordpress側が自動で実行するメインクエリと、管理者側が任意に実行するサブクエリとがあります。

メインクエリによるデータの流れ(メインループ)以外は、独立していても入れ子になっていても全てサブクエリ(サブループ)となります。

サブクエリ実行にはWP_Queryが便利です。様々な条件を指定・抽出してデータを表示する事ができます。入れ子の場合はwp_reset_postdataを入れてメインクエリに干渉しない様にしましょう。

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

Wordpressは、データベースやサーバー上の画像やファイルからデータを取得してWEBページを構成するシステムです。

どんな時も常に条件に一致するデータを要求・取得している訳ですね。

この「条件に一致するデータをデータベースへ要求する事」クエリと呼びます。

一致させる条件として「カテゴリ名」「投稿ID」「取得順」「取得データ数」など様々なものを指定することができます。

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

クエリには、Wordpressが自動的に行っているメインクエリと、管理者が任意に取得要求するサブクエリとがあります。

・メインクエリ
・サブクエリ

Wordpress側がメインクエリを実行しつつ、その流れの中で管理者によってサブクエリが実行される場合がほとんどです。

Wordpessでデータ表示を駆使するため、常にメインクエリとサブクエリが同時実行されているのですね。

入れ子状態になっている場合がほとんど

メインクエリとサブクエリは同時並行ではなく、メインクエリ実行中にサブクエリが実行される場合が多いです。

つまりメインクエリ実行中の「入れ子」として、サブクエリが動く訳ですね。

メインクエリの流れをさえぎる事なく、各箇所でスムーズな情報取得がされる必要があります。

本記事ではWordpressにおけるこのクエリ(メインクエリ・サブクエリ)について解説をしたいと思います。

メインクエリとは

メインクエリとは、Wordpressによって自動的に作成・発行されるクエリの事を指します。

Wordpressシステム実行時に実施される

Wordpressではページが出力されると同時に、必要データ取得のクエリが実行されます。

例えば下の画像は、page.phpとsingle.phpファイルの上部記述です。

テーマファイル上部の出力記述

同じ記述なのにpage.phpでは固定ページ、single.phpでは投稿ページが表示されます。

特に取得データの種類などの指定はしていません。

それにもかかわらず正常にデータを表示できるのは、Wordpressによりメインクエリが自動実行されているためです。

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

メインクエリは、ユーザーが表示を要求したページURLに応じて必要なデータを取得します。

例えばそのURLが投稿記事を表示するものなら、投稿記事データを自動的に取得します。

記事の一覧を表示するものなら、一覧データを自動取得する事になりますね。

URLが固定ページを表示するものなら、固定ページデータを自動的に取得します。

テーマファイルの種類により出力データの種類が変わる

URLが投稿記事…single.php
URLが記事一覧…archive.php
URLが固定ページ…page.php

表示URLによって使用されるファイルが変わり、それに応じてWordpressが実行するクエリも変わります。

この様にメインクエリは、Wordpressによって自動で基本データを取得する様になっています。

サブクエリとは

それに対しサブクエリとは、メインクエリ以外の全てクエリのことを指します。

メインクエリは、そのURLのページの表示に必要な基本データを取得するものでした。

逆に言えば、それ以外のデータは取得されないのですね。

ですので必要に応じてサブクエリを実行し、自分が望むデータを別途取得する必要があります。

つまり自分が任意に出力するデータは全て「サブクエリ」です。

カテゴリ記事一覧や最新記事

一番分かりやすいのは、ページの右袖(左袖)に表示するカテゴリ記事一覧や最新記事一覧などでしょう。

投稿ページでも固定ページでも、表示に必要なデータはメインクエリとして自動取得しています。

しかしカテゴリ一覧や最新記事データとなると、メインクエリだけでは取得できません。

メインクエリとサブクエリの関係

例えば固定ページの表示中に、投稿記事の最新情報10件を表示する場合があります。

固定ページを出力…メインクエリ
最新投稿記事10件の表示…サブクエリ

サブクエリを実行すれば、メインクエリの実行中に違うジャンルのデータを取得・表示する事ができるのです。

メインループとサブループ

メインクエリ中に任意に取得表示したデータは、サブクエリにより出力されます。

このサブクエリによって出力されるデータ出力の流れを「サブループ」と呼びます。

それに対し、メインクエリで取得したデータの流れは「メインループ」と呼ばれます。

両者はそれぞれ独立して実行される場合もありますし、メインループ中にサブループが実施される場合もあります。

メインループとサブループの関係

独立している場合

メインループとサブループが独立した状態

メインループ以外に別のループを作った場合、それがメインループに干渉していなくても全てサブクエリになります。

入れ子の場合

メインループ中にサブループが実施される状態を「入れ子」と呼びます。

親となるループの流れを止めない様に、サブクエリのループを利用する必要があります。

メインループとサブループの入れ子関係の図

この様にメインループの実行中に、別のサブクエリを実行するケースがたくさん出てきます。

サブクエリの作成・発行方法

サブクエリはメインクエリと違って、テーマ内(プラグイン内)で自分でデータ取得・出力コードを書きます。

クエリの作成・発行には「WP_Query」インスタンスを使う事がほとんどです。

WP_Queryを使えば、メインクエリの入れ子としてサブクエリ実行することが可能です。

WP_QueryのPHPコード例

何よりもまずは、サブクエリのコード例をみてもらいましょう。

<?php $args = array( 'category_name' => 'blog', 'orderby' => 'date', 'order' => 'DESC', 'posts_per_page' => 10, ); ?> <?php $query = new WP_Query( $args ); ?> <?php if( $query->have_posts() ) : ?> <?php while ( $query->have_posts() ) : $query->the_post(); ?> //ループ出力部分 <h2><?php the_title(); ?></h2> <p><?php the_content(); ?></p> <?php endwhile; wp_reset_postdata(); ?> <?php else : ?> //該当記事が無い場合 <p>記事がありません。</p> <?php endif; ?>

クエリの条件設定

クエリの条件設定には、引数($args)を使って細かく指定できます。

パラメータ名と設定値を複数入れる事で、取得する情報を抽出・加工する事ができる訳ですね。

条件設定の項目と値

$args = array( 'category_name' => 'blog', //カテゴリのスラッグ名 'orderby' => 'date', //並び替える項目(日時) 'order' => 'DESC', //データの並び順(降順) 'posts_per_page' => 10, //取得件数(10件) );

category_nameに指定する値は、カテゴリの実名ではなく「スラッグ」を入れる点に注意して下さい。

この様に条件を上手く設定する事で、様々なデータを取得する事ができます。

WP_Queryインスタンス

WP_Queryでは投稿の情報を持ったインスタンスを生成するところから始まります。

if( $query->have_posts() )の部分で、表示する投稿データがあるかどうかチェックします。

投稿が存在する場合は、the_post()でループ出力を実行する事になります。

これによりthe_title();やthe_content();で、タイトルや内容の表示ができる様になります。

wp_reset_postdataは必須

endwhileのところにあるwp_reset_postdata関数は、メインループに影響を及ぼさないようにするために実行する関数です。

これを記述しないとメインループの影響を受けてしまい、正常なデータが表示できなくなります。

「入れ子」でも正常に情報を取得するため、必ずwp_reset_postを書く様にしましょう。

サブクエリのphpファイルを設置する

この様なメインループでのサブループ表示は、WEBページ上の随所に出てくるはずです。

テーマファイルのヘッダー・フッター部分の様に、何度もこのサブクエリを実行する事になるでしょう。

サブクエリを専用phpに分ける

その場合、single.php・page.php・archive.phpのファイル上にいちいちこのサブクエリを書くのはナンセンスです。

いざ表示の仕方(array内の条件設定)が変わった時に、全ての部分を変更する必要が出てきますしね。

そうならなくて済む様に、サブクエリは専用のphpパーツに分けておくべきです。

list.phpの読込

例えばカテゴリ一覧の記事を表示するサブクエリを、「list.php」に記述するとしましょう。

このlist.phpを、他のテンプレートファイル上で読込めばよい訳ですね。

get_list.phpは使えない

この時header.phpやfooter.phpの様に、以下の様に書く事を思いつくのではないでしょうか。

<?php get_header(); ?> <?php get_footer(); ?>

上記と同じルールなら、以下の様になりますね。

<?php get_list(); ?>

ところがこの様に書いても表示はされません。

これはheaderやfooter・sidebarに有効な書き方で、オリジナルのphpファイルを読み込む事はできないのです。

読込にはget_template_part()を使う

ではどう描くのかというと、以下の様に記述します。

<?php get_template_part('list');?>

テーマファイル上にget_template_part('');を記述する事で、phpファイルを読み込めます。

サブクエリファイルは別階層に

上記の場合、テーマテンプレートファイルの構成上single.phpやpage.phpと同じ位置にlist.phpがありますね。

階層を別にしたいのであれば、別途template/ディレクトリを作ってそこにlist.phpを移します。

その上で以下の様にパスを指定すればOKです。

<?php get_template_part('template/list');?>

この様にしておけば、メインクエリのテーマファイルとサブクエリのファイルとを分けて管理しやすくなります。

まとめ

以上、Wordpressのメインクエリとサブクエリについて解説しました。

Wordpressにおいてデータベースにデータ取得を要求するクエリは、サイト管理者・テーマ開発者にとって重要な概念です。

しっかり理解しておけば、今後のカスタマイズに必ず役に立つ事でしょう。

この記事をシェアする

一押し人気コーナー紹介

Wordpressテーマカスタマイズ系記事