てくてくあるく

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

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

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

Related Article

プラグイン管理画面の設定リンクを追加する

詳細へ »

theme.json が 重要になるかもしれない

詳細へ »

関連記事 っぽいものを 付けてみました

詳細へ »