Индивидуальный шаблон для страниц page.php по условиям в wordpress
Ранее уже писал о том, как задать индивидуальный шаблон для страниц определенной категории и как задать индивидуальный шаблон для подкатегорий. На этот раз рассмотрим случай, когда иерархию сайта строим на основе страниц и необходимо массово задать определенный шаблон для всех страниц, имеющий определенную родительскую категорию.
Для решения данной задачи есть хук page_template, его и будем использовать. Код необходимо разместить в файл functions.php, находящийся в директории активной темы.
Рассмотрим два случая:
- Когда уровень вложенности больше, чем один. 1234567891011add_filter('page_template', 'delfiPageTemplate');function delfiPageTemplate($page) {global $wp_query, $post;$ancestors = get_post_ancestors($post->ID);if(!empty($ancestors) && in_array(13, $ancestors)) {return get_template_directory() . '/page-templates/mypagetemplate.php';}return $page;}
В данном случае мы находим ID всех родительских страниц по цепочке вверх (в этом нам помогает функция get_post_ancestors, возвращающая массив ID), затем смотрим, есть ли в иерархии родителей страница с ID 13 (взято для примера) и задаем для всех страниц с родителем 13 шаблон, находящийся в папке с темой по адресу /page-templates/mypagetemplate.php. В остальных случаях возвращаем шаблон, который был передан в функцию.
Первый вариант более универсальный, но избыточен. В случае, если известно, что уровень вложенности всего один, то лучше использовать упрощенную схему, где мы не ищем всех родителей страницы по цепочке, а сравниваем с непосредственным родителем. Данный подход менее ресурсоемкий
12345678910add_filter('page_template', 'delfiPageTemplate');function delfiPageTemplate($page) {global $wp_query, $post;if($post->post_parent == 13) {return get_template_directory() . '/page-templates/mypagetemplate.php';}return $page;}Все аналогично первому варианту, кроме сравнения с прямым родителем текущей страницы.