【WordPress】front-page.phpがあるのに、home.phpやindex.phpがトップページになる?
[ホームページの表示]の設定次第で、front-page.phpはトップページテンプレートの優先順から外れる!
WordPressのトップページのテンプレートとして使用されるファイルは
・front-page.php
・home.php
・index.php
の3つです。
優先順位は上から順に、
front-page.php > home.php > index.php
となり、3つのテンプレートが全てテーマ内に存在する場合は、front-page.phpが表示されます。
ただし、これは
[設定]ー[表示設定]ー[ホームページの表示]
で『最新の投稿』(デフォルト設定)が選ばれている状況のみであり、その下の『固定ページ』を選択した場合は、優先順位が変わってきます。
そしてfront-page.phpは管理画面の[ホームページの表示]設定の影響を受けずに常に優先されると認識していたのですが、[ホームページの表示]の設定次第で
『front-page.phpがあるのに、home.phpやindex.phpがトップページのテンプレートになる』
状況が簡単に作れてしまいます。
検証手順
今回は認識をあらためるべく
■is_front_page()
■is_home()
とういう二つの条件分岐タグの挙動を、
管理画面の[設定]ー[表示設定]ー[ホームページの表示]で
■最新の投稿
■固定ページ ホームページ:であらかじめ作成した固定ページ『サイトフロントページ』を指定
■固定ページ 投稿ページページ:であらかじめ作成した固定ページ『ブログ投稿インデックス』を指定
の3つを設定した場合、
■front-page.php
■home.php
■index.php
の各テンプレートがどのように表示されるのか、優先順はどうなるのかを検証してみました。
条件分岐タグ
is_front_page()、is_home()はどちらも()内に入力できる値(パラメータ)はありません。
二つのタグの違いは
■is_front_page():サイトフロントページに対応する
■is_home():ブログ投稿インデックスに対応する
です。
参考:WordPress Codex 関数リファレンス/is_home
サイトフロントページは『トップページ』、ブログ投稿インデックスは『投稿一覧ページ』と言い換えると理解しやすいと思います。ということはis_home()はトップページとしての判別に使うわけではないようです。
どちらのタグも、現在のページがそのタグの条件に
・合致した場合はtrue
・合致ない場合はfalse
という値を返します。
今回3つのテンプレート(front-page.php、home.php、index.php)には
■trueの場合はそのタグを表示
■falseの場合は何も表示しない
よう以下の記述をしています。
<?php if( is_front_page() ): ?>
is_front_page()
<?php endif; ?>
//is_front_page()がtrueだった場合はis_front_page()を表示
<?php if( is_home() ): ?>
is_home()
<?php endif; ?>
//is_home()がtrueだった場合はis_home()を表示
メインループ
またサイトフロントページ(トップページ)、ブログ投稿インデックス(投稿一覧ページ)にはどういった情報が表示されるのかを確認する為、以下のループを記述しました。
<?php if ( have_posts() ) :
while( have_posts() ) : the_post();?>
<?php echo '<div>'.the_title().'</div>'; ?>
<?php endwhile; endif; ?>
検証環境
WordPress ver 5.3.2
PHP Version 7.1.8
MySQL 5.6.35
検証
テンプレート優先順位は、優先度の高いテンプレートから順に削除して確認しました。
※そのテンプレートが使用されなくなる(優先順から外れる)場合を除いて、各設定におけるテンプレートごとの表示に違いはありませんでした。【表示テンプレート】以外、【メインループ】、【trueになる条件分岐タグ】の表示は同じです。
1.[最新の投稿]を選択した場合(デフォルト設定)
結果
・テンプレートファイル優先順:front-page.php > home.php > index.php
・メインループ:投稿ページのタイトル一覧が表示される
・is_front_page() ○
・is_home() ○
結果、テンプレートファイルの優先順はfront-page.php > home.php > index.phpとなりました。
メインループには投稿のタイトル一覧が表示され、条件分岐タグはis_front_page()、is_home() ともtrueとなりました。このことから、この設定はサイトフロントページ(トップページ)であり、かつブログ投稿インデックス(投稿一覧ページ)であるということが確認できました。
2.[固定ページ][ホームページ]であらかじめ作成した固定ページ『サイトフロントページ』を指定した場合
結果
・テンプレートファイル優先順:front-page.php > page.php > index.php
・メインループ:指定した固定ページ『サイトフロントページ』のタイトルのみ表示される
・is_front_page() ○
・is_home() ×
・is_page() ○
こちらも最優先のテンプレートはfront-page.phpですが、front-page.phpがなかった場合はhome.phpは表示されず、代わりに固定ページを指定している為、page.phpのテンプレートがトップページとして使用されました。
またメインループには指定した固定ページのタイトル『サイトフロントページ』のみ表示され、条件分岐タグはis_home()はfalseとなりました。この設定時にはトップページへの条件分岐としてis_home()は使用できなくなり、home.phpもトップページのテンプレートではなくなります。
代わりにホームページに固定ページを指定しているため、is_page()がtrueとなります。その為、パラメータに固定ページのIDを入力すると、トップページだけの条件分岐タグとして使用することができます。
※指定したページはトップページになる為、指定したページの管理画面を見ると、パーマリンクはトップページのURLになります。またパーマリンクがトップページに変わる前のURLをたたいても、トップページにリダイレクトされます。(ページは重複していません。)
3.[固定ページ][投稿ページ]であらかじめ作成した固定ページ『ブログ投稿インデックス』を指定した場合
この設定がこのコラムタイトルの挙動です。
結果
・テンプレートファイル優先順位:home.php > index.php
・メインループ:投稿ページのタイトル一覧が表示される
・is_front_page() ×
・is_home() ○
この設定を行なった場合、まずfront-page.phpはテンプレートファイルの優先順から外れます。
front-page.phpがあった場合でもトップページのテンプレートではなくなり、テンプレートの優先順位はhome.php > index.phpになります。
またトップページと[投稿ページ]で指定した固定ページ『ブログ投稿インデックス』は、タイトル以外全く同じページとなり、URLが異なる同じページが2つ出来上がってしまいます。2.の設定のようにリダイレクトされません。
2つのページともis_front_page()はトップページへの条件分岐として使用できなくなり、代わりにis_home()がtrueになり、メインループには投稿のタイトル一覧が表示されます。
固定ページ『ブログ投稿インデックス』の情報は固定ページ『ブログ投稿インデックス』のタイトルタグにだけ表示され、他の入力した内容は無視されてしまいます。
これは検証したテンプレートの問題なのかと思ったのですが、マニュアルにも書かれている正しい?挙動でした。
参考:WordPress Codex 管理画面/表示設定
[ホームページの表示]で[固定ページ]を選ぶ場合、[ホームページ]の項目には、
『ここで何も選ばなかった場合、実際には、サイトのフロントページと次項で指定する「投稿ページ」の両方に投稿が表示されることになります。』
と書かれています。
※『フロントページ』は現バージョンWordPress ver 5.3.2では『ホームページ』に変わっています。
結果まとめ
1. 2. 2.+3.の設定のみであれば非常にわかりやすいかったのですが、3.は全く予想がつかない複雑な結果となってしまいました。
結果、
・front-page.php
・home.php
・index.php
上記3ファイルがテーマ内にあった場合、
トップページのテンプレートには、[ホームページの表示]の設定が
■[最新の投稿]の場合:
front-page.phpが使用される
■[固定ページ][ホームページ]のみ指定の場合:
front-page.phpが使用される
■[固定ページ][投稿ページ]のみ指定の場合:
home.phpが使用される、
かつ同じソースの固定ページ(投稿一覧ページ)が表出来上がる
でした。
各テンプレートや条件分岐タグの挙動がよく理解できたと同時に、表示設定は管理画面から非表示にしてしまおうかと思ってしまう検証結果でした・・・