Sidebar
ein-/ausblenden

WordPress Child-Themes verstehen

Plugin für WordPress SEO

Anzeige

Mit der Version 3.0 von WordPress wurde die viel erwartete Funktion der Child Themes integriert - viel erwartet? Ja, leider nicht in Deutschland. Ich vermute, dass es einfach daran liegt, dass der Markt der kostenpflichtigen Themes hier wesentlich kleiner ist und die meisten Entwickler komplett neue Themes erstellen und nicht auf eine Basis setzen. Aber egal, nun gibt es eine Lösung dafür und ich möchte am Beispiel den neuen Standard-Theme TwentyTen zeigen, wie man es nutzt. Ein weiteres Beispiel findet ihr im übrigen in meinem WP Basis-Theme (SVN); aktuell nicht die html5-Version.

Die Funktion der Child Themes kann im Grunde bei jedem Theme angewandt werden und die neuen Funktionen erleichtern den Zugriff und das Erstellen einen Child Themes. Im Vorfeld gab es auch Möglichkeiten ein Theme zu verändern ohne die eigentlichen Dateien des Themes stark zu verändern. Mit Hilfe der Unterstützung von Child Themes ist dies nun aber komplett unabhängig und so kann man ein Theme nutzen, kann ohne Problem updaten, und trotzdem eigene Ideen realisieren.

In einigen Beiträgen des Netzes wurde die Child Themes schon angesprochen und ich habe bisher nur Artikel gefunden, die die Aktivierung und Änderung des Stylesheets ansprechen. Daher möchte ich dazu nur kurz eingehen, dass ist im Grunde auch recht einfach und dann die verschiedenen Möglichkeiten im Bezug der Template-Dateien aufzeigen.

Vorteile der Idee Child Theme

Mehr oder weniger versucht jeder Administrator einer WordPress Installation etwas Individualismus zu leben. Dabei gehen nicht alle den Weg eines eigens erstellen Themes. Nicht selten wird ein freies oder kommerzielles Theme genutzt und dann an die eigenen Bedürfnisse angepasst. Dabei haben diverse Themes unterschiedliche Optionen, die aber trotzdem nur selten für das Anpassen ausreichen. Will man die einzelnen Darstellungen anpassen, beispielsweise die Sicht einer Kategorie, führt dies schnell zu sehr starken Veränderungen des Themes. Egal wie umfangreich, ein Update eines Themes ist nicht mehr ohne Probleme realisierbar. Hier kommen die Child Themes ins Spiel.

Mit einem Child Theme kann ein Theme angepasst werden oder man kann ein Theme als "Framework" nutzen und dabei komplett eigene Ideen umsetzen. Egal wie umfangreich, das eigentliche Theme bleibt unangetastet und kann ein Update erfahren.

Nachteile der Verwendung Child Theme

Wie so oft, wo Vorteile sind, sind auch Nachteile. Nicht selten sind die "Framework" Themes sehr umfangreich und bringen sehr viele Funktionen mit, die man als Laie nicht mehr überschauen kann und das Anpassen kann viel Mühe und Zeit kosten. Hier können auch die Child Themes nicht helfen.
Einen großen Nachteile sehe ich in der Performance, muss WordPress doch einnen Schritt weiter gehen und sich in zwei Bereichen nach den Templates umsehen und entsprechend ziehen.
Im weiteren werden in der Regel die Stylesheets, wenn man auf sie aufbaut, via @-Regel eingebunden, die Nachteile in der Performance hat.

In allen negativen Punkten kommt es auf Können und Wissen des Entwicklers an, also wie man das Theme bzw. Child Theme erstellt. Damit kann man die Punkte entkräften. Wichtig: die neue Funktion ist kein Freibrief, sie sollte genauso überlegt eingesetzt werden. Aber sie sorgt dafür, dass man sein erstandenes Theme nicht anfassen muss und trotzdem sehr überschaubar Anpassungen vornehmen kann.

Child Theme anlegen

Genug der Vorrede, die man sicher erweitern und diskutieren kann. Am Beispiel Theme TwentyTen soll nun eine angepasstes Theme entstehen - ich nenne es TwentyTenJump ;)

Im ersten Schritt wird ein neuer Ordner angelegt, in dem wir alle Template-Dateien, Bilder, Scripte und Stylesheets ablegen - was man im Grunde für das Child Theme benötigt. In diesem Beispiel ist das der Ordner twentytenjump. Um ein Child Theme zu erzeugen und WordPress dieses erkennbar zu machen bedarf es lediglich der style.css innerhalb der neuen Ordners mit diversen Strings in einem Kommentar.

