Template Hierarchy tag- {slug} .php каталог

Когда tag-{slug}.php находится в корне темой, скажем, wp-content/themes/p2/tag-{slug}.php , соблюдается иерархия шаблонов.

Тем не менее, у меня есть много таких пользовательских файлов и просто не могу иметь его в корневом каталоге темы. Когда я тестировал с каталогами p2/tag и p2/custom-tag , это не сработало.

Любое понимание?

Когда вы смотрите на исходный код, шаблон тега загружается, как показано в иерархии шаблонов

  • elseif ( is_tag() && $template = get_tag_template() ) : в wp-includes/template-loader.php

  • get_tag_template() использует get_query_template() который использует locate_template()

  • который загружает шаблон тега в соответствии с иерархией из корневой папки темы

Таким образом, перемещение ваших шаблонов в подпапку не будет работать из коробки. get_query_template() однако, имеют фильтр ( apply_filters( "{$type}_template", $template ) ), который мы можем использовать для изменения этого поведения и загрузки нашего tag-{$tag->slug}.php из подпапки

Итак, мы должны сделать следующее

  • Проверьте, существует ли наш tag-{$tag->slug}.php в нашей подпапке выбора

  • Загрузите наш tag-{$tag->slug}.php из подпапки, если он существует

  • Загружать шаблоны по умолчанию из иерархии, если tag-{$tag->slug}.php не существует в подпапке

Будет работать следующее:

 add_filter( 'tag_template', function ( $template ) { $tag = get_queried_object(); // Alternative path to desired template $alternative_template = locate_template( "custom-sub-folder/tag-{$tag->slug}.php" ); // Change subfolder name // If we do have "tag-{$tag->slug}.php" in a subfolder, load "subfolder/tag-{$tag->slug}.php" if ( $alternative_template ) return $template = $alternative_template; // If we don't have a "tag-{$tag->slug}.php", load templates according to hierarchy return $template; });