is_front_page と is_home の違い|静的フロントページ設定での判定表

結論

名前から連想される意味と実際の判定は、次のように逆転しやすいので注意してください。

  • is_front_page() は「サイトのトップページ」かどうか
  • is_home() は「ブログ投稿のインデックス(新着記事の一覧ページ)」かどうか

設定>表示設定の「ホームページの表示」が「最新の投稿」のときは、同じページを指すので両方が true になります。「固定ページ」にしてフロントページと投稿ページを別々に指定したときは、フロントページが is_front_page()、投稿ページが is_home() です。トップページを判定したいなら is_front_page() を使います。

原因・仕組み

公式リファレンスでは、次のように説明されています。

  • is_front_page(): サイトのメインURLに表示される内容かどうか。静的ページを設定していればそのページ、「最新の投稿」なら is_home() と同じ動作
  • is_home(): ブログ投稿のインデックスかどうか。show_on_front が posts なら、フロントページと同じになる。page なら、投稿ページ(page_for_posts)のときだけ true

どちらも、クエリが解析された後でないと正しい値を返しません。is_front_page() は wp アクションより前のフックでは、常に false を返します。is_home() も parse_query 以降でなければ false です。

そのため、functions.php の直下や init フックの中で呼ぶと、常に false になって判定が当たりません。判定が必要な処理は、wp アクション以降のフック(wp_enqueue_scripts、template_redirect、wp_head など)に入れます。

手順(サンプルコード)

トップページだけで読み込む

add_action( 'wp_enqueue_scripts', function () {
    if ( is_front_page() ) {
        wp_enqueue_script( 'ks-top', get_theme_file_uri( 'js/top.js' ), array(), '1.0.0', true );
    }
} );

新着記事の一覧ページだけで処理する

add_action( 'wp_head', function () {
    if ( is_home() && ! is_front_page() ) {
        // 固定ページをフロントにして、投稿ページを別に置いている場合の投稿ページ
        echo '<meta name="robots" content="index,follow">' . "n";
    }
} );

テンプレートファイルの対応(テンプレート階層の仕様に基づく説明で、この検証では未確認)

  • front-page.php は、設定に関係なくフロントページで最優先で読まれる
  • home.php は、投稿のインデックスで読まれる
  • 静的フロントページにしている場合、フロントページには front-page.php(なければ固定ページのテンプレート)が使われる

動作確認(検証環境と結果)

WordPress 7.1.2(日本語)、PHP 8.2.12、テーマ twentytwentyfive。設定を変更して、WP_Query を作ってグローバルの $wp_query に差し替え、is_front_page() などの関数を呼びました。検証後に設定は元の値(posts / 0 / 0)に戻しています(testsis-front-page-vs-is-home-difference.md に全文)。

表示設定 状況 is_front_page is_home is_page is_singular
最新の投稿 トップ true true false false
最新の投稿 投稿の個別ページ false false false true
固定ページ フロントページに指定したページ true false true true
固定ページ 投稿ページに指定したページ false true false false
固定ページ その他の固定ページ false false true true
固定ページ 投稿の個別ページ false false false true
固定ページ カテゴリーアーカイブ false false false false(is_archive は true)
固定ページ(投稿ページ未指定) フロントページ true false true true
固定ページ(投稿ページ未指定) 引数なしのトップクエリ false true false false

「投稿ページに指定したページ」で is_page() が false になる点は、直感に反します。投稿ページはブログの一覧として扱われ、固定ページとは判定されません。また、フロントページに静的ページを指定した場合は、is_page() も is_singular() も true です。

is_front_page と is_home の違いの注意点

  • ブログを別ページに置く構成では、is_home() は「トップ」ではなく「ブログ一覧」を指します。トップページの判定に is_home() を使うと、ブログ一覧にだけ処理が当たります。
  • フロントページの2ページ目(/page/2/)は、静的ページの場合 is_front_page() が true のままになるかを、使うテーマで確認してください(この検証では2ページ目を試していません)。
  • 判定をフックの早い段階で行うと、常に false になります。
  • マルチサイトやプラグインでトップを書き換える場合は、サイトURLと現在のURLを比較する方法より、これらの関数を使うほうが安全です。

is_front_page と is_home の違いでよくあるミス

  • is_home() をトップページ判定に使い、表示設定を変えた途端に動かなくなる。
  • functions.php の直下で is_front_page() を呼んで常に false になる。
  • 投稿ページに指定した固定ページで、is_page() が true になると思い込む。
  • front-page.php と home.php の優先順位を取り違える。

is_front_page と is_home の違いのチェックリスト

  • トップページの判定は is_front_page() か。
  • ブログ一覧を判定したいときは is_home() か。
  • 判定を行うフックは、wp アクションより後か。
  • 表示設定の「ホームページの表示」を切り替えて、動作を確認したか。

is_front_page と is_home の違いのFAQ(よくある質問)

Q. 投稿一覧(カテゴリーやタグ)はどちらですか。
A. どちらも false です。カテゴリーは is_category()、アーカイブ全般は is_archive() を使います。

Q. 固定ページのトップを判定するには。
A. is_front_page() で判定します。ページのIDを比較する方法は、ページを差し替えると壊れます。

Q. is_front_page() && is_home() の組み合わせは。
A. 「最新の投稿」設定のトップだけが両方 true になります。

筆者の見解(is_front_page と is_home の違い)

私見では、この2つの関数が混乱を生むのは名前のせいで、用途で覚えるのがよいと考えます。「トップかどうか」は is_front_page()、「新着記事の一覧かどうか」は is_home()、と決めておけば、表示設定が変わっても影響を受けにくくなります。テーマを配布する場合は、両方の設定を切り替えて確認しておくと安全です。

is_front_page と is_home の違いの関連項目

出典(一次情報)

タイトルとURLをコピーしました