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

После активации дочерней темы часто «слетают» цвета, логотип, меню в кастомайзере и опции theme options. Это не баг дочерней темы как таковой: WordPress хранит mods и часть настроек привязанными к stylesheet-имени активной темы. Ниже – рабочие способы перенести настройки с родителя на child без потери кастомизации.

Почему настройки не подхватываются сами

Кастомайзер пишет в option вида theme_mods_{stylesheet}. Для родителя это, например, theme_mods_woodmart, для child – theme_mods_woodmart-child (имя = directory slug темы). При переключении на child WordPress читает уже другой ключ. Отдельные theme options (Redux, Kirki, собственные option_name) тоже часто завязаны на slug или на «активную тему» в логике вендора.

Дочерняя тема наследует PHP-шаблоны и style родителя, но не автоматически копирует сериализованные mods из БД. Их нужно перенести явно.

1. Встроенный импорт/экспорт theme options

Многие коммерческие темы (WoodMart, Flatsome, GeneratePress Premium и другие) умеют выгрузить свои панели настроек в JSON или файл.

Экспорт с родителя

  1. Активна родительская тема (или child уже активен, но экспорт берёте с той конфигурации, где всё «как надо»).
  2. Откройте панель темы, например WoodMart → Настройки.
  3. Раздел Импорт/Экспорт (или Backup / Import Export).
  4. Экспортируйте JSON/файл и сохраните локально.

Активация child и импорт

  1. Внешний вид → Темы – активируйте дочернюю тему.
  2. Снова откройте панель настроек темы.
  3. Импортируйте сохранённый файл.

Плюс: просто и покрывает опции именно этой темы. Минус: не у всех тем есть экспорт; кастомайзер WordPress и меню/виджеты могут остаться отдельной историей.

2. Плагин Customizer Export/Import

Если нужно перенести именно mods кастомайзера (цвета, логотип, типографика, части header/footer builder, что лежит в theme_mods_*), удобен плагин Customizer Export/Import.

  1. Плагины → Добавить – установите и активируйте Customizer Export/Import.
  2. При активной родительской теме: Внешний вид → Настроить → блок Export/Import → Export.
  3. Активируйте дочернюю тему.
  4. Снова Настроить → Import, загрузите файл. При необходимости отметьте загрузку связанных изображений, если плагин это предлагает.

Плагин копирует mods кастомайзера. Опции вне Customizer (отдельные option_name theme panel) им могут не покрываться – для них см. п. 1 или ручной перенос.

3. Ручной перенос через базу (theme_mods)

Когда нет UI-экспорта, mods можно скопировать в wp_options (префикс таблицы у вас может отличаться от wp_).

Найти ключ родителя

В phpMyAdmin, Adminer или через CLI:

SELECT option_id, option_name, LENGTH(option_value) AS len
FROM wp_options
WHERE option_name LIKE 'theme_mods_%';

Или точечно для WoodMart:

SELECT * FROM wp_options
WHERE option_name LIKE '%theme_mods_woodmart%';

Нужна строка theme_mods_woodmart (или slug вашей родительской темы). Значение – сериализованный PHP-массив; править «на глаз» в текстовом редакторе опасно из-за длин строк в serialize.

Скопировать значение на child-ключ

Безопаснее не руками в serialize, а через WP-CLI / PHP API (см. ниже). Если всё же через SQL: сделайте полный бэкап БД, затем либо:

  • экспорт строки option → вставка новой строки с option_name = theme_mods_woodmart-child и тем же option_value;
  • либо UPDATE существующей пустой theme_mods_woodmart-child, подставив value родителя.

Имя child должно совпадать с каталогом темы (как в wp-content/themes/woodmart-childtheme_mods_woodmart-child).

4. Копирование через PHP при switch_theme

Чтобы при первой активации child подтянуть mods родителя, можно повесить обработчик (в mu-plugin или временно в functions.php child; имена тем замените на свои):

function copy_theme_mods_to_child() {
    $parent_slug = 'woodmart';
    $child_slug  = 'woodmart-child';

    $parent_mods = get_option( 'theme_mods_' . $parent_slug );
    $child_mods  = get_option( 'theme_mods_' . $child_slug );

    if ( $parent_mods && ( false === $child_mods || $child_mods === array() ) ) {
        update_option( 'theme_mods_' . $child_slug, $parent_mods );
    }
}
add_action( 'after_switch_theme', 'copy_theme_mods_to_child' );

after_switch_theme срабатывает после переключения; проверка «child ещё пустой» не затирает уже накопленные настройки child. Для разового переноса на проде часто достаточно WP-CLI без постоянного хука.

5. WP-CLI: быстро и предсказуемо

На сервере с WP-CLI:

# посмотреть mods родителя
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

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

После этого сбросьте кэш объекта/страниц, откройте фронт и кастомайзер под child.

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

  • Меню и расположенияtheme_mods содержит nav_menu locations; сами меню в wp_terms общие, но привязки к theme location иногда нужно заново сохранить в Внешний вид → Меню.
  • Виджеты – сайдбары зависят от sidebars_widgets и id зарегистрированных sidebar; если child меняет id зон, виджеты «пропадают» в Inactive.
  • Отдельные option_name темы (не mods) – ищите в wp_options по префиксу вендора и переносите так же, если документация темы это допускает.
  • Кастомный CSS из кастомайзера – обычно внутри theme_mods; дополнительный CSS плагинов живёт отдельно.

Практические советы

  • Перед любым SQL/массовым update – бэкап БД и файлов.
  • Сначала стейдж или копия сайта, потом прод.
  • Не правьте serialize вручную, если не уверены в длинах полей.
  • После переноса откройте кастомайзер, нажмите «Опубликовать» один раз – так тема пересоберёт CSS/кэш опций, если вендор так делает.
  • Долгосрочный child: правки в PHP/CSS child, настройки – в mods child; родитель обновляйте без перезаписи child-каталога.

Краткий итог

Настройки «привязаны» к slug темы в theme_mods_* и к option_name панелей. Перенос: (1) export/import темы, (2) Customizer Export/Import, (3) копирование option через WP-CLI/PHP/SQL, (4) хук при активации child. Выбирайте самый простой путь, который покрывает ваш стек, и всегда работайте с бэкапом.

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


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