Innerhalb der style.css sieht es wie folgt aus.


@charset "UTF-8";

/**
 * Theme Name:     TwentyTenJump
 * Theme URI:      http://bueltge.de/?p=1192
 * Description:    Child theme for the Twenty Ten theme. Realized for a small tutorial to child themes in WordPress.
 * Author:         Frank Bültge
 * Author URI:     http://bueltge.de/
 * Template:       twentyten
 * Version:        0.1.0
 */

@import url('../twentyten/style.css');

Entscheidend sind die Schlüssel Theme Name und Template. Der Schlüssel Template verweist auf den Ordner-Namen des Theme, welches als Basis gezogen wird - in diesem Beispiel das Theme Twentyten.

Folgenden Aufbau habe ich nun innerhalb der Installation von WordPress.

  • wp-content
    • themes
      • twentyten
      • (das Basis-Theme, inkl. aller Template-Dateien)

        • style.css
        • index.php
        • ...
      • twentytenjump
        • style.css (muss diese Namenskonvetion erfüllen: style.css)

Damit sind die ersten Voraussetzungen geschaffen und man kann das neue Theme im Backend von WordPress aktivieren.
Achtung: der Verweis auf das Basis-Theme ist nicht sonderlich auffällig, so dass man die Abhängigkeit übersehen könnte. Darum also immer kontrolliert ein Theme löschen. Am verwendeten Theme gibt es keinerlei Hinweis, dass ein anderes Theme als Child-Theme auf dieses Theme zugreift.

Child Themes in WordPress

Am Stylesheet drehen

Ab nun kann man jede beliebe Änderung in dem eigenen Stylesheet ablegen. Ebenfalls kann natürlich der Aufruf des Stylesheets @import url('../twentyten/style.css'); aus dem Basis-Theme entfallen und man kann sich komplett eigene Stylesheet-Strukturen aufbauen.

Man nutzt quasi die Template-Dateien, den Aufbau und das PHP-KnowHow vom Basis Theme, in dem Fall Twenty Ten. Man kümmert sich ausschließlich um das Design und das im beliebigen Umfang. Beispielsweise könnte das im einfachsten Fall eine Farbänderung des Hintergrund sein und alternativ kann ein komplett eigenes Design kreiert werden.

Templates ersetzen

Die Funktionalität des Child Theme lässt aber mehr zu als das Änderung des Aussehen. So kann man bestehende Template-Dateien des Basis-Themes ersetzen. WordPress sucht quasi im ersten Schritt im übergeordneten Child Theme und dann im Basis-Theme nach dem möglichen Template. Durchläuft dabei die Hierarchie der Template-Dateien.

An vielen Punkten vom Theme kann man via Hook eingreifen, was aber nicht jedem Nutzer liegt und kompliziert erscheint. So wird nicht selten die Ausgabe des Titel im head einer Website mit eigenen Funktionen oder von Plugins ersetzt. Man kann entweder via Hook den Titel bearbeiten oder die Ausgabe über eine Funktion steuern. Für das Beispiel soll nun der Titel mit einer Funktion aus einem Plugin ausgegeben werden. In dem Fall muss die header.php bearbeitet werden und darum muss man wie folgt vorgehen, so dass das Basis-Theme unangetastet bleibt.

Es ist lediglich die header.php, die den head-Abschnitt für das Theme enthält in das eigene Child Theme zu kopieren und hier kann sie beliebig bearbeitet werden. Ab nun zieht WordPress diese header.php und nicht mehr die Original-Datei aus dem Basis Theme Twenty Ten.

Damit kann nun auch die angesprochene Funktion in den Title integriert werden, ein Beispiel:


<title><?php
	/*
	 * Print the <title> tag based on what is being viewed.
	 * We filter the output of wp_title() a bit -- see
	 * twentyten_filter_wp_title() in functions.php.
	 */
	if ( function_exists('seo_title_tag') )
		seo_title_tag();
	else
		wp_title( '|', true, 'right' );

	?></title>

Das Basis-Theme bleibt unangetastet, kann weiterhin via Updates auf dem neusten Stand gehalten werden und ab nun zieht WordPress die header.php immer aus dem Child Theme.

