(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 список віртуальних літератур, в подальшому ордері 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Введено.

Де викликається хук

(type)_template_hierarchy

wp-includes/template.php 62

$templates = apply_filters( "{$type}_template_hierarchy", $templates );

Де використовується хук у WordPress

Використання не знайдено.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *