Как заставить мою дочернюю тему повторно применять настройки, которые были настроены, когда ее родитель был активен?

17

сценарий

  1. Выберите тему 2015 года. Настройте различные параметры, такие как фоновое изображение, изображение заголовка, название сайта и слоган.
  2. Но не трогайте содержимое файлов темы.
  3. Используйте дочерние темы Кодекса, чтобы создать минимальную дочернюю тему темы 2015 года.
  4. Активируйте новую дочернюю тему.

К сожалению?

Сайт с этой минимальной дочерней темой выглядит совершенно иначе, чем родительская. Фон и изображение заголовка исчезли, и были активированы всевозможные виджеты боковой панели (или заголовка), которые не были активны (по умолчанию) в родительской теме 2015 года.

Оригинальный внешний вид сайта с несколькими индивидуальными настройками для темы 2015 года:

SofietjeWonders с настроенной темой 2015

Сайт выглядит так, как style.cssбудто он является дочерней темой 2015 года, которая имеет только необходимый заголовок и содержит только стили, предложенные на странице «Дочерняя тема» Кодекса function.php.

введите описание изображения здесь

Вопрос

Как сделать так, чтобы при активации дочерней темы сохранялись настройки и значения по умолчанию родительской темы?

В этом случае: заголовок и фоновые рисунки и удаление (деактивация?) Виджетов по умолчанию (боковая панель / заголовок).


Примечания

Создание дочерней темы уже тяжелой настраиваемой темы может звучать как дубликат, но речь идет о настройках путем редактирования файлов темы.

Этот вопрос При активации дочерней темы, какие основные настройки должны быть сброшены, т.е. Пользовательские меню и т. Д.? кажется, спрашивают точно, что я, кажется, после. К сожалению, единственный ответ размышляет о несоответствии в функциях, что не так для меня и не принимало во внимание комментарий ОП к тому же эффекту.

Я также посмотрел на

Марьян Венема
источник

Ответы:

9

Я дал +1 к ответу @ webtoure, потому что он дает правильное направление, однако я думаю, что ему не хватает некоторых проверок.

Прежде всего, он не проверяет, является ли активируемая тема дочерней, и не проверяет, является ли ранее активная тема родительской темой активируемой дочерней темы.

По моему пониманию ОП эти условия обязательны.

Кроме того, одна проблема, которую необходимо учитывать, - что делать с модами темы активируемой дочерней темы, если они уже существуют.

В ответе @webtoure они хранятся в резервной копии, которая может спасти вас при некоторых обстоятельствах, но WordPress не распознает их по умолчанию, поэтому для их использования требуется дополнительный код.

Я думаю, что было бы лучше, чтобы наследовать модификации темы от родительской темы только при первой активации дочерней темы.

Короче говоря, условия, которые я хочу проверить, чтобы наследовать моды темы от родительской темы:

  • ранее активная тема должна быть родителем дочерней темы, которая активируется
  • активируемая дочерняя тема никогда ранее не активировалась

Для обеспечения второго условия я буду использовать пользовательский параметр, потому что WordPress не предоставляет способ сделать эту проверку.

Это код, пожалуйста, прочитайте встроенные комментарии для объяснения того, что происходит:

add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {

    // get the previously active theme
    $previous = get_option( 'theme_switched', -1 );

    // get the parent of current theme, will be false if no parent
    $parent = $new_theme->parent() ? $new_theme->get_template() : false;

    // current stylesheet name
    $stylesheet = get_option( 'stylesheet' );

    // has the theme being activated ever been activated before?
    $lastActive = get_option( $stylesheet . '_last_active', false );

    // if previouly active theme is the parent of the the child theme being activated
    // and it has never been activated before..
    if ( ! $lastActive && $parent === $previous ) {

        // update "last_active" option so following code won't run again for this theme
        update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );

        // get the theme mods of the parent
        $previousMods = get_option( 'theme_mods_' . $parent, array() );

        // inherit current theme mods from parent theme mods
        update_option( 'theme_mods_' . $stylesheet, $previousMods );
    }

}, 10, 2 );
Gmazzap
источник
Ваш первый интересный вопрос не совсем оправдан: если текущая тема не является дочерней, то get_templateпросто вернет имя dir текущей темы. Вам не нужно знать связь между ранее активной темой и текущей: если у темы есть родитель, она загружает эти настройки, иначе она просто загружает свои собственные настройки. Я согласен, однако, с вашим вторым пунктом, который касается вопроса перезаписи настроек.
веб-тур
Кроме того, что если пользователь случайно активирует другую тему, прежде чем активировать нужную дочернюю тему? Код не будет работать, и отношение ( theme_switched, current_theme) не имеет значения для начала.
веб-тур
1
@MarjanVenema Я буду очень рад, если вы отдадите награду за веб-тур .
gmazzap
1
@MarjanVenema gmazzap фактически предоставил комментарии для своего мыслительного процесса, а также предложил исправление к моему фрагменту. Я думаю, что если кто-то заслуживает награды, то это он. Также я не отвечаю на вопросы по совершенно бесполезным пунктам. Я люблю: общение с людьми, проблемы и вообще помощь, когда могу.
webtoure
1
Пожалуйста, принимайте расширенные обсуждения в чате, комментарии не предназначены для них. :)
Rarst