Wie in diesem kleinen Beispiel kann man jedes Template ersetzen und so an die eigenen Anforderungen angepasst werden. Trotzdem sollte man bedenken, dass man das Template komplett ersetzt - in dem Beispiel-Fall würde man also ein Update der header.php nicht mitbekommen. Insofern kann es nützlich sein, wenn man auf diverse Bereiche besser via Hook zugreift und diese in eigenen Funktionen abbildet, dazu gleich mehr.

Wichtig: eine Ausnahme ist die functions.php, dazu im Anschluss mehr.

Templates erweitern

Um eigene Anforderungen zu erfüllen, kann es sein, dass man neue Templates benötigt, Template-Dateien die es im Ist-Zustand nicht im Basis-Theme nicht gibt. Im Sinne der Hirarchie kann man immer erweitern. Beispielsweise besitzt Twenty Ten keine home.php - sollte man die aber definieren wollen, also dann wenn die definierte Home-Seite des Backend im Frontend geladen wird, dann kann man diese Datei einfach in das Child-Theme ablegen und WordPress zieht diese Datei, wenn der Zustand is_home() wahr ist.

Mit WordPress Version 3.0 gibt es aber eine weitere Möglichkeit außerhalb der Template-Hirarchie um eigene Templates einzubringen - get_template_part().
Diese Funktion wird konsequent innerhalb von Twenty Ten verwendet - damit muss man in diversen Fällen keine eigenen Templates für den kompletten Aufruf anlegen, sondern lediglich den Abschnitt des Loop.
Beispielsweise nutzt Twenty Ten für die Darstellung der Kategorie-Archive den Aufruf get_template_part( 'loop', 'category' );. Damit ist es möglich, dass in unserem Child Theme ein Template abgelegt wird, was diesen Loop bedient. Es ist also lediglich eine Datei loop-category.php anzulegen und dort alle notwendigen Infos abzulegen.
Im folgenden Beispiel passe ich den Loop an, wenn man sich einem der vier Kategorien befindet. Weitere Änderungen sind möglich, so dass man volle Kontrolle und Flexibilität erhält.


// Anpassungen des Loop
if ( in_category( array(47, 37, 27, 45) ) ) {
	query_posts( 'cat='.$cat.'&posts_per_page=-1&orderby=title&order=ASC' );
}	else {
	query_posts( 'cat='.$cat.'&posts_per_page=20&paged='.$paged );
}
while ( have_posts() ) : the_post(); ?>

Ähnlich könnte man so den Loop für die index.php anpassen - Template Datei loop-index.php wäre dann im Spiel

Funktionen einbringen

Natürlich kann man auch innerhalb des Child-Theme eigene Funktionen einbringen. Wenn man eine eigene functions.php im Child Theme ablegt, dann ersetzt diese Datei nicht die functions.php des Basis-Theme!
Es werden immer die Funktionen des Basis-Theme genutzt; man muss sie via Hook deaktivieren. Die Möglichkeit wird auch in einer Doku in der Datei functions.php erklärt.


add_action( 'after_setup_theme', 'my_child_theme_setup' );
function my_child_theme_setup() {
		// We are providing our own filter for excerpt_length (or using the unfiltered value)
		remove_filter( 'excerpt_length', 'twentyten_excerpt_length' );
		...
}

Innerhalb der Funktion my_child_theme_setup() kann man nun Funktione des Basis-Theme deaktivieren und eigene Funktionen einbringen.

Weitere Funktionen gehören in die functions.php des Child Themes - das Basis-Theme bleibt immer unangetastet. Im folgenden Code dazu ein Beispiel.
Dabei deaktiviere ich die Funktion des Basis Theme Twenty Ten zur Länge des Excerpt und lade dazu eine eigene Funktion twentytenjump_excerpt_length() und es wird ein Widget eingebracht.


<?php
function twentytenjump_setup() {

	remove_filter( 'excerpt_length', 'twentyten_excerpt_length' );
	add_filter( 'excerpt_length', 'twentytenjump_excerpt_length' );

	add_action( 'widgets_init', 'register_limited_catagories_widget' );
}
add_action( 'after_setup_theme', 'twentytenjump_setup' );

function twentytenjump_excerpt_length( $length ) {
	return 10;
}

class limited_catagories_list_widget extends WP_Widget {

	function limited_catagories_list_widget(){
		$widget_ops = array( 'classname' => __('Selective categories'), 'description' => __('Show a list of Categories, with the ability to exclude categories') );

		$control_ops = array( 'id_base' => 'some-cats-widget' );
		$this->WP_Widget( 'some-cats-widget', __('Selective Catagories'), $widget_ops, $control_ops );
	}

