メインループの基礎
メインループとは、URLから自動で生成されるWP_Queryオブジェクト(メインクエリ)を利用したWordPressループのことです。
- URLをもとに、WP_Queryオブジェクトが自動生成される。
- グローバル変数$wp_queryに自動的に代入されている
- the_titleなどの関数は$wp_queryに格納されているWP_Queryオブジェクトを参照している
といった特徴を持つため、結果として「裏でWP_Queryオブジェクトが利用されている」ということが全く表に出てこないのが特徴です。そのため、
- クラスやオブジェクトに全く触れずにテンプレートファイルを作成できる
というのが特徴です。
メインクエリ
メインクエリとはURLから自動で生成されるWP_Queryオブジェクトのことです。以下のコードでメインクエリについて確認して見ましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>zero</h1>
<pre><?php var_dump($wp_query); ?></pre>
</body>
</html>
$wp_queryについて何も定義していなくても自動的にWP_Queryのオブジェクトが格納されていることが確認できます。
以下のようにして、実行されているSQLも確認して見ましょう。
<pre><?php var_dump($wp_query->request); ?></pre>
さらに、urlを
[wordpressのアドレス]?author=1
に変更して、送信したクエリ文字列によって実行されるSQLが 変化することも確認しておきましょう。 (WP_Queryのコンストラクタに渡すことができる文字列であればなんでも入力可能です。)
メインループ
メインクエリを利用したWordPressループがメインループです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>zero</h1>
<?php while(have_posts() === true){ ?>
<?php the_post(); //1件記事を取得($postに代入) ?>
<!-- $postの内容を確認 -->
<pre><?php var_dump($post); ?></pre>
<!-- タイトルと本文を出力 -->
<h2><?php the_title(); //$post->titleを出力する関数 ?></h2>
<p><?php the_content(); //$post->contentを出力する関数 ?></p>
<?php } ?>
</body>
</html>
一切オブジェクトの生成やメソッドの呼び出しが表れていないところに注目しておきましょう。そのため、WordPressは
- オブジェクト指向を知らない人でもテンプレートを作成できる
- オブジェクト指向を理解していると、より高度なカスタマイズが可能
である、と言えるでしょう。
have_posts 関数(メソッドではありません)
have_posts 関数はメインクエリに取得できる投稿が残っているかどうかをtrue, falseで返す関数です。$wp_query->have_posts メソッドの結果を返します。 ($query->have_posts() ではないことを確認しておきましょう。)今回のループではwhileを利用して、投稿が残っている間、記事の出力を繰り返しています。
the_post 関数
グローバル変数の$postにメインクエリの次の投稿を代入する関数です。(単に$wp_query->the_post() を実行するだけの関数です。)投稿内容の出力をするための準備にあたります。
the_title 関数
$postに投稿データが格納されていることを条件に、投稿のタイトル($post->title)を出力する関数です。(前項のWP_Queryを利用したループ処理の時と全く同じです)
the_content 関数
$postに投稿データが格納されていることを条件に、投稿の本文($post->content)を出力する関数です。(前項のWP_Queryを利用したループ処理の時と全く同じです)
$wp_queryを利用しており、メソッドの代わりに関数が使われますが、それ以外は通常のWordPressループと変わりありません。
デフォルトのクエリを書き換えたいとき
メインクエリについて、並び順や表示される投稿タイプを変更したい場合があります。この場合、pre_get_postsアクションフックを利用することになります。詳しくはアクションフックの項で解説を行います。