Zachowanie ustawień motywu w motywie potomnym

10

Mój klient używa motywu Karma z wieloma ustawieniami w opcjach motywu. Muszę zachować moje dodatki CSS i PHP w motywie potomnym, aby aktualizacje motywu nie zniszczyły go. Jednak po wybraniu motywu potomnego w opcji Wygląd> Motywy wszystkie główne ustawienia motywu zniknęły.

Czy jest jakiś sposób na zachowanie głównych ustawień motywu?

drake035
źródło
co masz na myśli mówiąc „odszedł”? Jeśli możesz przełączyć się z powrotem na motyw nadrzędny, a ustawienia już tam są, to ich nie ma
Mark Kaplun,
To znaczy odszedł z deski rozdzielczej i strony internetowej. Nadal istnieją gdzieś w bazie danych, ale to nie dotyczy mojego problemu.
drake035
więc jaki masz problem? zapytałeś „Czy jest jakiś sposób na zachowanie głównych ustawień motywu?” a ponieważ nadal są w DB, są zachowane
Mark Kaplun
„Zachowane” oznacza obecne w motywie potomnym. Podczas przełączania motywu nadrzędnego na podrzędny chcę, aby ustawienia podrzędne były takie same jak ustawienia nadrzędne.
drake035
następnie skopiuj je. Muszę przyznać, że wciąż nie rozumiem, na czym dokładnie polega problem, który próbujesz rozwiązać. wygląda na to, że próbujesz skomplikować swoje życie lub twoje podejście do tworzenia motywu podrzędnego jest niewłaściwe i lepiej zmodyfikuj motyw nadrzędny (lub może być tak, że motyw nadrzędny nie nadaje się do zastosowania w motywach podrzędnych)
Mark Kaplun

Odpowiedzi:

11

Ze względu na sposób, w jaki te ustawienia motywu są przechowywane jako tablica w bazie danych, może być trudno skopiować je za pomocą kopiowania i wklejania w phpmyadmin lub innej podobnej taktyce.

Polecenie opcji WP CLI jest tutaj twoim przyjacielem. Jeśli jeszcze nie korzystasz z WP CLI, sprawdź to! Oto jak skopiowałem ustawienia z motywu sklepu do motywu o nazwie storefront-sqcdy-child:

# save the existing theme settings in json format in a temporary text file
wp option get theme_mods_storefront --format=json > theme_mods_storefront.txt

# load the saved settings into the child theme option record in the database
wp option update theme_mods_storefront-sqcdy-child --format=json < theme_mods_storefront.txt

# cleanup the temp file
rm -f theme_mods_storefront.txt
Squarecandy
źródło
Jako drugi wiersz powinieneś również użyć potoku opcja wp aktualizacja update_mods_storefront-sqcdy-child --format = json <theme_mods_storefront.txt
Gregor
Tak, przypuszczam, że to bardziej standardowy sposób na zrobienie tego ...
squarecandy
Cześć, Squarecandy, powiedziałeś „kopiowanie i wklejanie może być trudne”, ale operacja, którą wykonujesz, wydaje mi się taka sama. Czy się mylę?
Marco Panichi
@MarcoPanichi - jest zdecydowanie inaczej, ponieważ WP CLI robi wiele fantazyjnych rzeczy, których nigdy nie widzisz w prawidłowy sposób odserializowanych / ponownie serializowanych danych. Jeśli po prostu skopiujesz wartości i spróbujesz zmienić rzeczy bezpośrednio w bazie danych za pomocą komend MySQL lub phpmyadmin, prawdopodobnie coś zepsujesz.
squarecandy
1
Zobacz wpengine.com/support/wordpress-serialized-data - sekcja „Potencjalne konflikty”, aby dowiedzieć się, dlaczego nie możesz po prostu skopiować wartości zserializowanej i oczekiwać, że będzie działać przez 100% czasu. WP CLI dba o to wszystko za Ciebie.
squarecandy
6

Modyfikacje motywów Wordpress są zapisywane w wp_optionstabeli bazy danych w theme_mods_{themename}polu. Możesz go skopiować i zmienić nazwę, używając nazwy motywu podrzędnego.

