Wie mache ich mein Kind Thema die Einstellungen erneut anwenden, die angepasst wurden, als seine Eltern aktiv waren?

17

Szenario

  1. Pick-2015-Thema. Passen Sie verschiedene Einstellungen, wie zum Beispiel Hintergrundbild, Kopfbild, Site-Namen und Slogan.
  2. Aber nicht berühren den Inhalt jeder das Thema der Dateien.
  3. Verwendung Codex‘Child Themes ein Minimum Kind Thema des 2015 Thema zu schaffen.
  4. Aktivieren Sie das neue untergeordnete Thema.

Hoppla?

Die Seite mit diesem Nötigste Kind Thema aktiviert sieht völlig anders als die Eltern-Thema. Hintergrund und Header-Bild waren verschwunden, und alle Arten von Seitenleisten- (oder Header-) Widgets wurden aktiviert, die im übergeordneten 2015-Design (standardmäßig) nicht aktiv waren.

Original Aussehen der Website mit nur wenigen individuellen Einstellungen für das 2015 Thema:

SofietjeWonders mit individuellem Thema 2015

Die Site sieht so aus, wie sie mit dem 2015er-Theme abgeleiteten Child-Theme aus, das nur den erforderlichen Header enthält style.cssund nur die Stile einreiht, wie auf der Child-Theme-Seite des Codex vorgeschlagen function.php.

Bildbeschreibung hier eingeben

Frage

Wie kann ich es so machen, dass das Kind Thema Aktivieren der Anpassungen und Vorgaben des übergeordneten Thema hält?

In diesem Fall: die Kopf- und Hintergrundbilder und das Entfernen (Deaktivieren?) Der Standardwidgets (Seitenleiste / Kopfzeile).


Anmerkungen

Das Erstellen eines untergeordneten Themas eines bereits umfangreichen benutzerdefinierten Themas klingt möglicherweise wie ein Duplikat. Hier geht es jedoch um Anpassungen, indem Sie die Dateien des Themas bearbeiten.

Diese Frage Beim Aktivieren eines untergeordneten Themas, welche Kerneinstellungen müssen zurückgesetzt werden, dh; Benutzerdefinierte Menüs usw.? scheinen genau zu fragen, wonach ich zu streben scheine. Leider spekuliert die einzige Antwort über eine Nichtübereinstimmung der Funktionen, was für mich nicht der Fall ist und den Kommentar des OP nicht in gleicher Weise aufgegriffen hat.

Habe ich auch angeschaut

Marjan Venema
quelle

Antworten:

9

Ich habe der Antwort von @ webtoure eine +1 gegeben, weil sie Ihnen die richtige Richtung gibt, aber ich denke, es fehlen einige Prüfungen.

Zunächst wird nicht überprüft, ob das aktivierte Thema ein untergeordnetes Thema ist, und es wird nicht überprüft, ob das zuvor aktive Thema das übergeordnete Thema des aktivierten untergeordneten Themas ist.

Nach meinem Verständnis von OP sind diese Bedingungen erforderlich.

Darüber hinaus müssen Sie berücksichtigen, was mit den Motiv-Mods des aktivierten untergeordneten Motivs geschehen soll, sofern diese bereits vorhanden sind.

In @webtoure answer werden sie in einer Sicherungskopie gespeichert, die Sie unter bestimmten Umständen retten kann. WordPress erkennt sie jedoch standardmäßig nicht und erfordert daher die Verwendung von zusätzlichem Code.

Ich denke, es wäre besser, die Themenänderungen nur dann vom übergeordneten Thema zu übernehmen, wenn ein untergeordnetes Thema zum ersten Mal aktiviert wird.

Kurz gesagt, die Bedingungen, die ich vorher prüfen möchte, um Design-Mods vom übergeordneten Design zu erben, sind:

  • Das zuvor aktive Thema muss das übergeordnete Thema des aktivierten untergeordneten Themas sein
  • Das untergeordnete Thema, das aktiviert wird, darf noch nie zuvor aktiviert worden sein

Um die zweite Bedingung zu gewährleisten, verwende ich eine benutzerdefinierte Option, da WordPress keine Möglichkeit bietet, diese Prüfung durchzuführen.

Dies ist der Code. Bitte lies die Inline-Kommentare, um zu erklären, was passiert:

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
quelle
Ihr erster Punkt ist nicht wirklich gerechtfertigt: Wenn das aktuelle Thema kein untergeordnetes Thema ist, get_templatewird einfach der Verzeichnisname des aktuellen Themas zurückgegeben. Sie müssen die Beziehung zwischen dem zuvor aktiven und dem aktuellen Thema nicht kennen: Wenn das Thema ein übergeordnetes Thema hat, werden diese Einstellungen geladen, andernfalls werden nur die eigenen Einstellungen geladen. Ich stimme jedoch Ihrem zweiten Punkt zu, der sich mit dem Problem des Überschreibens von Einstellungen befasst.
Webtoure
Was ist außerdem, wenn der Benutzer versehentlich ein anderes Thema aktiviert, bevor er das gewünschte untergeordnete Thema aktiviert? Der Code wird nicht funktionieren und die ( theme_switched, current_theme) Beziehung ist zunächst irrelevant.
Webtoure
1
@MarjanVenema Ich freue mich sehr, wenn Sie Webtoure Kopfgeld geben .
gmazzap
1
@MarjanVenema gmazzap hat tatsächlich Kommentare für seinen Denkprozess geliefert und auch eine Korrektur für mein Snippet vorgeschlagen. Ich denke, wenn jemand das Kopfgeld verdient, ist er es. Außerdem beantworte ich keine Fragen zu völlig nutzlosen Punkten. Ich liebe es, mit Menschen zu interagieren, Herausforderungen zu meistern und allgemein zu helfen, wenn ich kann.
Webtoure
1
Bitte nimm an längeren Diskussionen teil, Kommentare sind nicht für sie bestimmt. :)
Rarst