テンプレートの読み込み順を変更する
この記事は 2020年 7月 27日 に書かれた記事です。
WP は テンプレートの読み込み順が決まっています
今回は ちょっと 特殊なルールで テンプレートの読み込みを行いたかったので
そのカスタマイズを 備忘録として 残しておきます
デフォルトの テンプレートの読み込み順は Codex の 概観図がわかりやすいですね
テンプレート階層 - WordPress Codex 日本語版を参考にさせていただきました。
http://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4
上記 URL の 階層のフィルター を 参考にしながら 個別投稿ページの表示に使用されるテンプレート を 変えてみました
add_filter( 'single_template_hierarchy', function( $templates ) {
$object = get_queried_object();
// !! 初期化 !!
$templates = [];
if( urldecode_deep( $object->post_name ) !== $object->post_name ) {
$templates[] = 'single-' . $object->post_type . '-' . urldecode_deep( $object->post_name ) . '.php';
}
// Template
if( ! empty( get_page_template_slug( $object->ID ) ) ) {
$templates[] = get_page_template_slug( $object->ID );
}
$templates[] = 'single-' . $object->post_type . '-' . $object->post_name . '.php';
$category = get_the_category();
if( ! empty( $category ) ) {
foreach( $category as $value ) {
if( urldecode_deep( $value->slug ) !== $value->slug ) {
$templates[] = 'single-' . $object->post_type . '--' . urldecode_deep( $value->slug ) . '.php';
}
$templates[] = 'single-' . $object->post_type . '--' . $value->slug . '.php';
if( $value->parent != 0 ) {
while( $value->parent ) {
$value = get_term( $value->parent, $value->taxonomy, OBJECT );
if( ! isset( $value->slug ) ) break;
if( urldecode_deep( $value->slug ) !== $value->slug ) {
$templates[] = 'single-' . $object->post_type . '--' . urldecode_deep( $value->slug ) . '.php';
}
$templates[] = 'single-' . $object->post_type . '--' . $value->slug . '.php';
}
}
}
}
$templates[] = 'single-' . $object->post_type . '.php';
$templates[] = 'single.php';
return $templates;
} );
読み込み順は 上から マッチしていきます
- テンプレート指定
- single-{post_type}-{post_name}.php
- single-{post_type}–{$category->slug}.php
- single-{post_type}–{$category_parent->slug}.php
- single-{post_type}.php
- single.php
これで カテゴリに属している投稿の場合のみ テンプレートを変えることができます