template_include
Позволяет изменить путь до подобранного файла шаблона отображения текущей страницы, например: single.php, page.php.
Срабатывает перед подключением подобранного файла шаблона темы. Этот фильтр используется для изменения пути до такого файла.
Фильтр срабатывает после события template_redirect и после того, как WordPress подберет файл, который будет использоваться в качестве файла шаблона.
Во время этого фильтра уже можно использовать условные теги и переменная $post уже определена.
Для каждого типа страницы, файл шаблона разный: см. Иерархию файлов темы. Например, мы зашли на постоянную страницу, WordPress подбирает какой файл шаблона должен быть показан - это файл page.php: home/example.com/wp-content/themes/mytheme/page.php. С помощью этого фильтра можно изменить путь такого файла.
Подобные хуки для работы с файлом шаблона:
-
(type)_template_hierarchy - фильтрует массив названий файлов иерархии, по которому будет идти поиск нужного файла. С WP 4.7.
- (type)_template - фильтрует путь до уже определившегося файла шаблона. Аналог template_include, только срабатывает чуть раньше.
Все варианты параметра type смотрите в одноименном параметр $type функции get_query_template().
Использование
add_filter( 'template_include', 'wp_kama_template_include_filter' );
/**
* Function for `template_include` filter-hook.
*
* @param string $template The path of the template to include.
*
* @return string
*/
function wp_kama_template_include_filter( $template ){
// filter...
return $template;
}
- $template(строка)
- Полный путь до файла, который будет подключен в качестве шаблона. Пр: home/example.com/wp-content/themes/publisher/page.php.
Примеры
#1 Фильтр template_include
И третий способ создать отдельный файл шаблона для страницы с ярлыком portfolio - это использовать фильтр template_include:
add_filter( 'template_include', 'portfolio_page_template', 99 );
function portfolio_page_template( $template ) {
if( is_page('portfolio') ){
$new_template = locate_template( array( 'portfolio-page-template.php' ) );
if ( $new_template ){
$template = $new_template ;
}
}
return $template;
}
Такой способ может быть полезен при написании плагинов или дополнений к шаблону. Когда нужно просто создать страницу с определенным слагом и все.
#2 Шаблон для всех дочерних страниц
Допустим у нас есть шаблон страница и у этой страницы есть дочерние страницы (под страницы). Давайте установим свой шаблон страницы для этой родительской и всех её дочерних страниц.
add_filter( 'template_include', 'wp_kama_template_include_filter' );
function wp_kama_template_include_filter( $template ) {
$parent_page_id = 25;
$post = get_queried_object();
if( is_page( $parent_page_id ) || $parent_page_id === $post->post_parent ){
return get_theme_file_path( 'templates/page-myname.php' );
}
return $template;
} #3 Файл в каталоге темы
Шаблон постоянной странице можно задать создав файл в каталоге темы и в начале файла указать PHP комментарий:
<?php /** * Template Name: Портфолио */
Затем при создании страницы, в выпадающем списке нужно выбрать созданный шаблон
Файл темы с точным названием
Или в теме создайте файл page-portfolio.php. В этом случае ярлык страницы должен быть равен "portfolio".
#4 Как узнать какой файл шаблона используется в текущий момент
Для этого посмотрите что передается в фильтр 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;
}
#5 Подключение 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();
}
Нужно знать!
Технически это неправильное решение, но оно работает! В этом случае фильтр используется как событие. А так как этот фильтр вызываться последним среди фильтров не относящихся к шаблону, то в момент его вызова можно вывести на экран нужный нам код шаблона...
Вообще, не рекомендую использовать этот способ. Но если нельзя, но очень хочется, то можно...
Список изменений
| С версии 3.0.0 | Введена. |
Где вызывается хук
$template = apply_filters( 'template_include', $template );