WordPressでは、表示するページの種類に応じてテンプレートファイルが選択されます。
テンプレートの選択は、決められた階層ルールに従って行われます。
これについては、WordPress Codexにまとめられています。
テンプレート階層 – WordPress Codex 日本語版
この階層ルールはかなり細かく設定されているので、多くのケースはこの階層ルールで対応できるようになっています。
ただし、この階層ルールでも対応できない場合もあります。
例えば、個別投稿ページ(シングルページ)をカテゴリに応じて切り替えたい場合です。
こういった場合の方法をまとめてみました。
カテゴリ別の個別投稿テンプレートは無い
個別投稿ページ(シングルページ)のテンプレートは、3つの階層が定義されています。
- single-{post_type}.php — 投稿タイプ毎の個別投稿
- single.php — 個別投稿
- index.php — 基本テンプレート
個別投稿のテンプレート、さらに投稿タイプ毎の個別投稿のテンプレートを扱う事ができます。
しかし同じ投稿タイプ(postなど)で、カテゴリ別のテンプレートを扱うことができません。
カテゴリは1記事に対して複数設定ができるので、カテゴリ別にテンプレートを分ける事ができないのは当然なのですが、1記事1カテゴリを原則として運用しているサイトであれば、カテゴリ別にテンプレートを用意したくなるかもしれません。
そんな場合、functions.phpにtemplate_include
フィルターを設定します。
テンプレートファイルを変更するフィルター関数
例として、newsというカテゴリの個別投稿ページでは、single-news.phpというテンプレートを使用するように設定します。
functions.phpに、以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 |
function custom_template_include( $template ) { if ( is_single() && in_category( 'news' ) ) { $new_template = locate_template( array( 'single-news.php' ) ); if ( '' != $new_template ) { return $new_template ; } } return $template; } add_filter( 'template_include', 'custom_template_include', 99 ); |
条件分岐タグのis_single
とin_category
を使用しています。
※条件分岐タグについては、記事: 便利な条件分岐タグまとめを参照
記事が複数のカテゴリに属している場合でも、そのうちの1つがnewsカテゴリであれば、single-news.phpがテンプレートとなります。
このコードは以下のページを参考にしました。
Plugin API/Filter Reference/template include « WordPress Codex