WordPressの管理メニュー設定項目の中に「ホームページの表示」という設定がありますよね。

この設定の違いによってどこがどう変わるのか、みなさん理解していますか? 私は長らく曖昧なままでした。

条件分岐タグの挙動テンプレートの優先度メインループの挙動などにかなり違いが出てくるので、WordPress制作者の方は是非これを機に一緒に理解を深めていただけたらなと思います。

ちなみに、「ホームページの表示」設定とは以下のエリアで設定できる項目のことです。フロントページ設定

「ホームページの表示」設定エリア

皆さん見かけたことあると思います。

かなり重要な設定なのに、なんとな〜くの理解しかしていない、そこのあなた。

とりあえずis_home() || is_front_page()って条件分岐してるけどこれもよく分かっていない、そこのあなた。

一緒に勉強していきましょう。笑

目次

「最新の投稿」に設定した場合

デフォルトではこの「最新の投稿」が設定されています。 冒頭の画像の状態ですね。

この設定の場合、トップページでの挙動がどうなるのか。
重要な項目について 以下の表にまとめました。

表示されるテンプレートの優先度 front-page.phphome.php > index.php
Trueを返す条件分岐タグ is_front_page()
is_home()
メインループで呼び出せる対象 最新の投稿一覧
get_queried_object()の情報 null

表だけ見てもよくわからない人もいると思うので、それぞれ説明していきます。

テンプレート優先度について

