WordPressのテーマ作成でよく使う条件分岐関数について調べましたにてWordPressの条件分岐関数について紹介しました。そのなかでis_home()とis_front_page()の動作に表示設定の「フロントページの表示」というのがありましたね。そこでWordPressの「フロントページの表示」についての説明とトップページの表示に関するis_home()とis_front_page()の条件分岐関数をどんな感じに使っていけばいいのかを紹介していきます。

WordPressのトップページ表示の動作

まず「フロントページの表示」というのはいわゆるWordPressのトップページに関する設定です。管理画面の「設定」⇒「表示設定」にいくとこんな感じに表示されているはずです。

WordPress表示設定

上から順に説明していくと

最新の投稿
投稿リストをサイトトップにする
固定ページ (フロントページ)
選択した固定ページをサイトトップにする
固定ページ (投稿ページ)
選択した固定ページを投稿リストにする

となります。「最新の投稿」はブログとしての用途、「固定ページ」はCMSとしての用途なのがWordPressの想定なのでしょう。なぜ固定ページがフロントページと投稿ページの2つを選択しなければならないのかというと、もともとサイトトップに設定していた投稿リストページが固定ページになることで投稿リストページがページとして存在しなくなってしまうからです。

なので固定ページのバーマリンクが自由に設定できることをつかって、「フロントページの表示」⇒「固定ページ(投稿ページ)」に設定した固定ページを投稿リストのページに置き換えてしまい、ブログTOPのような形にして表示させるような動作になっています。投稿での置き換えはURLがパーマリンク設定に依存するので出来ませんし、投稿の用途ではなく固定ページの役割なのでこんな設定になっています。

また「フロントページの表示」⇒「固定ページ(投稿ページ)」に設定した固定ページは、投稿リストに置き換わるので固定ページとしての表示はできなくなります。

「フロントページの表示」設定の注意

「表示設定」⇒「フロントページの表示」で「固定ページ」を指定するとき固定ページの指定がどちらか片方だけでも出来て動作もします。しかしながら「固定ページ」を指定するときは、「フロントページ」「投稿ページ」どちらも設定をしましょう。片方だけ固定ページを設定した状態だとWordPressで使用しているテーマによっては、あとで述べる条件分岐関数が正しく動作しないことがあります。

is_home()とis_front_page()のおさらい

「フロントページの表示」についてわかったところでis_home()とis_front_page()はどんな条件分岐関数なのかおさらいします。

関数名関数の条件・用途
is_home()「表示設定」のフロントページの表示が「最新の投稿」か固定ページの「投稿ページ」を指定しているとき
is_front_page()「表示設定」のフロントページ表示が「最新の投稿」か固定ページの「フロントページ」を指定しているとき

is_home()・is_front_page()ともに引数はなくて返り値は、「true」 or 「false」です。

is_home()・is_front_page()は正しく使う

「表示設定」⇒「フロントページの表示」が「最新の投稿」になっている場合だとis_home()、is_front_page()どちらを指定してもWordPressのトップページの判定は正しく動き、「表示設定」⇒「フロントページの表示」が「固定ページ」になっているとトップページの判定は、is_front_page()しか正しく動かないということになります。

このことからWordPressのサイトトップの判定をしたい場合は、「表示設定」⇒「フロントページの表示」を「最新の投稿」にするか、「固定ページ」を使うにしても「フロントページ」「投稿ページ」をどちらも設定した上でis_front_page()を使用し、ブログトップページを判定するのにis_home()を使用するといった形にすべきです。

「フロントページの表示」設定の注意で書いた通り、「表示設定」⇒「フロントページの表示」で「固定ページ」にした場合、どちらか片方だけ固定ページを指定しただけでもトップページは動きます。ただ片方を指定(特に「投稿ページ」の指定)だけだと、トップページが「最新の投稿」と同じ形なるうえ、is_front_page()がfalseでサイトトップの判定に使えなくなるのでWordPressのブログ機能を使わない以外は、片方だけの指定はやめましょう。

トップページの判定を「フロントページの表示」設定と同じ形でするには以下のような形で判定をすべきです。

if ( is_front_page() && is_home() ) {
    /* 最新の投稿の判定 */
} elseif ( is_front_page() ) {
    /* 固定ページにしたときの「フロントページ」の判定 */
} elseif ( is_home() ) {
    /* 固定ページにしたときの「投稿ページ」の判定 */
} else {
    /* それ以外の判定 */
}