WordPress
更新日 : 2022年5月13日
投稿日 : 2019年9月4日

is_home(), is_front_page(), is_single()の違い

is_home(), is_front_page(), is_single()の違いの画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして8年~の経験があります。

WordPressのテーマをごそごそしていると、トップページだけ云々したい、というときがあります。

トップページかどうかを判定するのに使うタグは「is_front_page()」が多いと思います。

ではis_home()は何のために使うの?というところに迫りたいと思います。

is_front_page()について

英語の名称が既に言っているように、「フロントページかどうか」を判定します。

その結果、表示しているページがトップページであればtrue、そうでなければfalseを返します。

分岐で使いますね。

if(is_front_page()) {
    // トップページだけやりたい処理を記述
}

if(!is_front_page()) {
    // トップページ以外でやりたい処理を記述
}

is_home()について

こちらも英文からすると「ホームかどうか」を見ています。一見するとis_front_page()と同じ動作をすると思われがち…ですが、実際は違います。

is_home()は「ブログ投稿のトップページかどうか」を見ています。

WordPressでは、表示設定からトップページに「ブログの最新投稿」を表示することができます。

しかし、「トップページに最新の投稿を表示する」設定でis_front_page()でトップページかどうかの判定をさせようとすると、「トップページなのにis_front_page()で判定が無視されている!」となります。

これはis_home()自体が過去の遺物であり、先にあったもので、その後にis_front_page()が追加されたために起きたもののようです。

ちゃんと関数リファレンスにありますね。

参考:関数リファレンス/is_home-WordPress

両者の罠

is_home()は「トップページがブログ投稿インデックスかどうか(トップページに最新の投稿を表示する)を判定する」

is_front_page()は「トップページが静的ページ(固定ページ)かどうかを判定する」

と言い換えられます。

例えば「ブログの最新投稿を表示する」にしているときは以下の動きになります。

if(is_front_page()) {
    // トップページだと判断されないので、実行されない
}

if(!is_front_page()) {
    // ブログ投稿インデックスなので、実行されない
}

…お気づきでしょうか。

そう、ここがまさに「ブログの最新投稿を表示する」に設定しているときに起きる落とし穴です。

「ブログの最新投稿を表示」しているかどうか、というのはis_home()でしか判定できません。is_front_page()では判定できないのです!

そのため、「トップページが固定ページ表示でも、ブログの最新投稿を表示でも、どちらでも処理をしたいよ」というときは以下のように書く必要があります。

if(is_front_page() || is_home()) {
    // トップページに固定ページ表示、ブログの最新投稿を表示で処理
}

if(!is_front_page() || is_home()) {
    // トップページがブログの最新投稿表示のときのみで、かつ固定のトップページ以外で実行
}

if(is_home()) {
    // トップページがブログ最新投稿のときのみ実行
}

WordPressの中で「ブログの最新投稿を表示」というのはそれだけで固有の状態と言えますね。

is_signle()でもis_page()でもなく、更にis_front_page()でもない…is_home()でしか判定されません。

使いどころ

「トップページには記事タイトルと日付を表示したくないけれど、トップページにブログの最新投稿を設定しているときは表示したい」

などのわがままさんの希望に応えます。

if(is_single() || is_home()) {
    // 投稿ページ、またはトップページにブログの最新投稿を表示しているとき
}

上にも書きましたが、ブログの最新投稿を表示しているときは、is_single()扱いされません。

投稿ページではなくトップページ表示、WordPressとしては「ブログ投稿インデックスだから」です。

少々ややこしい仕様ではありますが、覚えておくといざというときに使えます。

まとめ

is_home()は「トップページがブログ投稿インデックスかどうか(トップページに最新の投稿を表示する)を判定する」

is_front_page()は「トップページが静的ページ(固定ページ)かどうかを判定する」

is_home()はis_single()とも違うので、両方で動作させたいときはis_home() || is_single()としなければならない

PR

※本サイトはアフィリエイトプログラムを利用して商品を紹介しています。