Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Дочерние темы

Готовую тему почти всегда хочется подправить: изменить подвал, добавить блок, поменять цвета. Если править файлы самой темы, первое же её обновление сотрёт все изменения. Правильный способ — дочерняя тема: она берёт всё у родительской и хранит только отличия.

Создание

Создайте папку рядом с родительской темой, например 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.php

WordPress сначала ищет файл в дочерней теме и только потом — в родительской. Это работает и для частей шаблона, если родительская тема подключает их через 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() и подключите свою.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.