Jak sprawić, by motyw potomny ponownie zastosował ustawienia, które zostały dostosowane, gdy jego rodzic był aktywny?

17

Scenariusz

  1. Wybierz motyw 2015. Dostosuj różne ustawienia, takie jak obraz tła, obraz nagłówka, nazwa witryny i slogan.
  2. Ale nie dotykaj zawartości żadnego z plików motywu.
  3. Użyj motywów potomnych Codex, aby stworzyć minimalny motyw potomny motywu 2015.
  4. Aktywuj nowy motyw potomny.

Ups

Witryna z włączonym minimalnym motywem potomnym wygląda zupełnie inaczej niż motyw nadrzędny. Obraz tła i nagłówka zniknął, a wszystkie widżety paska bocznego (lub nagłówka) zostały aktywowane, które nie były aktywne (domyślnie) w nadrzędnym motywie 2015.

Oryginalny wygląd strony z kilkoma dostosowanymi ustawieniami dla motywu 2015:

SofietjeWonders z dostosowanym motywem 2015

Witryna wygląda z motywem potomnym pochodzącym z motywu 2015, który ma tylko wymagany nagłówek style.cssi kolejkuje style tylko zgodnie z sugestią zawartą w stronie Motyw potomny Kodeksu function.php.

wprowadź opis zdjęcia tutaj

Pytanie

Jak to zrobić, aby aktywowanie motywu podrzędnego zachowało dostosowania i ustawienia domyślne motywu nadrzędnego?

W tym przypadku: zdjęcia nagłówka i tła oraz usunięcie (dezaktywacja?) Domyślnych widżetów (pasek boczny / nagłówek).


Notatki

Utwórz motyw podrzędny już ciężkiego dostosowanego motywu może brzmieć jak duplikat, ale dotyczy dostosowań poprzez edycję plików motywu.

To pytanie Kiedy aktywujesz motyw potomny, jakie podstawowe ustawienia należy zresetować, tj. Menu niestandardowe itp.? wydaje się, że pytam dokładnie, po co wyglądam. Niestety, jedyna odpowiedź spekuluje na temat niedopasowania funkcji, co nie jest w moim przypadku i nie odebrało komentarza OP w tym samym celu.

Też spojrzałem

Marjan Venema
źródło

Odpowiedzi:

9

Dałem +1 do odpowiedzi @ webtoure, ponieważ daje właściwy kierunek, ale myślę, że brakuje w nim niektórych czeków.

Po pierwsze, nie sprawdza, czy motyw, który jest aktywowany, jest motywem podrzędnym, ani nie sprawdza, czy motyw wcześniej aktywny jest motywem nadrzędnym aktywowanego motywu podrzędnego.

Dla mojego zrozumienia PO wymagane są te warunki.

Ponadto jedną kwestią, którą należy wziąć pod uwagę, jest to, co zrobić z aktywowanymi modami motywu motywu potomnego, jeśli już istnieją.

W odpowiedzi na @webtoure są one przechowywane w kopii zapasowej, która w niektórych okolicznościach może cię uratować, ale WordPress domyślnie ich nie rozpoznaje, więc wymagają użycia dodatkowego kodu.

Myślę, że lepiej byłoby dziedziczyć modyfikacje motywu tylko z motywu nadrzędnego przy pierwszym uruchomieniu motywu potomnego.

Krótko mówiąc, warunki, które chcę sprawdzić przed odziedziczeniem modów motywu z motywu nadrzędnego to:

  • poprzednio aktywny motyw musi być rodzicem motywu potomnego, który jest aktywowany
  • aktywowany motyw potomny nigdy wcześniej nie był aktywowany

Aby zapewnić drugi warunek, użyję niestandardowej opcji, ponieważ WordPress nie zapewnia sposobu na sprawdzenie tego.

To jest kod, proszę przeczytać komentarze w celu wyjaśnienia, co się dzieje:

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
źródło
Twój pierwszy problem nie jest tak naprawdę uzasadniony: jeśli bieżący motyw nie jest motywem potomnym get_template, po prostu zwróci nazwę katalogu bieżącego motywu. Nie musisz znać relacji między wcześniej aktywnym motywem a bieżącym: jeśli motyw ma rodzica, ładuje te ustawienia, w przeciwnym razie po prostu ładuje własne ustawienia. Zgadzam się jednak z twoim drugim punktem, który dotyczy kwestii nadpisywania ustawień.
webtoure
Co więcej, jeśli użytkownik przypadkowo aktywuje inny motyw przed aktywacją pożądanego motywu podrzędnego? Kod nie będzie działał, a relacja ( theme_switched, current_theme) nie ma znaczenia na początek.
webtoure
1
@MarjanVenema Będę bardzo szczęśliwy, jeśli dasz nagrodę za webtoure .
gmazzap
1
@MarjanVenema gmazzap faktycznie przedstawił komentarze do swojego procesu myślowego, a także zasugerował poprawienie mojego fragmentu. Myślę, że jeśli ktoś zasługuje na nagrodę, to on. Poza tym nie odpowiadam na pytania zupełnie bezużyteczne. Uwielbiam: kontaktować się z ludźmi, wyzwania i ogólnie pomagać, kiedy tylko mogę.
webtoure
1
Rozmawiaj na czacie przez dłuższy czas, komentarze nie są dla nich przeznaczone. :)
Rarst,