WordPress 4.7 では、カスタムテンプレートに投稿タイプを指定することで、固定ページ以外の投稿タイプ、たとえば「投稿」やカスタム投稿タイプなどでテンプレートを使えるようになりました。あんまフューチャーされてない気がするので備忘録的に使い方をまとめました。

WordPress 4.6 以前ではカスタムテンプレートは基本的に固定ページでしか使えませんでした。カスタムテンプレートとは、テーマディレクトリ内に /* Template Name: テンプレート名 */ のコメントで始まるファイルを置くことで、投稿画面でテンプレートを選択して利用できるようになるというものです。

4.7 以降では、このテンプレートファイルを固定ページ以外でも使えるようになりました。

やりかた

テーマディレクトリ内に新規PHPファイルを用意し、冒頭を以下のようにします。

<?php
/**
 * Template Name: テンプレート名
 * Template Post Type: 投稿タイプ名
 */

このように Template Post Type を記述することで、テンプレートを有効にする投稿タイプを指定することができます。Template Post Type を記述しない場合は、従来どおり固定ページテンプレートとなります。

投稿タイプ名を複数指定したい場合は、カンマで区切ります。たとえば、「投稿」と「固定ページ」と「お知らせ」カスタム投稿タイプ(投稿タイプ名: news)でこのテンプレートを利用可能にしたい場合は、以下のようにします。

Template Post Type: post, page, news

ダッシュボードの投稿画面で、テンプレートが選択可能になっているか確認します。

「投稿」でテンプレートが選べるようになっている。

後方互換性

WordPress 4.6 以前では Template Post Type が無視され、どのテンプレートも固定ページで選択できるようになってしまいます。Theme Handbook にこの解決方法が載っています。



function my_exclude_page_templates( $post_templates ) {
    if ( version_compare( $GLOBALS['wp_version'], '4.7', '<' ) ) {
        unset( $post_templates['templates/テンプレート名.php'] );
    }
  
    return $post_templates;
}
  
add_filter( 'theme_page_templates', 'my_exclude_page_templates' );

page 以外の Template Post Type を指定したテンプレートファイルを WP4.6 以前の場合に unset しています。テーマ開発者は、WordPress 4.9 のリリースぐらいまではこれをやっておいた方が良いかも?

まとめ

サイトごとのテーマ開発ではこれまでもカテゴリーなどでテンプレートファイルを分けていたのでアレですが、不特定多数の人が利用するような配布テーマでは開発の幅がさらに広がってワクワクしますね。