WordPress でトップページだけに何かを出したいとき、is_home() と is_front_page() のどちらを使うかで迷うことがあります。名前は似ていますが、見ているものが違うので、「設定」→「表示設定」の「ホームページの表示」によって結果が変わります。この記事では、設定ごとにどちらが true になるかを表にまとめ、使い分けの例を紹介します。
2 つの関数が見ているもの
is_front_page() は「サイトのトップ(https://example.com/)を開いているか」を見ます。is_home() は「投稿の一覧のページ(ブログのページ)を開いているか」を見ます。トップに投稿の一覧を出している間は 2 つが同じページを指すので違いに気づきにくく、固定ページをトップにしたときに差が出ます。
表示設定ごとの結果
| ホームページの表示 | 開いているページ / is_front_page() / is_home() |
|---|---|
| 最新の投稿 | 開いているページ:トップ(投稿の一覧)is_front_page():trueis_home():true |
| 固定ページ | 開いているページ:トップ(「ホームページ」に選んだ固定ページ)is_front_page():trueis_home():false |
| 固定ページ | 開いているページ:「投稿ページ」に選んだ固定ページ(投稿の一覧)is_front_page():falseis_home():true |
| どちらでも | 開いているページ:記事・ほかの固定ページ・カテゴリーなどis_front_page():falseis_home():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_home() を使っている所を探し、「ホームページの表示」を「固定ページ」に変えたときに、トップで動かなくなる処理がないかを見ます。見つかったら、トップで出したいものは is_front_page() に書きかえます。

