В разработке тем для WordPress часто возникает задача создать каскадную систему шаблонов, которая позволит использовать различные варианты оформления страниц в зависимости от условий, например, типа записи, таксономии или пользовательских параметров. В этой статье мы разберем, как реализовать такую систему, чтобы ваша тема стала более гибкой и масштабируемой.
Что такое каскадные шаблоны в WordPress и зачем они нужны
Каскадные шаблоны — это система выбора файлов шаблонов, при которой WordPress ищет наиболее подходящий файл для отображения страницы, учитывая иерархию шаблонов. Например, при выводе записей определённой категории можно использовать отдельный файл category-slug.php, а при отсутствии - fallback к category.php, а затем к archive.php.
Использование каскадных шаблонов позволяет минимизировать дублирование кода и максимально точно настроить вывод контента под разные условия без избыточных проверок в коде PHP.
Однако стандартной иерархии WordPress иногда недостаточно, чтобы реализовать сложную логику. В таких случаях можно создавать собственные каскадные механизмы с помощью фильтров и функций темы.
Создание пользовательской каскадной системы шаблонов на примере типов записей
Допустим, у вас есть несколько пользовательских типов записей (Custom Post Types) и вы хотите для каждого типа использовать свои шаблоны, а в случае их отсутствия — шаблоны по умолчанию.
Для этого в файле functions.php темы добавим фильтр, который позволит изменять логику выбора шаблона:
add_filter('template_include', 'wpcourse_template_include_cascade');
function wpcourse_template_include_cascade($template) {
if (is_singular('product')) {
$custom_template = locate_template(['single-product-special.php', 'single-product.php']);
if ($custom_template) {
return $custom_template;
}
}
return $template;
}Здесь мы указываем, что для типа записи product сначала пытаемся загрузить шаблон single-product-special.php, если его нет — single-product.php, иначе используем стандартный шаблон.
Функция locate_template() ищет указанные файлы в папке темы и возвращает путь к первому найденному.
Расширение каскада на таксономии и пользовательские параметры
Можно усложнить логику, учитывая категории, теги или произвольные таксономии. Например, для записей типа product с таксономией brand:
add_filter('template_include', 'wpcourse_template_include_cascade_with_tax');
function wpcourse_template_include_cascade_with_tax($template) {
if (is_singular('product')) {
$terms = get_the_terms(get_the_ID(), 'brand');
if ($terms && !is_wp_error($terms)) {
$brand_slug = $terms[0]->slug;
$templates = [
"single-product-{$brand_slug}.php",
'single-product.php'
];
$custom_template = locate_template($templates);
if ($custom_template) {
return $custom_template;
}
}
}
return $template;
}Этот код сначала пытается загрузить шаблон с именем, зависящим от бренда (таксономии), что позволяет создавать уникальное оформление для разных брендов.
Использование шаблонных частей для каскадной загрузки блоков
Каскадные шаблоны полезны не только для полных страниц, но и для частей шаблонов — header, footer, sidebar, контент-блоков. Для этого удобно использовать функцию get_template_part(), которая тоже поддерживает каскадный поиск.
Например, для вывода блока отзывов можно создать несколько вариантов:
template-parts/reviews/reviews-special.phptemplate-parts/reviews/reviews.php
И в шаблоне вызвать:
get_template_part('template-parts/reviews/reviews', 'special');Если файл reviews-special.php существует, он загрузится, иначе — reviews.php.
Динамическая загрузка шаблонных частей по условию
Можно написать функцию, которая будет выбирать нужный шаблонный файл в зависимости от параметров. Например, для кастомизации блока контактов:
function wpcourse_get_contact_template_part() {
$location = get_theme_mod('contact_template_location', 'default');
$templates = [
"template-parts/contact/contact-{$location}.php",
'template-parts/contact/contact-default.php'
];
foreach ($templates as $template) {
if (file_exists(get_template_directory() . '/' . $template)) {
get_template_part(str_replace('.php', '', $template));
return;
}
}
}Теперь вызов wpcourse_get_contact_template_part() загрузит шаблон в зависимости от настроек темы.
Практические советы по организации каскадных шаблонов в теме
Чтобы каскадные шаблоны работали удобно и не создавали путаницы, следуйте нескольким рекомендациям:
- Используйте понятную структуру папок, например,
template-parts/для частей и корень темы для основных шаблонов. - Придерживайтесь именования файлов, отражающего их назначение и условия использования.
- Для сложных условий используйте фильтр
template_includeи функции WordPress для поиска шаблонов. - Документируйте логику каскада в комментариях, чтобы облегчить поддержку.
Интеграция с плагинами из WPShop
Если вы используете темы из WPShop, например, темы Reboot или Bono, каскадные шаблоны помогут гибко настраивать внешний вид без правки ядра темы. Кроме того, плагины вроде Expert Review можно подключать через шаблонные части, чтобы показывать отзывы в разных местах с разным оформлением.
Заключение: когда использовать кастомные каскадные шаблоны
Если ваша тема требует отображать страницы по-разному в зависимости от многих факторов — типа записи, таксономии, пользовательских настроек — кастомная каскадная система шаблонов станет надежным и удобным решением. Она позволит минимизировать дублирование кода и быстро адаптироваться под новые требования.
Приведенные примеры показывают, что даже для сложных сценариев достаточно нескольких строк кода, чтобы расширить стандартную иерархию шаблонов WordPress и получить мощный инструмент для разработки тем.