(type)_template_hierarchy
Позволяет изменить список php файлов иерархии шаблона для текущей страницы (текущего запроса).
Это динамический хук в котором (type)
может быть одним из:
index
— index_template_hierarchy.404
— 404_template_hierarchy.archive
— archive_template_hierarchy.author
— author_template_hierarchy.category
— category_template_hierarchy.tag
— tag_template_hierarchy.taxonomy
— taxonomy_template_hierarchy.date
— date_template_hierarchy.embed
— embed_template_hierarchy.home
— home_template_hierarchy.frontpage
— frontpage_template_hierarchy.privacypolicy
— privacypolicy_template_hierarchy.page
— page_template_hierarchy.paged
— paged_template_hierarchy.search
— search_template_hierarchy.single
— single_template_hierarchy.singular
— singular_template_hierarchy.attachment
— attachment_template_hierarchy.
Последний элемент в массиве всегда должен быть дефолтный файл шаблона. Например, для типа page
- это page.php
, для типа singular
- это single.php
и т.д.
Смотрите по теме: Иерархия файлов темы.
Использование
add_filter( '(type)_template_hierarchy', 'wp_kama_type_template_hierarchy_filter' ); /** * Function for `(type)_template_hierarchy` filter-hook. * * @param string[] $templates A list of template candidates, in descending order of priority. * * @return string[] */ function wp_kama_type_template_hierarchy_filter( $templates ){ // filter... return $templates; }
- $templates(массив)
Список файлов шаблона в порядке их использования. Будет использован первый существующий файл из списка.
Список представляет собой массив в каждом элементе которого путь до файла относительно темы. Например для запроса к записи типа page массив будет такой:
Array( [0] => page-contacts.php [1] => page-25.php [2] => page.php )
Примеры
#1 Добавим свой файл шаблона в иерархию
Допустим у нас в теме есть папка tpl
в которой лежат файлы шаблона. Нам нужно для страниц с ярлыками my-page
и your-page
указать файл шаблона tpl/some-page.php
. Для этого используем такой код:
add_filter( 'page'.'_template_hierarchy', function( $templates ){ $cur_name = str_replace( [ 'page-', '.php' ], '', $templates[0] ); $custom_tpls = [ 'my-page' => 'tpl/some-page.php' 'your-page' => 'tpl/some-page.php' ]; if( in_array( $cur_name, array_keys( $custom_tpls ), true ) ){ array_unshift( $templates, $custom_tpls[ $cur_name ] ); } return $templates; } );
Теперь в самом начале иерархии файлов темы для записей типа page, будет находится файл tpl/some-page.php
и если он есть в теме, он будет использоваться в качестве файла шаблона для текущей страниц.
#2 Добавим свой файл шаблона для кастомного типа записей
Допустим мы зарегистрировали тип записи book
и мы хотим, чтобы файл шаблона отдельной страницы этого типа записи лежал в папке темы templates
и назывался book.php
. Т.е. нам нужно чтобы за вывод отвечал файл шаблона templates/book.php
, если этого файла нет, то будет работать стандартная иерархия файлов темы.
add_filter( 'single'.'_template_hierarchy', function( $templates ){ if( is_singular('book') ){ array_unshift( $templates, 'templates/book.php' ); } return $templates; } );
#3 Перенаправим всю иерархию файлов темы в папку templates
Сделаем так чтобы все файлы шаблона находились в папке темы templates, а не в корневой папке темы:
$types = [ '404', 'archive', 'author', 'category', 'tag', 'taxonomy', 'date', 'embed', 'home', 'frontpage', 'privacypolicy', 'paged', 'search', 'page', 'single', 'singular', // include attachments 'attachment', //'index', leave /index.php as is ]; // add a prefix for all template files foreach( $types as $type ){ add_filter( "{$type}_template_hierarchy", 'prefix_template_hierarchy', 20 ); } function prefix_template_hierarchy( $templates ){ $subfolder = 'templates'; $type = str_replace( '_template_hierarchy', '', current_filter() ); // add `taxonomy.php` file after last `category.php` and `tag.php` element. if( in_array( $type, [ 'category', 'tag' ] ) ){ $templates[] = 'taxonomy.php'; } // add global prefix `self::$basedir/` ex: `tpl/`. foreach( $templates as $index => $relpath ){ if( ! str_starts_with( $relpath, "$subfolder/" ) ){ $templates[ $index ] = "$subfolder/$relpath"; } } return $templates; }
Исключение здесь только файл index.php - он должен быть в корне темы. Также, в качестве примера, я показал, как определить текущий тип иерархии и, например, добавить в иерархию для категории и тегов файл taxonomy.php
. По умолчанию его нет в иерархии файлов темы (хотя логично, чтобы он там был).
Такие стандартные файлы как comments.php, header.php, footer.php, sidebar.php и т.д. не участвуют в иерархии файлов темы, поэтому их нужно будет обработать отдельно, если вы хотите чтобы и все они лежали в папке templates, а не в корне темы.
Список изменений
С версии 4.7.0 | Введена. |
Где вызывается хук
$templates = apply_filters( "{$type}_template_hierarchy", $templates );