こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
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()は「トップページがブログ投稿インデックスかどうか(トップページに最新の投稿を表示する)を判定する」
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()としなければならない