WordPress でトップページだけに何かを出したいとき、is_home() と is_front_page() のどちらを使うかで迷うことがあります。名前は似ていますが、見ているものが違うので、「設定」→「表示設定」の「ホームページの表示」によって結果が変わります。この記事では、設定ごとにどちらが true になるかを表にまとめ、使い分けの例を紹介します。
2 つの関数が見ているもの
is_front_page() は「サイトのトップ(https://example.com/)を開いているか」を見ます。is_home() は「投稿の一覧のページ(ブログのページ)を開いているか」を見ます。トップに投稿の一覧を出している間は 2 つが同じページを指すので違いに気づきにくく、固定ページをトップにしたときに差が出ます。
表示設定ごとの結果
| ホームページの表示 | 開いているページ | is_front_page() |
is_home() |
|---|---|---|---|
| 最新の投稿 | トップ(投稿の一覧) | true | true |
| 固定ページ | トップ(「ホームページ」に選んだ固定ページ) | true | false |
| 固定ページ | 「投稿ページ」に選んだ固定ページ(投稿の一覧) | false | true |
| どちらでも | 記事・ほかの固定ページ・カテゴリーなど | false | false |
「固定ページ」にして「投稿ページ」を選ばなかったときは、投稿の一覧のページそのものがないので、is_home() が true になるページはありません。
使い分けの例
投稿の一覧のページだけに出す:is_home()
ブログの一覧の上にだけ案内を出したいときは is_home() を使います。トップを固定ページにしていても、「投稿ページ」の一覧で動きます。
if (is_home()) {
echo '最新の投稿をチェックしてください!';
}
サイトのトップだけに出す:is_front_page()
キャンペーンの案内など、トップを開いた人だけに見せたいときは is_front_page() を使います。トップが投稿の一覧でも固定ページでも、トップでだけ動きます。
if (is_front_page()) {
echo '特別オファー中!';
}
投稿の一覧に出す投稿タイプを変える:pre_get_posts
一覧に出す投稿そのものを変えるときは、テンプレートで条件分岐するより、pre_get_posts でメインクエリを書きかえるのが確実です。このときは関数の is_home() ではなく、渡されたクエリの $query->is_home() を使い、管理画面とメインクエリ以外には効かないようにします。custom_post_type の所は、表示したい投稿タイプの名前に置きかえてください。
function custom_homepage_query($query) {
if (!is_admin() && $query->is_home() && $query->is_main_query()) {
$query->set('post_type', 'custom_post_type'); // ここで表示したい投稿タイプを指定
}
}
add_action('pre_get_posts', 'custom_homepage_query');
テンプレートの選ばれ方も同じ考え方
テーマのテンプレートも、この 2 つと同じ分け方で選ばれます。トップでは front-page.php があればそれが使われ、投稿の一覧のページでは home.php が使われます。「最新の投稿」の設定でトップに home.php の見た目を使いたいのに front-page.php が出てしまうときは、このしくみが原因です。
まとめ
is_front_page()はサイトのトップ、is_home()は投稿の一覧のページ- 「最新の投稿」の設定ではトップで両方 true、「固定ページ」の設定では別々のページで true になる
- 一覧の中身を変えるときは
pre_get_postsで$query->is_home()とis_main_query()を確かめる - テンプレートは、トップが
front-page.php、投稿の一覧がhome.php


