Коротко: кастомный шаблон страницы — это PHP-файл в папке темы (лучше дочерней темы) с комментарием Template Name: Название в шапке файла. WordPress сам находит такой файл и показывает его в выпадающем списке «Шаблон» в редакторе страницы — вам остаётся выбрать его и обновить страницу. Минимальный рабочий шаблон — 6 строк: комментарий с названием, get_header(), цикл с the_content() и get_footer(). Есть и варианты без ручного выбора: файлы page-{slug}.php и page-{id}.php подхватываются автоматически, а шаблон из плагина подключается через фильтры theme_page_templates и template_include. Ниже — рабочий код всех четырёх способов, подключение своих стилей и скриптов только для нужного шаблона и разбор типичных ошибок новичков.
Обычного page.php в теме хватает для типовых страниц «О компании» или «Доставка». Но рано или поздно появляется задача, для которой стандартный вид не подходит: лендинг услуги с другим оформлением, страница отзывов со своим циклом вывода, страница контактов с блоком карты и формой. Переписывать page.php под одну конкретную страницу — плохая идея: сломаются все остальные страницы сайта. Правильное решение — кастомный шаблон страницы: отдельный файл, который применяется только к тем страницам, где вы его явно выбрали.
В этой статье разберём, как WordPress выбирает шаблон для страницы, как создать свой шаблон за пять минут, куда его положить, как сделать шаблон из плагина и как вывести в нём динамический контент. Всё — с готовым кодом, который можно копировать и адаптировать под свои задачи.
Что такое кастомный шаблон страницы и когда он нужен
Шаблон страницы — это PHP-файл, который отвечает за внешний вид и структуру одной или нескольких страниц. Тема WordPress уже содержит базовый файл page.php: он выводит заголовок и содержимое любой страницы. Кастомный шаблон — это дополнительный файл с особым заголовком-комментарием, который расширяет набор доступных шаблонов.
Когда кастомный шаблон реально нужен:
- Лендинг или промо-страница. У страницы услуги другой хедер, свои секции, другая сетка — повторить это блоками в контенте сложно и неудобно.
- Страница с собственным циклом вывода. Например, «Отзывы» или «Наши проекты»: в контент страницы нужно вывести записи из отдельного типа записей, а не только текст из редактора.
- Уникальная вёрстка для контактов, вакансий, архивов акций. Любая страница, где обычный поток «заголовок + текст» недостаточен.
- Шаблон, который переиспользуется на нескольких страницах. Создали один файл «Лендинг услуги» — и назначаете его хоть десяти страницам, меняя только контент.
Когда шаблон не нужен: если достаточно добавить на страницу пару колонок или кнопку. Для этого есть блочный редактор — посмотрите, как создаются свои блоки Gutenberg, и, возможно, отдельный шаблон вам вообще не понадобится. Правило простое: уникальная PHP-логика и свой цикл вывода — шаблон; только оформление текста — блоки.
Как WordPress выбирает шаблон страницы: иерархия за две минуты
Прежде чем создавать файлы, важно понять порядок, в котором WordPress ищет шаблон для страницы. Это называется иерархия шаблонов. Для отдельной страницы (тип page) поиск идёт сверху вниз, и используется первый найденный файл:
- Кастомный шаблон, выбранный вручную. Если в метаполе
_wp_page_templateу страницы записано имя файла — берётся оно. Это самый высокий приоритет. page-{slug}.php— файл, названный по ярлыку страницы. Для страницы с адресом/o-kompanii/WordPress проверит файлpage-o-kompanii.php.page-{id}.php— файл по числовому ID страницы, напримерpage-42.php.page.php— общий шаблон всех страниц.singular.php— общий шаблон любой одиночной записи.index.php— финальный запасной вариант, обязательный в любой теме.
Отсюда два практических вывода. Первый: если вы выбрали странице кастомный шаблон, файлы page-{slug}.php уже не сработают — ручной выбор всегда сильнее. Второй: имена файлов имеют значение. Если файл называется Page-Landing.php или лежит не в той папке, WordPress его просто не увидит, и никакой магии тут нет — только точные имена в нижнем регистре.
Кстати, тот же принцип иерархии работает и для остальных типов контента — подробности в статье про кастомные типы записей и таксономии.
Создаём свой шаблон за 5 минут: строка Template Name
Минимальный кастомный шаблон — это обычный PHP-файл, в шапке которого стоит комментарий с полем Template Name. Создайте в папке темы файл page-landing.php и вставьте в него:
<?php
/**
* Template Name: Лендинг услуги
*/
get_header();
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
the_content();
}
}
get_footer();
Всё — шаблон готов. Сохраните файл, зайдите в редактор страницы и назначьте шаблон:
- Блочный редактор (Gutenberg). В правой панели откройте вкладку «Страница» → внизу блок «Шаблон» → выберите «Лендинг услуги» из выпадающего списка.
- Классический редактор. В метабоксе «Атрибуты страницы» справа есть выпадающий список «Шаблон» — выберите нужный вариант и нажмите «Обновить».
После сохранения WordPress запомнит выбор в метаполе страницы, и при её открытии будет подключаться именно ваш файл. Обратите внимание: название шаблона после Template Name: — это то, что видит администратор в списке. Называйте понятно: «Лендинг услуги», «Отзывы клиентов», «Контакты с картой».
Если вместо своего содержимого вы увидите пустую страницу — почти всегда дело в отсутствии the_content() внутри цикла или в том, что файл лежит не в корне темы (об этом ниже).
Анатомия файла шаблона: get_header, цикл, get_footer
Минимальный шаблон из примера выше работает, но выглядит он как обычный page.php. Добавим собственную структуру. Типичный кастомный шаблон состоит из четырёх частей: подключение шапки и подвала темы, уникальная разметка, цикл с контентом и, при необходимости, свои запросы к базе данных.
<?php
/**
* Template Name: Лендинг услуги
*/
get_header();
?>
<div class="landing-hero">
<h1 class="landing-hero__title"><?php the_title(); ?></h1>
<p class="landing-hero__subtitle">Разработка сайтов под ключ — от идеи до запуска</p>
</div>
<div class="landing-content">
<?php
while ( have_posts() ) {
the_post();
// Текст, набранный в редакторе страницы.
the_content();
// Дополнительные секции, которых нет в стандартном page.php.
echo '<div class="landing-cta">';
echo '<a class="landing-cta__btn" href="#contact">Обсудить проект</a>';
echo '</div>';
}
?>
</div>
<?php get_footer(); ?>
Разберём построчно:
get_header()иget_footer()подключаютheader.phpиfooter.phpтемы — меню, стили и скрипты сайта останутся на месте. Их можно заменить наget_header( 'landing' ), если создадите файлheader-landing.phpс альтернативной шапкой.have_posts()иthe_post()— стандартный цикл WordPress. У страницы он всегда содержит одну запись — саму страницу.the_title()иthe_content()выводят заголовок и содержимое из редактора. Контент, набранный блоками, рендерится полностью, включая все ваши кастомные блоки.- Собственная разметка между этими вызовами — то, ради чего шаблон и создавался.
Не забывайте про безопасность при выводе данных: любые переменные экранируйте через esc_html(), esc_attr() или esc_url() — подробный разбор был в статье про безопасность WordPress для новичков.
Куда положить файл: тема, дочерняя тема, вложенная папка
WordPress ищет кастомные шаблоны в корне темы и на один уровень вложенности глубже. То есть файл может лежать прямо в wp-content/themes/ваша-тема/ или, например, в wp-content/themes/ваша-тема/page-templates/ — оба варианта сработают, а в списке шаблонов вложенная папка будет отображаться с префиксом.
А вот класть шаблон в текущую (родительскую) тему — плохая практика: при первом же обновлении темы файл будет удалён. Шаблоны, как и любые правки, должны жить в дочерней теме:
wp-content/themes/
└── twentytwentyfive-child/
├── style.css
├── functions.php
└── page-landing.php ← кастомный шаблон здесь
Если вы ещё не создали дочернюю тему — начните с этой статьи: дочерняя тема WordPress: как создать и зачем нужна. Это пять минут работы, а спасает от потери всех правок при обновлении. После добавления файла в дочернюю тему ничего активировать не нужно: WordPress сканирует обе папки (родительскую и дочернюю) и показывает шаблоны из обеих.
Ещё один нюанс: если шаблон не появляется в списке, проверьте кодировку файла (UTF-8 без BOM) и отсутствие вывода до заголовка-комментария — даже пустая строка перед <?php может привести к ошибкам «headers already sent».
Автошаблоны page-slug.php и page-id.php — без ручного выбора
Если уникальный дизайн нужен одной-единственной постоянной странице, её можно вообще не назначать вручную — WordPress сделает это за вас по имени файла.
Способ 1: page-{slug}.php. Страница имеет ярлык o-kompanii — создаёте файл page-o-kompanii.php в папке темы, и эта страница начинает его использовать автоматически. Внутри файла полноценный шаблон с тем же заголовком-комментарием или без него.
Способ 2: page-{id}.php. Аналогично работает файл вида page-42.php, где 42 — ID страницы (его видно в адресной строке при редактировании: post=42). Этот способ выручает, когда слаг страницы занят или вы не хотите привязываться к нему.
Минусы автопривязки стоит знать заранее:
page-{slug}.phpперестанет работать, если кто-то сменит ярлык страницы — а это легко сделать случайно при правке заголовка.page-{id}.phpне переносится между сайтами: на другом проекте у страницы будет другой ID.- Такой шаблон нельзя «отключить» — привязка действует, пока файл существует в теме.
Поэтому для страниц, состояние которых может меняться, надёжнее ручной выбор из раздела 3, а page-{slug}.php оставьте для фундаментальных страниц вроде «О компании» или «Контакты», которые создаются один раз и живут вечно.
Кастомный шаблон из плагина: theme_page_templates и template_include
Шаблоны в теме привязаны к теме: сменили оформление — шаблоны остались в старой папке. Если шаблон должен путешествовать вместе с функциональностью (например, у вас мультибрендовая сеть сайтов или вы передаёте проект заказчику), оформите его как мини-плагин. Здесь понадобятся два фильтра — если вы ещё не работали с хуками, сначала загляните в статью про хуки WordPress: actions и filters.
Создайте папку ds-page-templates в wp-content/plugins/, внутри — файл ds-page-templates.php:
<?php
/**
* Plugin Name: DS Page Templates
* Description: Добавляет кастомный шаблон страницы из плагина.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// 1. Регистрируем шаблон в выпадающем списке «Шаблон».
add_filter( 'theme_page_templates', 'ds_add_plugin_template' );
function ds_add_plugin_template( $templates ) {
$templates['ds-templates/landing.php'] = 'Лендинг услуги (плагин)';
return $templates;
}
// 2. Подключаем файл плагина, когда шаблон выбран у страницы.
add_filter( 'template_include', 'ds_load_plugin_template' );
function ds_load_plugin_template( $template ) {
$current = get_page_template_slug( get_queried_object_id() );
if ( is_page() && 'ds-templates/landing.php' === $current ) {
return plugin_dir_path( __FILE__ ) . 'templates/landing.php';
}
return $template;
}
Рядом создайте подпапку templates и положите туда landing.php — содержимое точно такое же, как у шаблона из раздела 4: get_header(), цикл, get_footer() и ваша разметка.
Как это работает: фильтр theme_page_templates добавляет строку ds-templates/landing.php в список, который WordPress показывает в редакторе. Когда администратор выбирает этот вариант, в метаполе страницы сохраняется именно эта строка. Фильтр template_include срабатывает в момент, когда WordPress уже понял, какой файл подключать, и подменяет путь на файл внутри плагина. Активируйте плагин — и шаблон появится в списке, независимо от того, какая тема включена.
Полезный бонус: get_page_template_slug( $post_id ) возвращает имя текущего шаблона страницы — им удобно пользоваться в условиях, например, чтобы скрыть сайдбар только на страницах с лендингом. Для этого пригодятся и приёмы из статьи про виджеты и сайдбары WordPress.
Динамический контент в шаблоне: WP_Query и произвольные поля
Главная сила кастомного шаблона — возможность вывести на странице то, чего нельзя добиться через редактор: записи из других типов контента, метаполя, повторяющиеся блоки. Стандартный сценарий — страница «Отзывы», которая тянет записи из отдельного типа записей:
<?php
/**
* Template Name: Отзывы клиентов
*/
get_header();
the_post();
the_content();
// Свой запрос: 10 последних записей типа «otzyv».
$query = new WP_Query( array(
'post_type' => 'otzyv',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
) );
if ( $query->have_posts() ) {
echo '<div class="reviews">';
while ( $query->have_posts() ) {
$query->the_post();
$rating = get_post_meta( get_the_ID(), '_ds_rating', true );
echo '<blockquote class="reviews__item">';
echo '<p>' . esc_html( get_the_title() ) . '</p>';
echo '<div class="reviews__text">' . wp_kses_post( get_the_content() ) . '</div>';
if ( $rating ) {
echo '<footer class="reviews__rating">Оценка: ' . (int) $rating . ' из 5</footer>';
}
echo '</blockquote>';
}
echo '</div>';
wp_reset_postdata();
}
get_footer();
Три момента, на которые смотрят новички с вопросом «а почему у меня не работает»:
- Вложенный цикл требует
wp_reset_postdata(). После$query->the_post()глобальные данные записи подменены. Без сброса всё, что выводится ниже (в том числе футер темы), может отображать данные последней записи из запроса. - Параметры
WP_Query— это массив. Стрелка=>(не->) связывает ключ и значение. Полный справочник по параметрам — в статье про WP_Query и продвинутую работу с запросами. - Произвольные поля читаются после их создания. Метаполя, добавленные вручную через
add_post_meta()или через плагин ACF, нужно сначала заполнить у страниц, иначеget_post_meta()вернёт пустую строку. Готовые приёмы работы с метаполями и конфигом собраны в статье про полезные сниппеты для functions.php.
Тот же приём работает и в обратную сторону: если внутри шаблона нужно вывести шорткод формы или галереи, используйте echo do_shortcode( '[contact-form-7 id="12"]' ) — синтаксис своих шорткодов разбирали в гайде про создание шорткодов WordPress.
Свои стили и скрипты только для нужного шаблона
Уникальная вёрстка обычно требует своих CSS и JS. Подключать их на всём сайте расточительно — правильнее загружать только там, где выбран шаблон. Код размещается в functions.php дочерней темы (не в самом файле шаблона — на момент его выполнения хук wp_enqueue_scripts уже отработал):
<?php
// Подключаем стили и скрипты лендинга только на страницах с шаблоном.
add_action( 'wp_enqueue_scripts', 'ds_landing_assets' );
function ds_landing_assets() {
if ( ! is_page_template( 'page-landing.php' ) ) {
return;
}
wp_enqueue_style(
'ds-landing',
get_stylesheet_directory_uri() . '/css/landing.css',
array(),
'1.0'
);
wp_enqueue_script(
'ds-landing',
get_stylesheet_directory_uri() . '/js/landing.js',
array(),
'1.0',
true
);
}
Здесь is_page_template( 'page-landing.php' ) проверяет, выбран ли у текущей страницы ваш файл шаблона; get_stylesheet_directory_uri() указывает на папку активной темы — в случае дочерней темы именно её, что нам и нужно. Параметр true у wp_enqueue_script() подключает скрипт перед </body>, а не в шапке.
Содержимое js/landing.js — маленький пример на чистом JavaScript: аккордеон вопросов на лендинге, где открытым остаётся только один пункт:
document.addEventListener( 'DOMContentLoaded', function () {
var items = document.querySelectorAll( '.landing-faq details' );
items.forEach( function ( item ) {
item.addEventListener( 'toggle', function () {
if ( ! item.open ) {
return;
}
items.forEach( function ( other ) {
if ( other !== item && other.open ) {
other.open = false;
}
} );
} );
} );
} );
Такой связки — PHP-условие плюс один маленький JS-файл — хватает для большинства лендингов: слайдеры, табы, «липкий» хедер добавляются по тому же принципу.
Типичные ошибки новичков и отладка шаблона
Кастомные шаблоны — одна из самых безопасных техник в WordPress: файл либо подключается, либо нет. Но несколько граблей новички обходят чаще всего:
- Белый экран после добавления файла. Причина — синтаксическая ошибка в PHP: незакрытая скобка, кавычка, точка с запятой. Включите
WP_DEBUGвwp-config.php, чтобы вместо белого экрана видеть текст ошибки и номер строки. - Шаблона нет в списке. Проверьте: файл лежит в корне темы или дочерней темы (или на один уровень глубже), имя файла в нижнем регистре, комментарий
Template Name:стоит сразу после<?phpи записан латиницей. - Выбрал шаблон, а страница не изменилась. Сначала очистите кэш — плагины кэширования и серверный кэш охотно отдают старую версию страницы; как устроено кэширование в WordPress, мы разбирали отдельно. Потом убедитесь, что редактировали ту самую страницу, а не её черновик.
- Съехала вёрстка. Шаблон выводит разметку вне стандартных обёрток темы — проверьте, какие классы контейнеров использует
page.phpвашей темы, и повторите их, чтобы работали базовые стили.
Для отладки полезно точно знать, какой файл обслуживает страницу. Добавьте в functions.php маленький сниппет — он напишет имя шаблона в HTML-комментарий в футере, но только для администраторов:
<?php
// Имя текущего файла шаблона в футере (видно только администраторам).
add_action( 'wp_footer', 'ds_show_current_template' );
function ds_show_current_template() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
global $template;
echo '<!-- template: ' . esc_attr( basename( $template ) ) . ' -->';
}
Откройте страницу, посмотрите исходный код (Ctrl+U), найдите в конце строку <!-- template: page-landing.php -->. Если её нет — шаблон не применился, и вы сразу поймёте, в какую сторону копать. На продакшене сниппет можно оставить: в HTML-комментарии нет ничего чувствительного, а видят его только вошедшие администраторы.
Сравнение способов: какой шаблон выбрать
Соберём четыре рабочих способа в одну таблицу — с ней проще выбрать подходящий вариант под свою задачу:
| Способ | Где живёт файл | Нужно выбирать вручную | Кому подходит |
|---|---|---|---|
Template Name в теме | Корень или вложенная папка темы / дочерней темы | Да, в редакторе страницы | Шаблон под несколько страниц: лендинги, отзывы, вакансии |
page-{slug}.php | Папка темы, имя по ярлыку страницы | Нет, подключается сам | Одна постоянная страница с уникальным дизайном («О компании») |
page-{id}.php | Папка темы, имя по ID страницы | Нет, подключается сам | Временное решение, когда слаг ненадёжен или занят |
| Шаблон из плагина | Папка плагина, подключение через template_include | Да, в редакторе страницы | Переносимость между темами и проектами, клиентские сайты |
Для первого знакомства начните с ручного шаблона в дочерней теме — это самый наглядный вариант. По мере роста проекта часть шаблонов переедет в плагины, а часть постоянных страниц — в автопривязку по слагу.

