WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru WPmentor - Ищем топовых специалистов по WordPress, чтобы помочь вам заработать

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().

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

add_filter( 'template_include', 'filter_function_name_11' );
function filter_function_name_11( $template ) {
	// Фильтр...

	return $template;
}
$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; 
} 

Список изменений

С версии 3.0.0 Введена.

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

В файле: /wp-includes/template-loader.php
template_include
wp-includes/template-loader.php 96
$template = apply_filters( 'template_include', $template );

Где используется хук (в ядре WP)

Использование не найдено.
7 комментов
  • Алексей

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

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

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

    1
    Ответить16.Окт.2017 в 23:10 #
    • Алексей

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

      get_template_part(junotoys_get_file_slug('templates/headers/_parts/contact-info-cart.php'));
      Ответить16.Окт.2017 в 23:11 #
  • В примере был указан шаблон Publisher
    Подскажите, а как именно создать свою страницу single-portfolio.php

    В оригинале там

    <?php
    /**
    
    	single.php
    	The template for displaying posts
    	@author BetterStudio
    	@package Publisher
    	@version 1.8.4
    	*/
    
    get_header();
    
    publisher_the_post();
    
    // Prints content with layout that is selected in panels.
    // Location: "views/general/post/style-*.php"
    publisher_get_view( 'post', publisher_get_single_template() );
    
    get_footer();
    Ответить11.Окт.2019 в 13:52 #
  • при подключении этого фильтра в functions.php

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

    подключение стайлшитов перекочевывает из тега head, где ему и положено быть, в тег body
    Вот это что за хрень?!

    Т.е., до подключения фильтра было так (стили в head):

    после подключения фильтра стало так (стили уехали в body):

    Попробуйте у себя, если не лень.

    Ответить15.Фев.2020 в 16:45 #
    • Kama7680

      Так как у тебя в коде делать нельзя - нельзя в этом хуке что-либо выводить на экран и при этом подключать еще и шаблон!

      Твой код: сначала выводит на экран <span style="color:red">..., а затем код шаблона <html .... В результате, видимо браузер исправляет некорректно составленный HTML и поэтому ты получает то что получаешь...

      Добавь свой HTML код в подключаемый файл шаблона (в примере это файл index.php), а не в этот хук.

      Ответить16.Фев.2020 в 17:58 #
      • понятно, что можно добавить во все файлы шаблона __FILE__.
        Весь смысл то в том, чтобы добавить фильтр и тогда автоматом на всех страницах выводился бы путь к этим страницам.

        Но главное, спасибо, что объяснил механизм появления ошибки - сначала span, а потом уже весь остальной html.

        В принципе, понимая этот механизм (еще раз спасибо!) можно взять файл, на который указывает $template и в нужное место вставить путь до текущего файла. Но что-то лениво это делать smile

        Ответить16.Фев.2020 в 21:56 #
        • Kama7680

          Если тебе просто путь показать надо, то используй хук, например, wp_head или wp_body_open(), если он в теме используется, или wp_footer.

          Также, плагин Query Monitor показывает такие пути и еще много полезной для разработки информации.

          Ответить17.Фев.2020 в 15:43 #