(type)_template_hierarchyхук-фильтрWP 4.7.0

Позволяет изменить список php файлов иерархии шаблона для текущей страницы (текущего запроса).

Это динамический хук в котором (type) может быть одним из:

  • indexindex_template_hierarchy.
  • 404404_template_hierarchy.
  • archivearchive_template_hierarchy.
  • authorauthor_template_hierarchy.
  • categorycategory_template_hierarchy.
  • tagtag_template_hierarchy.
  • taxonomytaxonomy_template_hierarchy.
  • datedate_template_hierarchy.
  • embedembed_template_hierarchy.
  • homehome_template_hierarchy.
  • frontpagefrontpage_template_hierarchy.
  • privacypolicyprivacypolicy_template_hierarchy.
  • pagepage_template_hierarchy.
  • pagedpaged_template_hierarchy.
  • searchsearch_template_hierarchy.
  • singlesingle_template_hierarchy.
  • singularsingular_template_hierarchy.
  • attachmentattachment_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
)

Примеры

0

#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 ), 1 ) ){
		array_unshift( $templates, $custom_tpls[ $cur_name ] );
	}

	return $templates;
} );

Теперь в самом начале иерархии файлов темы для записей типа page, будет находится файл tpl/some-page.php и если он есть в теме, он будет использоваться в качестве файла шаблона для текущей страниц.

0

#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;
} );
0

#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 Введена.

Где вызывается хук

get_query_template()
(type)_template_hierarchy
wp-includes/template.php 62
$templates = apply_filters( "{$type}_template_hierarchy", $templates );

Где используется хук в WordPress

Использование не найдено.