Come faccio a far riapplicare il tema di mio figlio alle impostazioni personalizzate quando il suo genitore era attivo?


17

Scenario

  1. Scegli il tema 2015. Personalizza varie impostazioni, come immagine di sfondo, immagine di intestazione, nome del sito e slogan.
  2. Ma non toccare il contenuto di nessuno dei file del tema.
  3. Usa i temi figlio di Codex per creare un tema figlio minimo nudo del tema 2015.
  4. Attiva il nuovo tema figlio.

Ops?

Il sito con questo tema figlio minimo scoperto attivato sembra completamente diverso dal tema principale. L'immagine di sfondo e di intestazione era sparita e tutti i tipi di widget della barra laterale (o dell'intestazione) erano stati attivati ​​che non erano attivi (per impostazione predefinita) nel tema padre 2015.

Aspetto originale del sito con solo alcune impostazioni personalizzate per il tema 2015:

SofietjeWonders con tema 2015 personalizzato

Il sito come appare con il tema derivato dal tema 2015, che ha solo l'intestazione richiesta style.csse accoda solo gli stili come suggerito dalla pagina Tema del bambino del Codice nel suo function.php.

inserisci qui la descrizione dell'immagine

Domanda

Come posso fare in modo che l'attivazione del tema figlio mantenga le personalizzazioni e le impostazioni predefinite del tema principale?

In questo caso: l'intestazione e le immagini di sfondo e la rimozione (disattivazione?) Dei widget predefiniti (barra laterale / intestazione).


Appunti

Creare un tema figlio di un tema personalizzato già pesante può sembrare un duplicato, ma si tratta di personalizzazioni modificando i file del tema.

Questa domanda Quando si attiva un tema figlio, quali impostazioni di base devono essere ripristinate, ad es. Menu personalizzati ecc.? sembra chiedermi esattamente cosa sembro dopo. Sfortunatamente, l'unica risposta ipotizza una discrepanza nelle funzionalità, il che non è il caso per me e non ha ripreso il commento del PO allo stesso effetto.

Ho anche guardato

Risposte:


9

Ho dato un +1 alla risposta di @ webtoure perché ti dà la giusta direzione, tuttavia penso che manchi qualche controllo.

Innanzitutto non verifica che il tema che viene attivato sia un tema figlio e non controlla che il tema precedentemente attivo sia il tema principale del tema figlio che viene attivato.

Per la mia comprensione di OP queste condizioni sono richieste.

Inoltre, un problema che devi prendere in considerazione è cosa fare con le mod del tema del tema figlio attivate, se esistono già.

Nella risposta di @webtoure, sono memorizzati in un backup, che potrebbe salvarti in alcune circostanze, ma WordPress non li riconoscerà per impostazione predefinita e quindi richiedono un codice aggiuntivo per essere utilizzato.

Penso che sarebbe meglio ereditare le modifiche del tema dal tema principale solo la prima volta che viene attivato un tema figlio.

In breve, le condizioni che voglio verificare prima di ereditare le mod del tema dal tema principale sono:

  • il tema precedentemente attivo deve essere il genitore del tema figlio che viene attivato
  • il tema figlio che viene attivato non deve essere mai stato attivato prima

Per garantire la seconda condizione, userò un'opzione personalizzata, poiché WordPress non fornisce un modo per eseguire questo controllo.

Questo è il codice, leggi i commenti in linea per una spiegazione di ciò che sta succedendo:

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 );

Il tuo primo punto di preoccupazione non è realmente giustificato: se il tema corrente non è un tema figlio get_template, restituirà semplicemente il nome della directory del tema corrente. Non è necessario conoscere la relazione tra il tema precedentemente attivo e quello attuale: se il tema ha un genitore carica quelle impostazioni, altrimenti carica solo le proprie impostazioni. Concordo però con il tuo secondo punto che affronta il problema delle impostazioni da sovrascrivere.
webtoure,

Inoltre, cosa succede se l'utente attiva accidentalmente un altro tema prima di attivare il tema figlio desiderato? Il codice non funzionerà e la relazione ( theme_switched, current_theme) è irrilevante all'inizio.
webtoure,

1
@MarjanVenema Sarò molto felice se darai grazia a Webtoure .
gmazzap

1
@MarjanVenema gmazzap ha effettivamente fornito commenti per il suo processo di pensiero e ha anche suggerito una correzione per il mio frammento. Penso che se qualcuno merita la generosità, è lui. Inoltre, non rispondo alle domande per punti completamente inutili. Adoro: interagire con le persone, le sfide e in generale aiutare quando posso.
webtoure,

1
Si prega di prendere lunghe discussioni per chattare, i commenti non sono fatti per loro. :)
Rarst
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.