	function form ( $instance){
		$defaults = array( 'title' => __('Catagories'), 'cats' => '', 'count' => 0 );
		$instance = wp_parse_args( (array) $instance, $defaults );
		$count = isset($instance['count']) ? (bool) $instance['count'] :false;
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" />
		</p>
		<p>
			<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>"<?php checked( $count ); ?> />
			<label for="<?php echo $this->get_field_id('count'); ?>"><?php _e( 'Show post counts' ); ?></label><br />
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'cats' ); ?>"><?php _e( 'Categories to exclude (comma separated list of Category-IDs): ' ); ?></label>
			<input id="<?php echo $this->get_field_id( 'cats' ); ?>" name="<?php echo $this->get_field_name( 'cats' ); ?>" value="<?php echo $instance['cats']; ?>" class="widefat" />
		</p>
		<?php
	}

	function update($new_instance, $old_instance) {
			$instance = $old_instance;
			$instance['title'] = strip_tags( $new_instance['title'] );
			$instance['count'] = !empty($new_instance['count']) ? 1 : 0;
			$instance['cats']  = strip_tags( $new_instance['cats'] );
			return $instance;
	}

	function widget($args, $instance){
		extract( $args );
		$title = apply_filters('widget_title', $instance['title'] );
		$c     = $instance['count'] ? '1' : '0';
		$cats  = $instance['cats'];
		echo $before_widget;
		if ( $title )
			echo $before_title . $title . $after_title;
		echo '<ul>';
		wp_list_categories("exclude=$cats&title_li=&show_count=$c");
		echo '</ul>';
		echo $after_widget;
	}

}

function register_limited_catagories_widget(){
	register_widget('limited_catagories_list_widget');
}
?>

Fazit

Ich meine aktuell, dass durch die Einführung des neuen Standard-Theme Twenty Ten sicher einige neue schöne Funktionen hinzugekommen sind. Ich denke aber ebenso, dass Twenty Ten sehr ungeeignet ist um die Arbeit von WordPress im Bereich des Themes zu verstehen. Gerade Einsteiger und PHP-Neulinge werden sich schwer tun. Trotzdem entstehen so neue Möglichkeiten und will man Child Themes sauber nutzen, dann kommt man um das Verständnis der Hooks in der WordPress API nicht herum. WordPress führt die Idee der Hooks konsequent fort, schon immer in Plugins beliebt, machen sie sich nun auch in Themes breit. Alles hat Vor- und Nachteile.
Nutzt man aber ein gut gepflegtes Theme oder Framework, dann wird man die neuen Möglichkeiten schätzen und kann so immer ohne Probleme Updaten. Entscheidend wird das eigene Wissen um WordPress sein - je nach Interesse, Wissensstand und Arbeitsweise kann man eigene Themes erstellen. Man sollte sich im Vorfeld Gedanken machen und nicht blind loslegen und wie so oft, am Theme schrauben.

Download:

Zum Abschluss noch das Theme mit den entsprechenden Template-Dateien als Downlaod, so dass man einen kleinen Start zum Spielen hat.

Spendenbutton

Ist die Arbeit nicht 1 Euro wert?
Jede Spende wird dankbar angenommen und ermöglicht das weitere Arbeiten an freier Software.
Möchtest du mehr oder anders spenden, so besuche meine Wunschliste.
Download als zip-Datei: twentytenjump.zip - 5 kByte
Einen Stand online einsehbar und erweiterbar, eventuell gepflegt findest du auf Github: github.com/bueltge/TwentyTenJump

