てくてくあるく

WordPress の テーマ とか プラグイン に ついて 勉強しています

WP は テンプレートの読み込み順が決まっています

今回は ちょっと 特殊なルールで テンプレートの読み込みを行いたかったので
そのカスタマイズを 備忘録として 残しておきます

デフォルトの テンプレートの読み込み順は Codex の 概観図がわかりやすいですね

I referred to テンプレート階層 - 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

これで カテゴリに属している投稿の場合のみ テンプレートを変えることができます

Related Article

2017/01/06 に Bootstrap 4 Alpha 6 が 来ていました

more »

ねんでぶろぐ さんの WordPress5.5 ブロックパターンを簡単に登録やメンテナンスできるようにする が とても便利だった

more »

WordPress の プラグイン の 作り方 では 教えてくれない 最初に書いたほうが良い コード

more »