Как перенести настройки из родительской темы в дочернюю в WordPress

Как перенести настройки из родительской темы в дочернюю в WordPress

После включения дочерней темы часто пропадают цвета, логотип, шапка, меню в кастомайзере и настройки из панели темы. Это не поломка: WordPress хранит настройки кастомайзера отдельно для каждой темы, по её папке. У дочерней темы своя папка, а значит, и свой пустой набор настроек. Ниже способы перенести настройки с родительской темы на дочернюю для классических тем вроде WoodMart и отдельно для блочных.

Почему настройки не переезжают сами

Кастомайзер пишет всё в одну опцию theme_mods_{папка темы}. Это видно в коде get_theme_mods(): WordPress берёт имя активной темы из опции stylesheet и читает theme_mods_ с этим именем. Для WoodMart это theme_mods_woodmart, для дочерней темы theme_mods_woodmart-child. Дочерняя тема наследует шаблоны и стили родителя, но настройки из базы автоматически не копирует.

Есть ещё одна деталь. При первом переключении на новую тему switch_theme() сразу создаёт для неё theme_mods_ и кладёт туда расположения меню и виджеты. То есть настройки дочерней темы после активации уже не пустые, и это важно для кода ниже. Панели тем на Redux, Kirki и своих движках часто хранят опции отдельно, у каждой темы по-своему.

Способ 1: экспорт и импорт в панели темы

У многих коммерческих тем, включая WoodMart и Flatsome, есть свой экспорт настроек. Порядок такой:

  • При активной родительской теме откройте панель настроек темы и найдите раздел импорта и экспорта.
  • Выгрузите настройки в файл и сохраните его.
  • В разделе «Внешний вид» → «Темы» активируйте дочернюю тему.
  • Снова откройте панель темы и загрузите файл.

Так переносятся именно опции панели темы. Настройки стандартного кастомайзера при этом могут остаться на месте, их переносим следующим способом.

Способ 2: плагин Customizer Export/Import

Для настроек кастомайзера удобен плагин Customizer Export/Import от команды Beaver Builder. Он живой: больше 100 000 установок, обновлялся в июне 2026 года. Плагин выгружает theme_mods и настройки кастомайзера, сохранённые обычными опциями, а файл подходит для той же темы или её дочерней.

  • Установите плагин из каталога.
  • При активной родительской теме откройте «Внешний вид» → «Настроить», раздел Export/Import, нажмите Export.
  • Активируйте дочернюю тему.
  • Снова откройте кастомайзер, в том же разделе загрузите файл и нажмите Import. Можно отметить загрузку картинок, тогда плагин подтянет и их.

Способ 3: WP-CLI

Если есть доступ к серверу, это самый быстрый и предсказуемый путь. Сначала сделайте бэкап базы. Команда wp option update без значения читает его из стандартного ввода, поэтому опцию можно переложить через файл:

# какие наборы настроек тем есть в базе
wp option list --search='theme_mods_*' --fields=option_name

# выгрузить настройки родителя и записать их дочерней теме
wp option get theme_mods_woodmart --format=json > /tmp/parent-mods.json
wp option update theme_mods_woodmart-child --format=json < /tmp/parent-mods.json

# или одной строкой
wp eval 'update_option( "theme_mods_woodmart-child", get_option( "theme_mods_woodmart" ) );'

Без WP-CLI то же самое делается одним запросом в phpMyAdmin или Adminer. Значение копируется целиком, поэтому сериализованный массив не ломается. Префикс таблиц у вас может быть не wp_, а строку дочерней темы, которую WordPress создал при активации, сначала удаляем:

DELETE FROM wp_options WHERE option_name = 'theme_mods_woodmart-child';
INSERT INTO wp_options (option_name, option_value, autoload)
SELECT 'theme_mods_woodmart-child', option_value, autoload
FROM wp_options WHERE option_name = 'theme_mods_woodmart';

Править сериализованное значение руками в текстовом поле не стоит: там записана длина каждой строки, и одна лишняя буква ломает весь массив.

Способ 4: код в functions.php дочерней темы

Можно поручить перенос самой теме. Хук after_switch_theme срабатывает при первой загрузке после переключения. Код ниже один раз сливает настройки родителя с тем, что WordPress уже записал дочерней теме, так что меню и виджеты не теряются. Имена тем подставляются сами через get_template() и get_stylesheet().

function krv_copy_parent_mods() {
    if ( get_option( 'krv_child_mods_copied' ) ) {
        return;
    }
    $parent = get_option( 'theme_mods_' . get_template() );
    if ( is_array( $parent ) ) {
        $child = (array) get_option( 'theme_mods_' . get_stylesheet(), array() );
        update_option( 'theme_mods_' . get_stylesheet(), array_merge( $parent, $child ) );
    }
    update_option( 'krv_child_mods_copied', 1 );
}
add_action( 'after_switch_theme', 'krv_copy_parent_mods' );

В старом варианте этого кода перенос выполнялся, только если настройки дочерней темы пустые. Но WordPress при активации сразу пишет туда меню и виджеты, поэтому на сайте с настроенным меню такой код молча ничего не делал. После переноса код можно убрать.

Блочные темы: стили и шаблоны из редактора сайта

У блочных тем основная часть настроек живёт не в кастомайзере. Стили и изменённые шаблоны из редактора сайта WordPress хранит записями в базе, привязанными к теме, и в руководстве по дочерним темам они вынесены отдельным слоем пользовательских изменений поверх родительской и дочерней темы. Простое переключение на новую дочернюю тему их не переносит.

Проще всего создать дочернюю тему официальным плагином Create Block Theme от WordPress.org. Он умеет делать дочернюю тему от активной родительской и сохраняет в неё изменения, сделанные в редакторе сайта.

Что проверить после переноса

  • Меню: сами меню общие для всех тем, но их привязку к местам в теме иногда нужно заново сохранить в «Внешний вид» → «Меню».
  • Виджеты: если дочерняя тема меняет id сайдбаров, виджеты уедут в неактивные.
  • Дополнительный CSS из кастомайзера лежит отдельной записью, а в theme_mods хранится её номер (custom_css_post_id), его wp_get_custom_css_post() и использует. Поэтому при копировании theme_mods он тоже подхватывается.
  • Кэш: после переноса сбросьте кэш страниц и объектов и откройте сайт и кастомайзер уже под дочерней темой.
  • Всё это сначала на копии сайта, потом на рабочем.

В итоге настройки классической темы привязаны к папке темы в theme_mods и к опциям её панели. Переносятся они экспортом в панели темы, плагином Customizer Export/Import, WP-CLI или запросом в базу, либо одноразовым хуком в дочерней теме. Для блочных тем дочернюю тему лучше создавать через Create Block Theme. И в любом случае начинать с бэкапа.

Источники и ссылки


Комментарии загружаются…