46 Kommentare zu „WordPress Child-Themes verstehen“

  1. 1
    Kommentar von Micha

    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. 2
    Kommentar von Elias

    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. 3
    Kommentar von Michael Oeser

    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. 4
    Kommentar von Internetmarketing Mariusz

    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. 5
    Kommentar von Kevin

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

  6. 6
    Kommentar von Steffen

    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. 7
    Kommentar von chris

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

  8. 8
    Kommentar von Steffen

    komisch, kamen die Child Themes wirklich erst mit 3.0?

  9. 9
    Kommentar von Quincy

    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!

  10. 10
    Kommentar von nurmalso

    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.

  11. 11
    Kommentar von Caspar

    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. 12
    Kommentar von Thomas

    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

  13. 13
    Kommentar von Mark

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

  14. 14
    Kommentar von Swedlix

    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. 15
    Kommentar von Frank Bültge

    @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.

  16. 16
    Kommentar von Frank Bültge

    @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.

  17. 17
    Kommentar von Frank Bültge

    @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.

  18. 18
    Kommentar von Thomas

    @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?

  19. 19
    Kommentar von Frank Bültge

    @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.

  20. 20
    Kommentar von Kenny

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

  21. 21
    Kommentar von Kopfschüttler

    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.

  22. 22
    Kommentar von Frank Bültge

    @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?

  23. 23
    Kommentar von Kopfschüttler

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

  24. 24
    Kommentar von teamrocket700

    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?

  25. 25
    Kommentar von Frank Bültge

    Nein, deine Annahme ist falsch - eventuell den Artikel nochmals lesen.

  26. 26
    Kommentar von Eberhard Huber

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

  27. 27
    Kommentar von klaus-peter

    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!

  28. 28
    Kommentar von klaus-peter

    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.

  29. 29
    Kommentar von Frank Bültge

    @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.

  30. 30
    Kommentar von klaus-peter

    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.

  31. 31
    Kommentar von Frank Bültge

    @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.

  32. 32
    Kommentar von Tobias Kaufer

    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!

  33. 33
    Kommentar von Farid

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

  34. 34
    Kommentar von Hansjörg

    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

  35. 35
    Kommentar von Frank Bültge

    @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.

  36. 36
    Kommentar von Dennis

    Hi Frank,

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

  37. 37
    Kommentar von der-kleine-pawel

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

  38. 38
    Kommentar von Tim

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

    Tim

  39. 39
    Kommentar von Dominik

    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

  40. 40
    Kommentar von Frank Bültge

    @Dominik: ja; du kannst erweitern, ersetzen

  41. 41
    Kommentar von Andreas Paul

    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

  42. 42
    Kommentar von Frank Bültge

    @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.

  43. 43
    Kommentar von Jürgen Thulke

    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.

  44. 44
    Kommentar von Andreas Paul

    @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

  45. 45
    Kommentar von Frank Bültge

    @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.

  46. 46
    Kommentar von Carlo

    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.

Kommentar schreiben

Kommentarregeln: Bleib cool, kritisch ist in Ordnung, aber wenn du unhöflich bist, dann lösche ich deinen Kommentar. Bitte benutze deinen persönlichen Namen oder Initialen und nicht den Namen eines Unternehmens, dies würde als Spam gewertet und wird gelöscht. Der Zusammenhang zwischen Namen und URL sollte nicht offensichtlich auf Spam hindeuten! ♥ Ansonsten, vielen Dank für den Kommentar und viel Spaß mit meinem Blog.

E-Mail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

Kommentar-Hilfe

händischer Spam:
Beachte die Kommentarregeln, jede Form von versuchtem Spam wird gelöscht. Warum und wieso steht in einem meiner Beiträge.

Bezug auf Textstellen:
Du kannst direkt bezug auf Textstellen im Beitrag nehmen. Dazu muss lediglich der Bereich im Artikel markiert werden; daraufhin erscheint ein Button, der den markierten Text in das Kommentarfeld übernimmt und als Zitat auszeichnet. Die Funktion ist nur bei aktivem JavaScript nutzbar.

xHTML:
Du kannst folgende Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <pre> <em> <strong> <strike> <ul> <ul> <li>

Achte darauf, wenn du Code im Kommentar hinterlegen willst, dann muss der Code maskiert sein. Dann wird er nicht interpretiert. Der Code muss mit Hilfe von HTML-Entities dargestellt werden, d.h. dass man z.B. < als &lt; und > als &gt; einfügt.

E-Mail-Benachrichtigung bei neuen Kommentaren ?
Wenn der Haken in der Checkbox gesetzt ist, dann wirst du über neue Kommentare vie E-Mail informiert. Der Versand erfolgt nur, wenn du die URL in der Bestätigungs-E-Mail genutzt hast oder schon Abonnent hier im Blog bist.

Kommentar erscheint nicht:
Alle Kommentare werden manuell geprüft, freigegeben und nach Möglichkeit beantwortet. Bitte um etwas Geduld und Nachsicht.

Identifikationsbilder (Avatare):
Auf Gravatar.com kann man sich mit seiner E-Mail-Adresse registrieren und ein Bild hochladen, dann erscheint dieses Gravatar hier und in vielen weiteren Blogs.

Spamschutz:
Das Kommentarformular ist mit einem Spamschutz ausgerüstet. Solltest du diesen Artikel ohne JavaScript besuchen und kommentieren wollen, so muss du die Frage beantworten und das jeweilige Wort in das Textfeld eingeben.