Вывод: что запомнить о кастомных шаблонах
Кастомный шаблон страницы — это PHP-файл с комментарием Template Name, который WordPress показывает в списке «Шаблон» в редакторе. Для новичка вся технология сводится к четырём шагам: создать page-landing.php в дочерней теме, написать шапку-комментарий, вывести get_header(), цикл с the_content() и get_footer(), затем выбрать шаблон у нужной страницы.
Когда освоите базу, двигайтесь дальше: автопривязка page-{slug}.php для постоянных страниц, шаблоны из плагинов для переносимости, WP_Query и метаполя для динамического контента. Больше практических разборов с кодом — в нашем блоге о разработке и продвижении сайтов, а примеры готовых проектов — в портфолио студии.
Если проект требует нестандартной страницы под ключ — лендинга, страницы отзывов, сложной формы — посмотрите услуги разработки сайтов или напишите нам через страницу контактов: сделаем шаблон любой сложности с аккуратным кодом.
Часто задаваемые вопросы
Нужно ли уметь программировать, чтобы создать кастомный шаблон страницы?
Нужен минимальный уровень: умение создать файл, скопировать код и поменять HTML-разметку внутри. Сам каркас шаблона — около десятка строк PHP, которые можно взять из этой статьи один в один. Сложная логика не обязательна: даже шаблон из шапки, цикла и подвала уже даёт уникальное оформление страницы.
Где WordPress ищет файлы кастомных шаблонов?
В папке активной темы и в дочерней теме — в корне и на один уровень вложенности глубже. Файл должен быть с расширением .php, имя в нижнем регистре, а внутри сразу после открывающего тега — комментарий с полем Template Name. Шаблоны из плагинов WordPress находит автоматически через фильтр theme_page_templates.
Почему мой шаблон не появляется в списке в редакторе страницы?
Чаще всего файл лежит слишком глубоко (два и более уровней вложенности), имя написано с заглавных букв или в файле есть вывод до комментария Template Name. Проверьте также, что файл сохранён в UTF-8 и что вы смотрите в правильное место: в блочном редакторе блок «Шаблон» находится в нижней части вкладки «Страница».
Чем кастомный шаблон отличается от конструктора страниц вроде Elementor?
Шаблон — это код в файлах темы: он быстрее, не тянет за собой тяжёлый плагин и полностью контролирует разметку. Конструктор удобен для редких правок силами контент-менеджера, но добавляет нагрузку и зависимости. Комбинированный подход: каркас страницы — шаблоном, а редактируемые тексты — через блоки или метаполя.
Можно ли сделать, чтобы шаблон применялся ко всем страницам одного раздела автоматически?
Да. Для одной страницы подойдёт автопривязка page-{slug}.php или page-{id}.php. Для целого раздела используют условные теги в page.php или фильтр template_include: например, проверка принадлежности страницы к дереву родительской страницы через get_post_ancestors и подмена шаблона сразу для всего раздела.
Как узнать, какой шаблон используется на конкретной странице сейчас?
Самый быстрый способ — сниппет из раздела 10 этой статьи: он пишет имя файла шаблона в HTML-комментарий в футере для администраторов. Альтернативы: плагин Query Monitor (панель показывает и шаблон, и все запросы) или просмотр метаполя _wp_page_template через редактор базы данных.



