結論
名前から連想される意味と実際の判定は、次のように逆転しやすいので注意してください。
- 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 の違いの関連項目
- is_front_page() の使い方|説明・引数・注意点
- is_home() の使い方|説明・引数・注意点
- is_singular() の使い方|説明・引数・注意点
- is_page() の使い方|説明・引数・注意点
- カスタム投稿タイプの条件分岐
