[WP Theme Dev] Twenty Seventeen の front-page.php が表示されない

動作確認のため手元でチャイルドテーマを作成していて気づきました。

どうやら、ダッシュボードの設定>表示設定>ホームページの表示 で、それぞれ以下の設定を行うと該当するテンプレートが読み込まれる振る舞いになっています。

  • 最新の投稿 … index.php
  • 固定ページ … front-page.php

今まで front-page.php が存在すると、常に index.php よりも優先するものと認識していました。

テンプレート階層
1. front-page.php
3. home.php
3. index.php

ホームページ表示
サイトフロントページ、または固定ページの上にあるブログ投稿インデックスページの表示に使用されるテンプレートファイル。注意: サイトフロントページ上にある場合、フロントページテンプレートは、ブログ投稿インデックス (ホーム) テンプレートに優先します。
1. home.php
2. index.php

フロントページ表示
サイトフロントページの表示に使用されるテンプレートファイル。フロントページはブログ投稿インデックス、または固定ページを表示します。フロントページテンプレートは、ブログ投稿インデックス (ホーム) テンプレートに優先します。

  1. front-page.php – 管理 > 設定 > 表示設定 セクションで「フロントページの表示」が「最新の投稿」または「固定ページ」どちらになっている場合でも使われる。
  2. 固定ページ表示ルール – 管理 > 設定 > 表示設定 セクションの「フロントページの表示」で、「フロントページ」が設定されている場合
  3. ホームページ表示ルール – 管理 > 設定 > 表示設定 セクションの「フロントページの表示」で、「投稿ページ」が設定されている場合

テンプレート階層 – WordPress Codex 日本語版

が、どうやら違う様子。

functions.php を調べてみると add_filter している箇所がありました。

functions.php
/**
 * Use front-page.php when Front page displays is set to a static page.
 *
 * @since Twenty Seventeen 1.0
 *
 * @param string $template front-page.php.
 *
 * @return string The template to be used: blank if is_home() is true (defaults to index.php), else $template.
 */
function twentyseventeen_front_page_template( $template ) {
    return is_home() ? '' : $template;
}
add_filter( 'frontpage_template',  'twentyseventeen_front_page_template' );

同じような疑問を持った方がいらっしゃいました。
テーマの設計次第で、振る舞いをかえられるようです。

これは、通常のテンプレート階層の動作をフィルターフックを使って 適用されるテンプレートを変更しています。is_home()ならば、index.phpを適用、そうでなければ、テンプレート階層のfront-page.phpを使うという風に、テンプレート階層の動作を変更しているのです。

トピック: twentyseventeenのfront-page.phpが表示されない « サポートフォーラム — WordPress

深いところまで調べていませんが、そうなっていたという memo.

補遺