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 );