「最新の投稿」が設定されている時、サイトのトップページ(//example.com)には、front-page.php の内容が最優先で表示されます。

front-page.php がなければ home.phpを、どちらもなければ、index.phpの内容を表示します。

条件分岐タグについて

is_front_page() と is_home() が true を返すようになっています。

アーカイブページのような挙動をしますが、is_archive() は false です。

メインループについて

メインループがどうなっているのかも重要なので 確認してみます。

front-page.php を設置し、以下のようにループを回してみました

if(have_posts()):
  while(have_posts()):the_post();
    the_title();
  endwhile;
endif;

すると、投稿が最新のものから順に表示されます。

ちなみに、表示される投稿数の上限値については今回検証中の「ホームページの表示」設定のすぐ下にある「1ページに表示する最大投稿数 」という設定項目の値で変更可能です。デフォルトでは 10件 です。

get_queried_object()の情報

ページ種別によって取得できる情報オブジェクトが異なる便利なget_queried_object()
この関数で取得できる情報を確認することで、そのページがどういう種類のページとして機能しているかを確認できます。

ですが、トップページで取得できる情報はnullでした。

 

「固定ページ」を設定した場合

固定ページ」を選択すると、好きな固定ページをサイトのトップページとして表示させることが出来ます。

また、「ホームページ」と「投稿ページ」という2種類の項目に対して、それぞれ固定ページを指定することができるようになっています。

なので、

  1. 「ホームページ」にのみ固定ページを指定
  2. 「投稿ページ」にのみ固定ページを指定
  3. どちらにも固定ページを指定

の3パターンについて、それぞれ挙動をまとめていこうと思います。

「ホームページ」だけを設定した場合

フロントページだけを設定

「ホームページの表示」設定の状態

まずは各種挙動を以下にまとめます。

表示されるテンプレートの優先度 front-page.php > page.php* > index.php
Trueを返す条件分岐タグ is_front_page() 
is_page
メインループで呼び出せる対象 指定した固定ページ1件
get_queried_object()の情報 指定した固定ページのWP_Postオブジェクト

テンプレート優先度について

優先度の2番目が home.php ではなく、page.phpとなります。

*この時のpage.phpですが、「ホームページ」に指定されたページの「固定ページテンプレート」がデフォルトの場合です。
別の固定ページテンプレートを指定した場合は、そのテンプレートファイルに置きかわります。(/* Template Name:テンプレート名*/のような記述を入れたファイルのことですね。)

条件分岐タグについて

is_front_page()とis_page() が true を返すようです。

先ほどと違い、is_home() は false になるのもポイントです!

メインループについて

front-page.php を設置し、以下のようにループを回してみました

if(have_posts()):
  while(have_posts()):the_post();
    the_title();
  endwhile;
endif;

すると、指定した固定ページのタイトルだけが表示されました。

通常の固定ページを表示するときのメインループと同じで、その固定ページ1件分だけ取得できるようです。

get_queried_object()の情報

通常の固定ページと同じく、その固定ページに関するWP_Postオブジェクトが取得されました。

固定ページを確認してみると

固定ページの一覧画面を見ると、「ホームページ」に指定したページのタイトルに「- フロントページ」と分かりやすく表示してくれるようになっています。
(なんで「ホームページ」の設定なのにここの表示は「フロントページ」なんだ、というツッコミは置いておきましょう。)

固定ページ一覧を確認

また、編集画面でURLを確認すると、その固定ページのURLトップのドメインと同じものになっていることもわかります。フロントページに指定された固定ページ

「投稿ページ」だけを設定

投稿ページだけを設定

「ホームページの表示」設定の状態

まずは各種挙動を以下にまとめます。

表示されるテンプレートの優先度 home.php > index.php
Trueを返す条件分岐タグ is_home()
メインループで呼び出せる対象 最新の投稿一覧
get_queried_object()の情報 指定した固定ページのWP_Postオブジェクト

テンプレート優先度について

この設定では front-page.php は一切関係なくなりhome.php が最優先となります。

条件分岐タグについて

is_home() のみ true を返すようになります。

固定ページなのに is_page() が false となる点に注意ですね。
(それどころか、is_single() も is_archive() も検証してみましたが、いずれも false でした。)

メインループについて

home.php を設置し、以下のようにループを回してみました

if(have_posts()):
  while(have_posts()):the_post();
    the_title();
  endwhile;
endif;

すると、投稿が最新のものから順に表示されます。

つまり、メインループは「最新の投稿」を設定した時と同じ挙動になるようですね。

get_queried_object()の情報

通常の固定ページと同じく、その固定ページに関するWP_Postオブジェクトが取得されました。

ここだけ通常の固定ページと同じ挙動なんですね。ややこしい....笑

固定ページを確認してみると

一覧を見ると、「ホームページ」に指定したページの名前の横に「- 投稿ページ」と分かりやすく表示されています。

固定ページ一覧を確認

また、編集画面でURLを確認すると、その固定ページのURLがそのまま存在していることがわかります。

固定ページのURL

先ほどの「ホームページ」だけを設定した時と異なりますよね。

試しにこのURLにアクセスして確認してみると、サイトのトップページと全く同じ内容でした。笑

ということは、全く同じページが2ページも存在するということに..。

「投稿ページ」の設定は単体では使うべきでない

のかな?というのが結論。

「ホームページ」と「投稿ページ」の両方を設定

両方を設定「ホームページの表示」設定の状態

この時、サイトのトップページ(//example.com)には、「ホームページ」に指定した固定ページ(テストページA)の情報が渡されます。

そして、「投稿ページ」に設定した「テストページB」(//example.com/test-b/)では、投稿一覧ページとして扱われるようになります。

各ページでの検証項目の挙動は、それぞれ単体で設定した時と同じです。

一応簡単に表にまとめておくと、以下のようになります。

ページA
(「ホームページ」に設定)
ページB
(「投稿ページ」に設定)
表示URL //example.com //example.com/test-b/
テンプレート優先度 front-page.php > page.php > index.php home.php > index.php
条件分岐タグ is_front_page() 
is_page()
is_home()
メインループで呼び出せる対象 指定した固定ページ1件 最新の投稿一覧
get_queried_object()の情報 指定した固定ページの情報
指定した固定ページの情報

なるほど、両方設定してみると、いい具合に両者の役割が分かれていることがわかりますね。

トップページには好きなコンテンツを表示し、最新の投稿一覧は別ページで表示したい。という時に両者の設定を同時に使うと良さそうです。

使用しているテーマがしっかり両者の役割に合うように中身を構築していれば、ですが。

データベースのどこに設定が保存されているのか

最後に、「ホームページの表示」の設定はデータベースのどこに保存されているのかを確認しておきましょう。

wp_optionsテーブル内の以下の3つのフィールドに値が保存されています。

show_on_front(データ型: 文字列)

フロントページに何を表示するかの設定が保存されている。'posts'または'page'の値をとる。

 posts : 最新の投稿が設定されている
 page  : 固定ページ が設定されている

page_on_front(データ型: 整数)

フロントページに表示されるページのIDが保存されている。
show_on_frontフィールドの値が 'posts' の時とページが選択されていない時は、0

page_for_posts(データ型: 整数)

投稿を表示するページの IDが保存されている。
show_on_frontフィールドの値が 'posts' の時とページが選択されていない時は、0

on_なのか for_なのかどっちかに統一すればいいのに... というのは置いといて、

画像でもわかりやすくまとめておきますね。

各設定の保存先

各設定のデータベース保存先フィールド

おわりに

ややこしいというか、やっぱりWordPressは設定の幅が広いんだな〜ということが分かりました。

  • 「最新の投稿」に設定するパターン
  • 「固定ページ」を選択して「ホームページ」だけを指定するパターン

の2パターン がよく使われていると思いますので、この2つの違いだけでも覚えておくといいでしょう。

トップページなのに is_home() が falseになると知った時はびっくりでした。

条件分岐でよくis_home() || is_front_page()のようにしている人が多いのはこのせいでしょう。

逆に、page.php の中で is_home() が trueになるなんてことはあり得ないので、is_front_page() だけで良いんだな、というようなことも分かりました。

- Thank you for reading. -

コメント

コメントする