WordPressテーマを眺めていると、どのテーマにも「if ( have_posts() ) : while ( have_posts() ) : the_post();」~「endwhile;」という記述があります。
これは、WordPressの「メインループ」と言われるものです。
その仕組みを少し調べて、ざっくりと理解してみます。
なお、今回のバージョンは以下です。
- WordPress 4.2.2
WordPressの仕組み
WordPressは、以下のようにリクエストされたURLによって、どのデータ・ページを表示するのかを判断します。
※パーマリンク設定「デフォルト」の場合
- 「http://test.com/」…トップページ
- 「http://test.com/?cat=1」…カテゴリーID「1」
- 「http://test.com/?p=2」…ID「2」の投稿
- 「http://text.com/?page_id=3」…ID「3」の固定ページ
そして、それぞれURLへのリクエストによって取得されるデータを「メインクエリ」(WordPressクエリ)と呼びます。
取得したデータは、「$wp_query」オブジェクトに保存されます。
メインループ
「$wp_query」オブジェクトに保存されたデータを取得・表示するためのループが、「メインループ」です。
メインループの構文
メインループの構文は、以下のようになります。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php endwhile; else: ?> <p>記事がありません。</p> <?php endif; ?>
「:」を使用しないPHP構文で記述した場合は、以下のようになります。
<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); } // end while } else { ?> <p>記事がありません。</p> <?php } // end if ?>
「have_posts」、「the_post」
このメインループで出てくるものは、以下の2つ。
- 「have_posts」…「$wp_query」に表示させるデータがあるかチェック
- 「the_post」…「$wp_query」から順にデータを取り出して「$post」へ格納し、次のデータへと進める
まず始めのif文の条件「have_posts()」で、「$wp_query」に表示させるデータがあるかチェックし、次のwhile文の繰り返し条件に「have_posts()」を使用することで、表示させるデータがある場合はループし続けます。
次に、ループの先頭で「the_post()」によって、「$wp_query」からデータを1件取り出して「$post」へ格納し、「$wp_query」のデータを次へと進めます。
後は繰り返しで、再びループの先頭で「the_post()」によって、次のデータを取り出してという流れで、最後まで取得・表示させるというわけです。
なるほど、それでこのような記述になるわけですね。
メインループの中で使用するテンプレートタグ
メインループの説明は上記の通りで、取得したデータのタイトルや内容を表示したければ、そのメインループの中に出力させる処理を書けばいいんですね。
例えば、タイトルや内容を出力するなら、このような感じです。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h1><?php the_title(); ?></h1> <p><?php the_content(); ?></p> <?php endwhile; else: ?> <p>記事がありません。</p> <?php endif; ?>
ここでは、以下の2つを使用しました。
- 「the_title」…現在の投稿のタイトルの表示
- 「the_content」…現在の投稿の本文を表示
これら2つは、メインループの中での使用が前提となっているテンプレートタグです。
他にも、多くのテンプレートタグがあり、以下は代表的なものです。
- 「the_date」…現在の投稿の投稿/更新日を表示
- 「the_permalink」…現在の投稿のパーマリンクのURLを表示
- 「the_author」…現在の投稿の作成者名を表示
- 「the_category」…現在の投稿が属するカテゴリーへのリンクを表示
- 「the_tags」…現在の投稿に付けられたタグへのリンクを表示
- 「the_excerpt」…現在の投稿の抜粋を、文末に[…]をつけて表示
メインループの中で使用するかどうかを判断するには、WordPress Codexを参照しましょう。
説明の中に「このタグはループ内でのみ使えます。」といった記載があります。
これらのテンプレートタグは、メインループの外では思ったとおりの結果が得られない可能性があります。
なので、WordPressテーマファイルを修正・作成する場合は、その箇所がメインループの中なのかどうか、テンプレートタグを調べる場合は、メインループの中で使用するのかどうかを意識しておきましょう。
WordPressのメインループについては、以上です。
WordPressの理解が少し深まりました。
コメント
教えてください。
メインループは、どこから見られますか?
初心者です。
解説宜しくお願い致します。
>SAKURAさん
見られるというのは、ソースコードのことでしょうか?
でしたら、試用しているテンプレート内のsingle.phpやpage.phpに記述があると思いますよ。(テンプレートによって異なる)
管理画面から確認するには、外観⇒テーマの編集です。