特定のページテンプレートを条件分岐するis_page_template() の使い方と注意点

※本ブログの目的は個人の備忘録であり、コードは参考用として掲載しています。
実際に使用される際は、ご自身の環境で十分に動作確認を行ってください。
コードの利用によって生じたいかなる問題についても責任を負いかねますので、あらかじめご了承ください。

はじめに

WordPressでテーマを作るとき、特定の固定ページだけに独自のデザインやスタイルを適用したいことがあります。

そんなときに便利なのが、is_page_template() という条件分岐関数です。

ただし、この関数には少しクセがあるので、正しく使うにはポイントを押さえておく必要があります。

固定ページテンプレートを作るには

WordPressに「固定ページテンプレート」として認識させるには、テンプレートファイルの冒頭に Template Name コメント が必要です。

Template Name: の後に好きなテンプレート名を記述します。

そうすると、管理画面の固定ページ編集画面で、この名前を選択できるようになります。

このファイル名自体は template-test.php など任意ですが、管理画面で表示されるテンプレート名用 であり、判定用の is_page_template() にはファイル名を指定する必要があります。

<?php
/*
Template Name: test Page
*/
?>

is_page_template() の使い方

引数にファイル名が入ります。

is_page_template()固定ページでしか有効ではないため、投稿やカスタム投稿タイプでは常に false を返します。

<?php
if ( is_page_template('template-test.php') ) {
    // template-test.php テンプレートが使われている場合の処理
} else {
    // 使われていない場合の処理
}
?>

よくある間違い

スラッグベーステンプレートとの混同

例えば page-sample.php というファイルをテンプレートとして利用している場合、

ページスラッグが sample の固定ページでは、WordPress が自動で page-sample.php を読み込みます。

しかし、この場合 固定ページテンプレートとして管理画面から選択したわけではない ため、is_page_template() は false を返します。

混同を避けるため、固定ページテンプレートとして使用する場合は page-{slug}.php ではなく template-xxx.php のようにファイル名を付けましょう。

<?php
// slug が sample の固定ページの場合
if ( is_page_template('page-sample.php') ) {
    echo 'テンプレートファイルです。'; // false となり、出力されません
}
?>

公式ドキュメントでも次のように注意されています。

Important! Do not use page- as a prefix, as WordPress will interpret the file as a specialized template, meant to apply to only one page on your site.

Page Templates – Theme Handbook | Developer.WordPress.org

(google翻訳:重要!WordPress はファイルをサイト上の 1 ページにのみ適用される特別なテンプレートとして解釈するため、プレフィックスとして page- を使用しないでください。)

ページテンプレートはディレクトリにまとめて、そのサブディレクトリから呼び出すことが推奨されています。

例えばtemplate/sample.php の場合は is_page_template('template/sample.php') のように書きます。

<?php
// ディレクトリにまとめた場合のページテンプレート判定
if ( is_page_template('template/sample.php') ) {
    echo 'テンプレートファイルです。';
}
?>

まとめ

WordPressで特定の固定ページに独自デザインを適用するには、固定ページテンプレートを作り、Template Name コメントを付けることが基本です。

判定には is_page_template() を使い、引数には必ずファイル名(ディレクトリを含む場合は相対パス)を指定します。

スラッグベースの page-{slug}.php では判定できない点に注意しましょう。

参考