WordPress Child-Themes verstehen

bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.

Kommentare

  
  1. Micha sagt:

    Einen großen Nachteile sehe ich in der Performance, muss WordPress doch einen Schritt weiter gehen und sich in zwei Bereichen nach den Templates umsehen und entsprechend ziehen.

    Das macht WordPress ja eh schon von Haus aus.

  2. Elias sagt:

    Schön, dass jetzt auch eine deutschsprachige Anleitung zur Erstellung eines Child-Themes vorliegt. Ich habe mir das erst vor ein paar Tagen aus dem englischen Codex angeeignet, um auch gleich ein Child-Theme von Twenty Ten abzuleiten und fand, dass das verblüffend schnell und einfach ging, wenn man es einmal mit dem "völligen Neubeginn" eines eigenen Themes vergleicht.

    Eine Anmerkung muss ich dazu aber doch loswerden, denn natürlich haben auch die Child-Themes "ihre Nachteile und ihre Nachteile". Wer auf die Aktualisierungen im WordPress-Dashboard achtet und dort sieht, dass eine neue Version von Twenty Ten vorliegt und diese bequem mit einem Klick installiert, hat danach kein lokalisiertes Theme mehr. Die deutsche Sprachdatei des Themes wird beim automatischen Update einfach gelöscht.

  3. Mal wieder ein schöner Abriss zu dem Thema, dass vermutlich ebenso oft geliebt, wie gehasst wird. Es bieten sich hier ungeahnte Möglichkeiten, aber eben auch Schwierigkeiten. Ich arbeite z.b. häufig mit dem Genesis Framework. Manchmal liebe ich es, manchmal hasse ich es ;-)

    Für den "normalen" WordPress User kann das schnell zum Fluch werden - für den fortgeschrittenen Entwickler kann es ein Segen sein.

  4. Sehr schoener Artikel wieder mal!

    Ich kann aus eigner Erfahrung das Thematic Framework empfehlen, das sich (wie ich finde) auch fuer Einsteiger eignet.

    Allerdings wird's ja bei diesem Theme nicht bleiben. Mullenweg sagte ja bei der Vorstellung zu WP 3.0, dass jede Version ein neues Theme enthalten soll.

    Mal sehen, vielleicht ist bei naechsten Mal was besseres dabei - denn TwentyTen finde ich auch nicht so super.

    Achja, und Theming in HTML5 wuerde mich ja mal interessieren. Falls mal die Themen ausgehen ;)

  5. Kevin sagt:

    Super Post mal wieder. Danke dass Du diesen Blog pflegst! :)

  6. Steffen sagt:

    jep, Simon hat bereits Sept 2008 darüber geschrieben, wann die Child Themes aber konkret eingeführt wurden, ist mir auch nicht bekannt, ich hatte ja geschätzt mirt 2.7.

    @elias
    ich kenne mich mit der Sprachdatei-Sache nicht so aus, aber es gibt eine Funktion load_child_theme_textdomain($domain, $path=false) , vielleicht hilft die ja das Problem mit dem Update zu lösen.

  7. chris sagt:

    Danke für die klasse Anleitung. Lässt sich danach wirklich leicht umsetzen.

  8. Steffen sagt:

    komisch, kamen die Child Themes wirklich erst mit 3.0?

  9. Quincy sagt:

    Sehr schöner Artikel - vielen Dank dafür (obwohl ich Steffen zustimmen muss - das ging doch schon vor 3.0 oder?). Mir ist jetzt klar, wieso das bei mir nicht funktioniert hat. Vielleicht noch als Anhang: Jörn Kretzschmar hat bei Youtube noch ein paar Video's (leider englisch) zu dem Thema (natürlich bezogen auf sein Theme dkret3) hochgeladen.

    Nochmals danke für den Beitrag!

    • @Quincy, Steffen: natürlich konnte man Child Themes auch vor 3.0 nutzen, es ist in den meisten Fällen ja nur ein Aufruf des CSS - aber die funktionale Unterstützung durch den Core war nicht gegeben, insofern konnte man keinen Loop ersetzen und auch nicht jedes Template. Ebenso war die Sprachunterstützung vor 3.0 nicht da.

  10. nurmalso sagt:

    jetzt noch mal nachgehakt: die deaktivierung des entsprechenden hooks bei der functions.php -> die wird in der kopierten functions.php des child-themes vorgenommen oder in der functions.php des basis themes? (das kommt im artikel nicht so klar rüber).

    schöner artikel übrigens, wobei ich mich trotzdem immer frage, welche vorteile diese child-theme sache wirklich hat ... also gegenüber der lösung, einfach das das twentyten zu kopieren und an die eigenen bedürfnisse anzupassen.

    • @nurmalso: in der functions.php des Child Theme, in dem Basis Theme wird nichts angefasst und verändert! Der Vorteil ist, dass du Updates des Themes nutzen kannst.

  11. Caspar sagt:

    Vielen Dank, sehr hilfreich. Übrigens: Ist das Absicht, dass man beim Spenden auf 1 € limitiert wird? Zumindest, wenn man das Button nutzt. Ich habe keine Möglichkeit gefunden, den Betrag in der Maske zu ändern. :(

    @Steffen: Nee, und das wussten wir ja auch alle, aber Kubrik war als Default-Theme nun nicht gerade der Mega-Kandidat für ein Eltern-Theme, deswegen war die Funktion für den breiten Durchschnitt der praktisch veranlagten Nutzer eher uninteressant. Was sie angesichts des notwendigen Programmieraufwands vielleicht auch bleiben wird…

  12. Thomas sagt:

    OK, das mit den Stylesheets und auch die verschiedenen Möglichkeiten mit Hooks habe ich einigermassen kapiert. Wo ich aber nach wie vor anstehe: wenn ein Theme eine deutsche Sprachversion mitbringt, wie sage ich dem Child, wo er sich die Sprachdatei holen muss; und noch wichtiger, wie sage ich PoEdit (Codestyling macht ja keine Themes), dass es die neuen Begriffe des Childtheme bitte auch mitnimmt bzw. dass die Sprachdatei des Child nur ein "Anhängsel" der Mutter ist, sozusagen.

    Danke für den wunderbaren Artikel zum Thema,

    Thomas

    • @Thomas: die Sprachdatei muss im Child Theme liegen. Man kann es mit der neuen Funktion load_child_theme_textdomain() einbinden. Localization von Heiko macht das im Grunde auch, er arbeitet auch an einer komplexeren Lösung, da man ja das Basis Theme mitziehen muss. Im Grunde muss im Child Theme nur der Text liegen, der in den Templates des Child Themes benötigt wird; heißt, du kannst via poEdit den Ordner des Child Theme scannen und übersetzen.

  13. Mark sagt:

    @Steffen: ja - zumindest ist mir das auch nur so bekannt.

  14. Swedlix sagt:

    Irgendwie muss es eine "überirdische" Macht geben ;) Ich schlage mich seit zwei Tagen mit dem Thema der Child-Themes herum und heute knallt mir mein Dashboard deinen Artikel vor die Nase... Hattest du ständig Schluckauf?

    Danke für den Beitrag, mittlerweile brennt wieder Licht in der Oberstube ;)

  15. Thomas sagt:

    @Frank - danke schön für die Antwort. Das heisst dann, ich kann load_child_theme_textdomain('name-meines-child', 'pfad_zu_style') in eine functions.php schreiben, die im Ordner des Child-Themes liegt und dort auch eine bspw. de_DE.mo ablegen? Das war's, zumindest was die Übersetzung des Themes anbelangt?

    • @Thomas: ja, wobei es sich empfiehlt den gleichen Namen wie das Basis-Theme zu nutzen und die Strings des Basis-Theme mit zu integrieren, dann geht beim Update die Sprachdatei nicht verloren. Ich habe eine Demo fast fertig, sollte in den kommenden Tagen hier als Beitag erscheinen.

  16. Kenny sagt:

    Auch von mir ein Dankeschön. Habe mich wie wohl viele andere durch die englischsprachige Anleitung gewälzt. Es klappte im Großen und Ganzen auch alles, aber einige Kleinigkeiten habe ich dann doch nicht so verstanden. Da kam mir deine Anleitung sehr gelegen :)
    Weiter so :)

  17. Ich habe es ausprobiert mit einem TwentyTen-Mod, klappt gut; fast:
    In der CHILD-Variante werden einige wenige DIV-Elemente in der Browseransicht gegenüber dem Original-Mod verschoben (trotz identischer style.css, mal abgesehen von den Kopfinformationen).

    Verwende ich den Mod OHNE Child-Funktion (also die gleichen Dateien, nur eben als eigenständiges Theme), ist die Positionierung wieder richtig.
    Ich habe nur die style.css angepasst und zwei Zeilen in der header.php; diese beiden Dateien liegen im CHILD-Ordner, wie es sein soll.
    Selbst wenn ich ALLE Dateien des Mod in den Child-Ordner kopiere, bleibt der Fehler bestehen.

    Nun mag es auch mein Fehler sein; aber ganz so einfach war es dann leider doch nicht, obwohl ich diese Funktion gerne genutzt hätte, denn ich finde es überaus praktisch, ein Verzeichnis zu haben, in dem nur veränderte Dateien liegen.

    Beispielfehler: in der CHILD-Variante zeichnet der Brower 3-4 Pixel Rand um das Layout herum, als sei hier im CSS ein Rand falsch oder nicht auf Null gesetzt (und gerade in der style.css des TwentyTen-Themes ist das ja toll und sicher gelöst). Da die style.css sowohl in der Mod- als auch in der Child-Version absolut indentisch ist, kann ich mir nicht erklären, woran das liegen könnte.

    • @Kopfschüttler: ich kann mir nur Vorstellen das die Konfiguration deines WP nicht stimmt, so dass einige Pfade nicht mitkommen. Kann man sich das Problem live ansehen?

  18. Naja, es ist eine recht frische Standardinstallation von WP 3.0.1; verändert wurden nur die Theme-Dateien des TwentyTen und die Sprachdatei. Du hast übrigens Recht; das neue TwentyTen-Theme ist für Leute, die das nicht jeden Tag machen, schon eine Herausforderung (so auch für mich). Mir gefällt das neue Loop-Konzept besonders gut.
    Mein neues Projekt kann man noch nicht sehen, es befindet sich noch in der Entwicklung. Wenn es soweit ist, schreibe ich dir mal, vielleicht möchtest du dich dann ja der "Child-Herausforderung" stellen... ;-)

  19. Hallo, ich verstehe nach wie vor nicht ganz den Sinn der Child Themes. Ich suche nämlich nach einer Möglichkeit, meine Änderungen nicht nur in der style.css des Themes vor Änderungen bei einem Themeupdate zu schützen, sondern auch die php-Dateien des Themes (single.php etc.).

    Gehe ich recht in der Annahme, dass child themes nur die eigenen, angepassten CSS schützt, nicht aber Änderungen an Theme PHP-Dateien zu schützen vermag?

  20. Danke für die sehr hilfreiche Einführung :-)

  21. klaus-peter sagt:

    Hallo, bin relativ neu in der Gemeinde um WP. Danke fuer die vielen Hilfen und Hinweise auch zu neuen Themen um WP 3.0. Habe Wp 3.0.1 und twenty Ten mit twentytenjump als child installiert und auch ein eigenes child entworfen - siehe http://blogwp.kp-prosim.de/ -
    Sowohl in der reinen twenty ten, als auch in allen anderen Versionen gelingt es mir nicht ein anderes Template - hier One column, no sidebar - an eine Seite zu binden. Es wird bei einzelnen Seiten immer die single.php gezogen, obwohl in der Zuordnung der Attribute ein anderes Template gewählt wurde.
    Bitte um Hilfe!

  22. klaus-peter sagt:

    Hallo, ich habe meinen Fehler gefunden. Da ich die Seiten über ein benutzerdefiniertes Feld mit "redirect" fülle, wird die Seite immer als single erkannt. Wenn man direkt etwas in die Seite schreibt, wird auch das Template erkannt.
    Gibt es eine Liste der zu ändernden Fehler in twenty ten? Beim Einschalten von define(WP_Debug, true) - Rat von der DVD-WP-Training - werden Fehler in der funktion.php angezeigt, die als Ursache in anderen Teilen und plugins zu finden sind. Es ist sehr mühsam die einzelnen Teile auf veraltete Zuweisungen z.B. alt= user_level neu=roles oder offene <?php - Teile - funktion.php von twenty ten z.335 - ab zu suchen.

    • @klaus-peter: Twenty Ten sollte eigentlich keine Fehler ausgeben, zumindest in meinen Tests klappt das - wobei ich immer die letzte Version aus dem SVN nutze. Mit Hilfe der Fehlerausgabe von WP_DEBUG kann man recht schnell die Fehler finden - es hilft also nur die Fehlerbeseitigung, wenn man das alles richtig haben will.

  23. klaus-peter sagt:

    Danke für die schnelle Antwort und den guten Rat. Aber was mache ich, wenn has_cup() 69 mal in 32 files angeblich mit dem Parameter user_level aufgerufen wird, sich aber user_level nicht finden lässt. Oder wenn mit load_plugin_textdomain 29 mal in 23 files ein Parameter aufgerufen wird, der missbilligt wird, weil er veraltet ist, der Parameter aber nicht bezeichnet wird? Ich habe schon alle Plugin's gekillt und sie nacheinander wieder installiert und dabei versucht die Fehler zu beseitigen, aber beim tinymce_advanced und beim contact-form 7.2.2.1 will mir das nicht gelingen.

    • @klaus-peter: entscheident ist doch, ist das eine Warnung/Hinweis oder ein Bug - ansonsten würde ich das so lassen; bzw. das Plugin, welches diesen Fehler verursacht nicht einsetzen - hier ist der Autor anzuschreiben bzw. sein KowHow gefragt.

  24. Danke. Ich habe versucht durch die englischen Anleitungen durchzublicken, aber irgendwie wollte da einfach nicht klappen. Als ich dann dies hier fand, wurde mir sehr geholfen. Zwar sind noch einige Fragen offen, aber das wird schon! Weiter so!

  25. Farid sagt:

    Danke für die Erklärung. Hab jetzt einiges verstanden und probiers mal aus. Mal sehen ob ich es hinkriege ;-)

  26. Hansjörg sagt:

    Vielen Dank für den interessanten Artikel. Für mich als WP-newbee und eher anwendungsorientierter Blogger stellt sich nun folgende Frage:

    Fahre ich nicht einfacher, wenn ich alle theme-dateien in einen anders benannten Ordner kopiere und damit sozusagen ein "neues" theme habe.

    Wenn ich den einen Kommentar richtig verstanden habe, müsste ich sonst bei theme-updates immer alle individuellen Anpassungen erneut überprüfen und ggf. wiederherstellen.

    Auch scheint es mir für jemand wie mich (der nicht wirklich weiss, wie man einen "hook" "bastelt") doch recht kompliziert so ein Child hinzubekommen...

    Beste Grüße
    Hansjörg

    • @Hansjörg: nein, da du dann alle Dateien in der Pflege hast und auch die musst du prüfen, wenn WordPress ein Update liefert. Also stelle nur die um, die du wirklich änderst.

  27. Dennis sagt:

    Hi Frank,

    Vielen Dank für die tolle Anleitung! Jetzt gibt es keine Ausrede mehr es nicht zu versuchen ;)

  28. Danke für die ausführliche Beschreibung! Es hat bei mir um einiges an Klarheit gesorgt. Habe ehrlich gesagt schon länger nach so etwas gesucht. Schon seit Wochen mit dem Thema Child Themes näher auseinandergesetzt (wegen meiner Arbeit) Gewundert hat mich allerdings ziemlich, dass man Nachteile in Sachen Performance wegen den Stylesheets in Kauf nehmen muss... ist für mich noch etwas unverständlich... aber naja, ich werde mir noch einmal alles in Ruhe durchlesen.

    Danke und LG aus Paderborn ;)

  29. Tim sagt:

    Danke für die schön geschriebene Anleitung. Jetzt habe auch auch mein TwentyEleven Child Theme ;-)

    Tim

  30. Dominik sagt:

    Eine Frage zur functions.php im Child-Theme: Wenn ich via Child-Theme eine zusätzliche Funktion in die functions.php einbauen will, kann ich dann einfach eine leere functions.php anlegen, die gewünschte Funktion da hinein schreiben und die Datei ins Child-Theme legen?

    Danke für die Hilfe, Dominik

  31. Andreas Paul sagt:

    Ein Autodidakt bittet um Hilfe bei child-theme und functions.php!

    Für die website med.sion.dioezese-linz.at möchte ich eigene Bilder im Header einbauen. Diese sind in der functions.php des theme "graphene" definiert. Ich möchte diese nicht im original theme ändern sonder durch ein child. Es gibt in der functions.php folgenden code:

    *
    * add_action( 'after_setup_theme', 'my_child_theme_setup' );
    * function my_child_theme_setup() {
    *
    * remove_filter( 'filter_hook', 'callback_function' );
    * ...
    * }

    Muß ich im Original file sie * wegnehmen?

    Welche Teile des original file muß ich in das child functions.php file übernehmen ausser dem Teil in dem die Bilder definiert werden. Diesen habe ich gefunden und geändert:

    if (!function_exists( 'graphene_get_default_headers' ) ) {
    function graphene_get_default_headers() {
    return array( 'Sisters' => array( 'url' => '%s/images/headers/banner01.jpg',
    'thumbnail_url' => '%s/images/headers/banner01-thumb.jpg',
    /* translators: header image description */
    'description' => __( 'This is the default Graphene-med theme Header image by Kasia', 'graphene-med' ) ),
    'Jerusalem 1' => array( 'url' => '%s/images/headers/banner_jerusalem01.jpg',
    'thumbnail_url' => '%s/images/headers/banner_jerusalem01-thumb.jpg',
    /* translators: header image description */
    'description' => __( 'Header image by Andreas, ', 'graphene-med' ) ),
    'Jerusalem 2' => array( 'url' => '%s/images/headers/banner-jerusalem-02.jpg',
    'thumbnail_url' => '%s/images/headers/banner-jerusalem02-thumb.jpg',
    /* translators: header image description */
    'description' => __( 'Header image by Andreas', 'graphene-med' ) ),
    'Sister Tunis' => array( 'url' => '%s/images/headers/banner07.jpg',
    'thumbnail_url' => '%s/images/headers/banner07-thumb.jpg',
    /* translators: header image description */
    'description' => __( 'Header image by Kasia', 'graphene-med' ) ),
    );

    Was müßte ich noch ändern? Ich wäre sehr dankbar um eine sehr konkrete Anleitung wie das geht.

    Vielen Dank in der Hoffnung auf eine gute Antwort.
    Andreas

    • @Andreas: du musst nur im Child Theme haben, was du ändern willst. Alle Funktionen aus dem Eltern-Theme stehen dir zur Verfügung; also wirklich nur ändern, was nicht passt/gefällt.

  32. Habe gerade mein Theme aktualisiert und dann deine Anleitung gefunden. Vielen Dank für die viele Arbeit! Werde demnächst ein Child Theme nach deiner Beschreibung anlegen und mir so die Arbeit für die manuelle Anpassung nach dem Update sparen.

  33. Andreas Paul sagt:

    @Frank: Danke für den Hinweis!

    Mittlerweile habe ich es geschafft, dass in der function.php des childtheme meine headerfiles mit thumb eingetragen sind und auch in der Vorschau gezeigt werden. Nur weiß ich nicht, wie den code noch ändern, damit der Pfad auf das image Verzeichnis im childtheme zeigt statt auf das im theme.

    Was müßte in diesem code geändert werden? Bzw. ist %s wohl eine Variable die irgendwo definiert ist. Nur kann ich nicht finden wo? Oder wo wird die function 'graphene_get_default_headers' definiert? Genügt es da nur 'graphene-med_get_default_headers' zu schreiben?

    if (!function_exists( 'graphene_get_default_headers' ) ) {
    function graphene_get_default_headers() {
    return array( 'Sisters' => array( 'url' => '%s/images/headers/banner01.jpg',
    'thumbnail_url' => '%s/images/headers/banner01-thumb.jpg',

    Ich wäre sehr dankbar, könnte mir jemand konkret die nötigen Änderungen schreiben. GErne suche ich noch nach zusätzlicher Info wenn nötig.

    Mit Dank und guten Grüßen für das Neue Jahr!
    Andreas

    • @Andreas: Kommentare erscheinen erst, wenn ich sie frei gebe.

      die Funktion get_bloginfo('stylesheet_directory') zeigt auf das Verzeichnis, in dem das Theme aktiv ist, also das Child-Theme.

  34. Carlo sagt:

    Schöne Anleitung für die Child-Themes. Gibt es bereits ein Plugin, mit dem ich für jeden neuen Post/Seite aus einer Auswahl-Liste das jeweils gewünschte Child-Template aussuchen kann? So ließe sich ja WordPress sehr einfach als richtiges CMS nutzen, indem ich verschiedenen Kategorien individuelle Child-Templates zuweise, insbesondere weil auch die header.php und footer.php durch das Child-Theme modifiziert werden können. Ich habe leider bislang noch kein Plugin gefunden mit dem das einfach geht.

  35. Sebastian sagt:

    @ Carlo:
    Das ist doch bei der Erstellung der Seite anpassbar (Option Attribute - Template).

© 2014, since 2005 bueltge.de [by:ltge.de] · Theme is built by ThemeShift