Як змусити тему моєї дитини повторно застосувати налаштування, які були налаштовані, коли її батько був активним?


17

Сценарій

  1. Виберіть тему 2015 року. Налаштуйте різні налаштування, такі як фонове зображення, зображення заголовка, назва сайту та мітка.
  2. Але не торкайтеся вмісту файлів теми.
  3. Використовуйте Codex 'Теми для дітей, щоб створити мінімальну дитячу тему теми 2015 року.
  4. Активуйте нову дочірню тему.

На жаль

Сайт з активованою мінімальною дочірньою темою виглядає зовсім інакше, ніж батьківська тема. Зникла фонове та заголовне зображення, і активовано всі способи віджетів бічної панелі (або заголовка), які не були активними (за замовчуванням) у батьківській темі 2015 року.

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

SofietjeWonders зі спеціалізованою темою 2015 року

Сайт, як це виглядає, з дочірньою темою 2015 року, яка має лише необхідний заголовок style.cssі лише перетворює стилі, як запропоновано на сторінці «Дочірня тема» Кодексу 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 );

Перша ваша стурбованість не є дійсно виправданою: якщо поточна тема не є дочірньою темою, тоді get_templateвона просто поверне ім’я режисера поточної теми. Вам не потрібно знати зв’язок між раніше активною темою та поточною: якщо тема має батьківський, вона завантажує ці налаштування, інакше вона просто завантажує власні налаштування. Я погоджуюся, хоча з вашим другим пунктом, який стосується проблеми перезаписаних налаштувань.
webtoure

Крім того, що робити, якщо користувач випадково активує іншу тему, перш ніж активувати бажану дочірню тему? Код не буде працювати, а відношення ( theme_switched, current_theme) не має значення для початку.
webtoure

1
@MarjanVenema Я буду дуже радий, якщо ти даруєш нагороду webtoure .
gmazzap

1
@MarjanVenema gmazzap фактично надав коментарі до свого роздуму, а також запропонував виправити мій фрагмент. Я думаю, якщо хтось заслуговує на винагороду, це він. Крім того, я не відповідаю на запитання щодо абсолютно марних моментів. Я люблю: спілкуватися з людьми, виклики і взагалі допомагати, коли можу.
webtoure

1
Будь ласка, проводите розширені дискусії для спілкування, коментарі для них не призначені. :)
Рарст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.