andrejm
źródło
1
A kiedy motyw macierzysty zostanie zaktualizowany i doda nowe opcje, co wtedy zrobisz?
Mark Kaplun
1
Jaka jest lepsza opcja @MarkKaplun? Myślę, że to rozwiązuje problem, o który pyta użytkownik
Eoin,
1
@ Dołącz do im więcej pytań na temat dziecięcych tematów, tym mniej lubię ich ograniczenia. Wygląda na to, że przy każdej nietrywialnej zmianie motywu nadrzędnego będziesz musiał ponownie ocenić kod motywu podrzędnego. Jeśli wszystko, co robisz, to CSS, nie ma większego problemu, ale do wszystkiego innego konieczna jest ponowna ocena. OP tutaj musi upewnić się, że synchronizuje opcje z motywem nadrzędnym przy każdej aktualizacji (w przypadku dodania nowej opcji z niepustą wartością domyślną). Odradzam używanie motywów potomnych i zamiast tego używam git do rozgałęziania „rodzica” i łączenia, gdy są aktualizacje.
Mark Kaplun
Kiedy mówisz, zmień nazwę, używając nazwy motywu podrzędnego, jakie konkretnie imię masz na myśli? Nie rozumiem, skąd wziąć nazwę motywu podrzędnego.
@fuddin nazwa motywu to nazwa folderu motywu potomnego; na przykład: ustawienia motywu nadrzędnego są identyfikowane przez nazwa_opcji „theme_mods_parent-theme-name”; ustawienia motywu podrzędnego można rozpoznać po opcji nazwa_opcji „theme_mods_parent-theme-name-child”. Możesz dokonać wyboru w swojej bazie danych, aby zobaczyć to wyraźnie:SELECT * FROM wp_options WHERE option_name LIKE "theme_mods_%"
Marco Panichi
1

Rozwiązałem po prostu kopiując opcje w bazie danych .

Oto procedura krok po kroku :

  1. Zaloguj się do swojego phpMyAdmin i wybierz bazę danych strony
  2. Wykonaj kopię zapasową bazy danych
  3. Wykonaj to zapytanie, aby mieć jasny obraz sytuacji SELECT * FROM wp_options WHERE option_name LIKE "theme_mods_%":; ta instrukcja zwróci wiersz dla każdego motywu aktywowanego do tej pory w Twojej witrynie
  4. Zmodyfikuj wiersz ustawień motywu nadrzędnego, identyfikowany przez opcję nazwa_opcji = motyw_mods_parent-theme-name
  5. Tutaj, w polu value_value, masz wszystkie ustawienia motywu nadrzędnego w postaci szeregowej; skopiuj je; możesz użyć narzędzia odserializowania , aby zobaczyć treść w przyjaznej dla człowieka formie
  6. Wróć do punktu 3, ale teraz zmodyfikuj wiersz ustawień motywu podrzędnego
  7. Wklej wcześniej skopiowane ustawienia w polu value_value; zapisać
Marco Panichi
źródło
0

Możesz zrobić coś takiego, co zawierają motywy potomne Genesis, aby zapisać domyślne ustawienia motywu podczas aktywacji i przełączania motywów:

//* Theme Setting Defaults
add_filter( 'genesis_theme_settings_defaults', 'child_theme_defaults' );
function child_theme_defaults( $defaults ) {

    $defaults['blog_cat_num']              = 6;
    $defaults['content_archive']           = 'full';
    $defaults['content_archive_limit']     = 150;
    $defaults['content_archive_thumbnail'] = 0;
    $defaults['image_alignment']           = '';
    $defaults['image_size']                = 'entry-image';
    $defaults['posts_nav']                 = 'prev-next';
    $defaults['site_layout']               = 'full-width-content';

    return $defaults;

}

//* Theme Setup
add_action( 'after_switch_theme', 'child_theme_setting_defaults' );
function child_theme_setting_defaults() {

    if( function_exists( 'genesis_update_settings' ) ) {

        genesis_update_settings( array(
            'blog_cat_num'              => 6,
            'content_archive'           => 'full',
            'content_archive_limit'     => 150,
            'content_archive_thumbnail' => 0,
            'image_alignment'           => '',
            'image_size'                => 'entry-image',
            'posts_nav'                 => 'prev-next',
            'site_layout'               => 'full-width-content',
        ) );

    } else {

        _genesis_update_settings( array(
            'blog_cat_num'              => 6,
            'content_archive'           => 'full',
            'content_archive_limit'     => 150,
            'content_archive_thumbnail' => 0,
            'image_alignment'           => '',
            'image_size'                => 'entry-image',
            'posts_nav'                 => 'prev-next',
            'site_layout'               => 'full-width-content',
        ) );

Oczywiście należy zmodyfikować ten kod, aby działał z funkcjami motywów.

Brad Dalton
źródło