WordPress как на ладони
wordpress jino

template_include хук-фильтр . WP 3.0

Срабатывает перед подключением подобранного файла шаблона темы, например: single.php, page.php, search.php, 404.php и т.д. Этот фильтр используется для изменения пути до такого файла.

Фильтр срабатывает после события template_redirect и после того, как WordPress подберет файл, который будет использоваться в качестве файла шаблона. Для каждого типа страницы, файл разный: см. Условные теги. Например, мы зашли на постоянную страницу, WordPress подбирает какой файл шаблона должен быть показан - это файл page.php: home/site.ru/wp-content/themes/mytheme/page.php. С помощью этого фильтра можно изменить путь такого файла.

Во время этого фильтра уже можно использовать условные теги и переменная $post уже определена.

Подобные хуки для работы с файлом шаблона:

  • (type)_template_hierarchy - фильтрует массив названий файлов иерархии, по которому будет идти поиск нужного файла. С WP 4.7.

  • (type)_template - фильтрует путь до уже определившегося файла шаблона. Аналог template_include, только срабатывает чуть раньше.

Все варианты параметра type смотрите в одноименном параметр $type функции get_query_template().

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

function filter_function_name_11( $template ) {
	// Фильтр...

	return $template;
}
add_filter( 'template_include', 'filter_function_name_11' );
$template(строка)
Полный путь до файла, который будет подключен в качестве шаблона. Пр: home/wptest.ru/wp-content/themes/publisher/page.php.

Примеры

#1 Файл в каталоге темы

Шаблон постоянной странице можно задать создав файл в каталоге темы и в начале файла указать PHP комментарий:

<?php
/**
 * Template Name: Портфолио
 */

Затем при создании страницы, в выпадающем списке нужно выбрать созданный шаблон

#2. Файл темы с точным названием

Или в теме создайте файл page-portfolio.php. В этом случае ярлык страницы должен быть равен "portfolio".

#3. Фильтр template_include

И третий способ создать отдельный файл шаблона для страницы со ярлыком portfolio - это использовать фильтр template_include:

add_filter( 'template_include', 'portfolio_page_template', 99 );
function portfolio_page_template( $template ) {
	if( is_page('portfolio')  ){
		if ( $new_template = locate_template( array( 'portfolio-page-template.php' ) ) )
			$template = $new_template ;
	}

	return $template;
}

Такой способ может быть полезен при написании плагинов или дополнений к шаблону. Когда нужно просто создать страницу с определенным слагом и все.

#4 Подключение PHP функции как файл шаблона

Иногда удобно не создавать файл с кодом шаблона, а создать PHP функцию с кодом этого файла. И чтобы такая функцию отработала как файл, её можно вызывать в хуке template_include:

<?php
// подключаем шаблон страницы
add_filter('template_include', 'book_archive_tpl_include');
function book_archive_tpl_include( $template ){
	if( ! is_post_type_archive('book') )
		return $template;

	book_archive_tpl();
}

// шаблон страницы
function book_archive_tpl(){
	get_header();
	get_sidebar();  
	?>

	<div>
		<h1>Заголовок</h1>
		<p>Какой-то текст</p>
	</div>

	<?php
	get_footer();
}

Нужно знать!

Технически это неправильное решение, но оно работает! В этом случае фильтр используется как событие. А так как этот фильтр вызываться последним среди фильтров не относящихся к шаблону, то в момент его вызова можно вывести на экран нужный нам код шаблона...

Вообще, не рекомендую использовать этот способ. Но если нельзя, но очень хочется, то можно...

#5 Как узнать какой файл шаблона используется в текущий момент

Для этого посмотрите что передается в фильтр template_include:

## Какой шаблон используется в текущий момент
add_filter( 'template_include', 'echo_cur_tplfile', 99 );
function echo_cur_tplfile( $template ){
	echo '<span style="color:red">'. wp_basename( $template ) .'</span>';
	return $template; 
} 

Связи хука

Остальные хуки из файла: wp-includes/template-loader.php:

Фрагменты кода хука template_include

Фрагмент из: wp-includes/template-loader.php VER 4.9.1
...
	elseif ( is_category()       && $template = get_category_template()       ) :
	elseif ( is_tag()            && $template = get_tag_template()            ) :
	elseif ( is_author()         && $template = get_author_template()         ) :
	elseif ( is_date()           && $template = get_date_template()           ) :
	elseif ( is_archive()        && $template = get_archive_template()        ) :
	else :
		$template = get_index_template();
	endif;
	/**
	 * Filters the path of the current template before including it.
	 *
	 * @since 3.0.0
	 *
	 * @param string $template The path of the template to include.
	 */
	if ( $template = apply_filters( 'template_include', $template ) ) {
		include( $template );
	} elseif ( current_user_can( 'switch_themes' ) ) {
		$theme = wp_get_theme();
		if ( $theme->errors() ) {
			wp_die( $theme->errors() );
		}
	}
	return;
endif;
template_include 3 комментария
  • mihdan cайт: www.kobzarev.com

    При использовании данного фильтра на некоторых страницах получаю 404, хотя контент выводится нормально. Использование status_header( 200 ); не помогает.

    PS: Советовать template_redirect и exit(); не нужно - это неверный подход.

    Ответитьгод назад #
  • Алексей

    Добрый день! С worpress начал работать не давно, но появилась задача с которой не могу справиться. Точнее справился, но только с помощью jquery.

    Мне необходимо заменить путь до шаблона у плагина с помощью своего плагина. В файле шаблона темы есть такая строка:

    С помощью своего плагина мне необходимо заменить путь на свой, чтобы отобразить свой шаблон. Понятное дело, что можно сделать это вручную, либо с помощью ajax, и заменить текст, но я бы хотел использовать подмену пути. Это возможно? Есть такие функции?

    Ответить2 месяца назад #
    • Алексей

      Строчка вот такая:

      get_template_part(junotoys_get_file_slug('templates/headers/_parts/contact-info-cart.php'));
      Ответить2 месяца назад #

Здравствуйте, !

Ваш комментарий
Предпросмотр