Support » Themes » Angepasstes Parent Theme in ein Child Theme umwandeln

  • paco16

    (@paco16)


    Hey,

    ich habe ein WP Theme angepasst (sytle.css, header.php, footer.php etc.) und erst im Nachhinein gelesen, dass ein Child Theme benötigt wird, um das Original Theme updaten zu können, ohne meine Anpassungen zu verlieren.

    Kann ich denn nachträglich ein Child Theme anlegen und meine bisherigen Anpassungen behalten?

    Wenn ja, könnte mir bitte jemand eine Anleitung für Anfänger an die Hand geben?

    Bzgl. Plugins: Müssen diese auch neu eingebunden und konfiguriert werden?

    Danke Euch!

Ansicht von 3 Antworten - 1 bis 3 (von insgesamt 3)
  • Moderator Bego Mario Garde

    (@pixolin)

    Es kommt vor allem auf den Umfang deiner Änderungen an. Wenn du z.B. nur in einem Template eine Änderung vorgenommen hast, kannst du das deinem neuen Child-Theme hinzufügen, das Parent Theme (vorsichtshalber nach einem Backup) löschen und das Theme erneut hochladen, damit du beim Parent Theme wieder die unveränderte Fassung hast. Löschen und Hochladen würde ich mit einem FTP-Programm vornehmen, nicht über das WordPress-Menü Design, damit keine Einstellungen verloren gehen.

    Wenn du viele Änderungen vorgenommen hast, kannst du mit einem Diff-Tool die Unterschiede feststellen und in ein Child-Theme übertragen – mühsamer, aber machbar.

    Plugins spielen hier keine Rolle, bleiben einfach weiter installiert und sind nicht von Änderungen am Theme betroffen.

    paco16

    (@paco16)

    Vielen lieben Dank schon mal für deine schnelle und hilfreiche Antwort! Könntest du mir bitte sagen, ob ich dich so richtig verstanden habe und mein weiteres Vorgehen korrekt wäre?

    Parent Theme:
    1. Das Parent-Theme via FTP sichern
    2. Den Ordner wp-content/themes/OrdnerParentTheme löschen
    3. Im Dashboard unter Design>Themes das gleiche Theme nochmals hinzufügen und installieren

    Child Theme:
    4. Im Verzeichnis wp-content/themes einen neuen Ordner anlegen, um das Child Theme zu erstellen (Name z.B.: ChildTheme, also keine Leerzeichen oder Umlaute)
    5. Dann eine neue style.css Datei mit folgendem Inhalt erstellen und via FTP in den neu erstellten Ordner laden:
    /*
    Theme Name: ChildTheme (Erscheint im Dashboard)
    Template: exakter Name des Parent-Theme-Ordners
    */

    Änderungen:
    In dem Child Theme-Ordner sollen jetzt nur die Dateien liegen, die tatsächlich verändert wurden, richtig? Meine Fragen dazu:

    6. Könnte ich dennoch auch den kompletten Inhalt der gesicherten style.css in die neue style.css kopieren? Oder müssen zwingend einzig die Änderungen in diese eingetragen werden?
    a. Wie gehe ich im Falle meiner zweiten Frage vor / was muss ich beim Kopieren von Änderungen beachten? Und werden diese einfach nur untereinander in die style.css kopiert?

    7. Dateien wie header.php und footer.php können ohne weiteres in den neuen Child-Theme-Ordner kopiert werden? Oder müssen hier ebenfalls gleichnamige Dateien angelegt und alleinig die Änderungen eingetragen werden?

    8. In der Datei functions.php hatte ich keine Änderungen vorgenommen, habe aber häufiger gelesen, dass diese benötigt wird. Könntest du mir das bitte näher erläutern, ob und warum ich eine functions.php brauche?

    Zusatz:
    9. Beiträge sowie Medien bleiben ebenso davon unberührt nehme ich an?

    Moderator Bego Mario Garde

    (@pixolin)

    Fast. 🙂

    Parent Theme
    3. Neu aus dem WordPress-Verzeichnis herunter geladenes Theme per FTP hochladen.
    (Durch Löschen/Neu hochladen soll vermieden werden, dass vorhandene Einstellungen gelöscht/überschrieben werden.)

    Child Theme
    Ich erstelle ein Child Theme immer erst einmal in einer lokalen Testversion. Wenn dann dort alles wie gewünscht läuft, lade ich das Child-Theme-Verzeichnis hoch. Erspart böse Überraschungen bei Programmierfehlern (White Screen of Death …).

    Änderungen

    In dem Child Theme-Ordner sollen jetzt nur die Dateien liegen, die tatsächlich verändert wurden, richtig?
    Richtig. Du kopierst nur die Templates, an denen Änderungen vorgenommen werden sollen. Ruft WordPress ein Template ab, sucht es zuerst im Child Theme, dann erst im Parent Theme.

    Könnte ich dennoch auch den kompletten Inhalt der gesicherten style.css in die neue style.css kopieren?
    Kannst du zwar so machen, aber dann werden auch bei jedem Seitenaufruf in zwei Stylesheets identische Inhalte geladen; das macht deine Website „nicht unbedingt schneller“. Besser wäre es, mit einem Diff-Tool zu prüfen, welche Teile abweichen und nur die im Stylesheet des Child Themes zu speichern.
    Wichtig ist dabei, dass du „ältere“ Style-Regeln durch „neuere“ Style-Regeln überschreiben kannst. Bei …

    .important { color: blue; }
    .important { color: red; }

    wird <p class="important">…</p> rot geschrieben, weil das Stylesheet von oben nach unten abgearbeitet wird und die ältere Variante color: blue durch die neuere Variante color: red überschrieben wird. Bei Child- und Parent-Theme wird erst das Stylesheet des Parent Theme geladen und dann durch das „neuere“ Stylesheet des Child Themes überschrieben.

    Dateien wie header.php und footer.php können ohne weiteres in den neuen Child-Theme-Ordner kopiert werden?
    Korrekt, im Gegensatz zu Stylesheets kopierst du Templates komplett – oder schreibst sie ganz anders, wenn du die Darstellung z.B. einer einzelnen Blogseite komplett umgestalten möchtest. Hier wird auch das Problem mit Child Themes deutlich: Ändert der Theme-Autor ein Template, musst du einen Abgleich durchführen, ob und wie weit dein geändertes Template von den Änderungen betroffen ist und angepasst werden muss. (siehe Child Theme Dilemma).

    Könntest du mir das bitte näher erläutern, ob und warum ich eine functions.php brauche?
    Wenn dein Child Theme keine eigenen bzw. geänderte Funktionalitäten hat, brauchst du zunächst keine functions.php. Grundsätzlich kann ein Child Theme alleine aus einer style.css mit folgendem Inhalt bestehen.

    /*
    Theme Name: Sixteen
    Template: twentysixteen
     */
     @import url(../twentysixteen/style.css);

    Allerdings ist das aus Performance-Gründen nicht optimal: Hier wird erst das Stylesheet des Child Themes geladen, in dem dann die Anweisung folgt, das Stylesheet des Parent Themes zu laden; die Ladevorgänge erfolgen also hintereinander (jetzt bitte nicht mit der o.g. Abarbeitung der Stylesheets und der Frage, welche Regel eine andere überschreibt, verwechseln).

    Besser (weil schneller) ist es, per PHP beide Stylesheets parallel zu laden. Das erreichst du, in dem du deinem Child Theme eine eigene functions.php gönnst und dort folgendes einträgst:

    <?php
    function my_theme_enqueue_styles() {
    
        wp_enqueue_style( 'parent-style', 
            get_template_directory_uri() . '/style.css' );
        wp_enqueue_style( 'child-style',
            get_stylesheet_directory_uri() . '/style.css',
            array( 'parent-style' ),
            wp_get_theme()->get('Version')
        );
    }
    add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' );
    ?>

    Allerdings kannst du nicht Funktionen aus der functions.php des Parent Themes einfach in dein Child Theme kopieren – alleine schon, weil PHP nicht erlaubt, dass du den gleichen Funktionsnamen mehrfach für unterschiedliche Funktionen verwendest. Oft findest du deshalb in Themes Code, der in etwa so aussieht:

    if( ! function_exists( 'get_hello' ):
    function get_hello() {
      return 'Hello Dolly!';
    }
    endif;

    Hier wird erst geprüft, ob der Funktionsname get_hello bereits in Verwendung ist – z.B. in einem Child Theme! – und die Funktion wird nur definiert, falls dies nicht der Fall ist. Damit lassen sich Funktionen im Child Theme prima überschreiben. (Häufig wird dann für die Funktion der Begriff „pluggable“ verwendet.)

    Hast du hingegen im Parent Theme Funktionen, bei denen diese Prüfung nicht erfolgt, musst du schauen, wie die Funktion eingebunden wird – z.B. mit add_action( 'wpadmin_head', 'get_hello' );, was du im Child Theme mit remove_action( 'wpadmin_head', 'get_hello' ); zuerst aufhebst, um dann deine eigene Funktion mit add_action( 'wpadmin_head', 'my_other_get_hello' ); hinzuzufügen.

    Du siehst: Funktionen zu ändern ist ein wenig kniffeliger, aber machbar.

    Deine Beiträge und (Medien-)Uploads bleiben vom Child Theme unberührt. Vorsichtshalber solltest du aber immer bei größeren Änderungen an deiner Website ein Backup machen.

Ansicht von 3 Antworten - 1 bis 3 (von insgesamt 3)
  • Das Thema „Angepasstes Parent Theme in ein Child Theme umwandeln“ ist für neue Antworten geschlossen.