Дочерние темы
Готовую тему почти всегда хочется подправить: изменить подвал, добавить блок, поменять цвета. Если править файлы самой темы, первое же её обновление сотрёт все изменения. Правильный способ — дочерняя тема: она берёт всё у родительской и хранит только отличия.
Создание
Создайте папку рядом с родительской темой, например wp-content/themes/mytheme-child, и в ней файл style.css:
/*
Theme Name: My Theme Child
Template: mytheme
Version: 1.0.0
Text Domain: mytheme-child
*/
.site-footer {
background: #222;
color: #fff;
}Строка Template — имя папки родительской темы. Это единственное, что делает тему дочерней. Включите её в разделе «Внешний вид → Темы».
Подключение стилей
// functions.php (дочерняя тема)
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style('mytheme-parent', get_template_directory_uri() . '/style.css');
wp_enqueue_style(
'mytheme-child',
get_stylesheet_uri(),
['mytheme-parent'],
wp_get_theme()->get('Version'),
);
});Стили дочерней темы подключаются после родительских и перекрывают их.
Замена шаблона
Чтобы изменить шаблон, скопируйте файл из родительской темы в дочернюю с тем же именем и путём — и правьте копию:
mytheme/footer.php → mytheme-child/footer.php
mytheme/template-parts/card.php → mytheme-child/template-parts/card.phpWordPress сначала ищет файл в дочерней теме и только потом — в родительской. Это работает и для частей шаблона, если родительская тема подключает их через get_template_part().
functions.php не заменяется
В отличие от шаблонов, functions.php дочерней темы не заменяет родительский, а выполняется перед ним. Поэтому в нём пишут только добавления и изменения — через хуки:
// functions.php (дочерняя тема)
add_filter('excerpt_length', fn () => 30, 20);
add_action('after_setup_theme', function () {
remove_action('wp_footer', 'mytheme_print_credits');
}, 20);Приоритет 20 гарантирует, что код выполнится после родительского с приоритетом 10.
Два адреса, две папки
| Функция | Что возвращает |
|---|---|
get_template_directory() | Папку родительской темы |
get_stylesheet_directory() | Папку активной темы — дочерней |
get_template_directory_uri() | Адрес родительской темы |
get_stylesheet_directory_uri() | Адрес дочерней темы |
get_theme_file_uri('assets/logo.svg') | Адрес файла: из дочерней темы, а если его там нет — из родительской |
Когда дочерняя тема не нужна
Свою собственную тему дочерней оборачивать незачем: её не затрёт чужое обновление. Не нужна дочерняя тема и ради пары строк CSS — их можно вписать в «Внешний вид → Настроить → Дополнительные стили». А возможности, не связанные с оформлением, — типы записей, шорткоды — пишут в плагине.
Частая ошибка
Если в родительской теме функция объявлена без проверки function_exists(), объявить функцию с тем же именем в дочерней нельзя — будет фатальная ошибка «Cannot redeclare». Поведение меняют не повторным объявлением, а хуками: снимите родительскую функцию через remove_action() или remove_filter() и подключите свою.