051
フロントページ(トップページ)・ブログ投稿ページかどうかを判定する
Library
テンプレートファイルはいくつかのページで共有して使用されます。たとえばindex.phpはその最たるもので、他に最適なテンプレートがない場合に使われ、出力を一手に引き受けます。テンプレート階層の仕組みはとても便利ですが、ページによっては部分的に処理を分けたい場合もあります。このようなケースに対応する便利な関数が、条件分岐タグです。
フロントページまたはブログ投稿インデックスページのみで処理を分岐させるには、is_front_page()またはis_home()を使用します。
| 用例 |
|
|---|---|
| 関連 |
|
| Codex |
フロントページとブログ投稿インデックスページ
フロントページとは、いわゆるサイトのトップページのことです。また、ブログ投稿インデックスページ(投稿ページ)とは、ブログの投稿一覧が出力されるページのことです。
フロントページかどうかを判定する条件分岐タグがis_front_page()、投稿ページかどうかを判定するタグがis_home()です。WordPressはこの2つを別のものとして扱っていることをまず頭に入れておきましょう。
is_front_page() | サイトのフロントページ(トップページ)かどうかを判定する |
|---|---|
is_home() | サイトのブログ投稿インデックスページかどうかを判定する |
一般的なブログサイトの場合、あるいはデフォルトの設定の状態で、この両者は一致しています。すなわち、フロントページにブログの記事一覧を表示している場合、is_front_page()もis_home()も同じ結果を返します。ただし、これはあくまで偶然一致しているだけで、is_home()はサイトのフロントページかどうかを判定する関数ではないことに注意してください。
日本だけで使われる「トップページ」
サイトの入り口を示す「トップページ」という言葉は、日本独特の呼称です。WordPressではトップページのことをホームページ、あるいはフロントページと表現しています。
フロントページに固定ページを設定する
初期設定ではフロントページはブログ投稿ページになっていますが、設定を変えることで固定ページを割り当てることもできます。管理画面の[設定]→[表示設定にある]、[ホームページの表示]を変更します。

デフォルトの設定では[最新の投稿]が選択されており、これはホームページに「投稿一覧を表示する」という意味です。
この設定を[固定ページ]に変更すれば、ホームページ・投稿ページとして表示する「固定ページ」を選択することができるようになります。上の例ではあらかじめ「フロントページ」「ブログ」という固定ページを作成し、それぞれホームページと投稿ページとして割り当てています。
ホームページに固定ページを割り当てたとしても、適切なテンプレートファイルがないとindex.phpが使われてしまうので、front-page.pnpなどを用意することにより出力を変更するのが一般的です。
is_front_page()とis_home()のふるまいを整理する
上記、[ホームページの表示]が[最新の投稿]の場合、is_front_page()もis_home()も全く同様のふるまいをします。ところが[固定ページ]を設定している場合は、判定結果が次のように変わります。
| 条件分岐タグ | ホームページ(トップページ) | ブログ投稿ページ |
|---|---|---|
is_front_page() | true | false |
is_home() | false | true |
ゆえに、is_front_page()とis_home()を同じような条件分岐タグとして認識せず、ホームページ(トップページ)かどうかを判定したいのならis_front_page()を、ブログ投稿ページかどうかを判定したいのならis_home()を使用するよう心がけましょう。
さらに、この性質を利用すると「ホームページがブログ投稿ページの場合」という条件を判定することができます。
<?php
if ( is_front_page() && is_home() ) {
// ホームページがブログ投稿ページとして使用されている場合の処理
} else {
// ホームページがブログ投稿ページとして使用されていない場合の処理
if ( is_front_page() ) {
// ホームページ(固定ページ)の処理
} elseif ( is_home() ) {
// ブログ投稿ページ(固定ページ)の処理
}
}
?>この静的な「フロントページ」という概念は途中から(WordPress 2.1から)導入された経緯があるため、少しわかりにくくなっていますね。
WP_Queryオブジェクトが近くにある場合の書き方
WP_Queryオブジェクトが近くにある場合、is_front_page()やis_home()を使用するのはいささか冗長です。この場合は、直接クラスのメソッドを利用する方が適切でしょう。
<?php
$query = new WP_Query( $args );
if( $query->is_front_page() ) {
// ホームページの場合の処理
}
if( $query->is_home() ) {
// ブログ投稿ページの場合の処理
}
?>is_front_page()やis_home()は、内部でグローバル変数の$wp_queryを取得し、$wp_query->is_front_page()のように判定した結果を返しているに過ぎません。最終的にWP_Queryクラスのオブジェクトにアクセスして判定するのであれば、オブジェクトが近くにある場合はそれを利用したほうが回りくどい処理にならないと思います。
Comment