Funktionen eines Themes in Deinem Child-Theme zu überschreiben ist ganz einfach. WordPress bietet Dir dafür drei Möglichkeiten. Welche für Dich in Frage kommt, bestimmt die Umsetzung Deines Parent Themes.
Voraussetzung zum Überschreiben der Funktionen eines Themes ist das Anlegen eines Child-Themes, das alle Eigenschaften des Themes erbt. Solltest Du noch kein Child-Theme angelegt haben, kannst Du das mit dieser Anleitung nachholen: Child Theme erstellen.
Hast Du bereits ein Child-Theme, wirst Du wissen, dass Du Templates wie single.php ganz einfach überschreiben kannst, indem Du sie in das Verzeichnis Deines Child-Themes kopierst. Dort kannst Du sie beliebig anpassen. Mit Funktionen ist das nicht viel schwerer. Allerdings hängt die Art wie Du sie überschreibst ganz davon ab, wie sie im Theme implementiert wurde.
Funktionen in WordPress Themes
In WordPress stehen Dir jederzeit alle Funktionen eines Parent-Themes im Child-Theme zur Verfügung. Du musst also nichts dafür tun, um auf sie zugreifen zu können. Allerdings werden die Funktionen in einer strikten Reihenfolge geladen. Zuerst die Funktionen aus Deinem Child-Theme, dann die des Parent-Themes.
Kopierst Du eine Funktion aus Deinem Parent-Theme, dem anzupassenden Eltern-Theme, in die functions.php Deines ChildThemes, ist diese zwei mal vorhanden. Da die Funktion Deines Parent-Themes später geladen wird, überschreibt sie die kopierte Funktion in Deinem Child-Theme. Das kannst Du verhindern, indem Du der kopierten Funktion in Deinem Child-Theme eine geringere Priorität übergibst. Sie also erst nach der Funktion des Parents geladen wird. Daneben es noch zwei weitere Möglichkeiten, Funktionen zu überschreiben.
Drei Arten Funktionen zu überschreiben
- Funktionen vom Hook löschen
- Funktion mit niedriger Priorität überschreiben
- Austauschbare Funktionen überschreiben
Welche Art zum Überschreiben der Funktion Du wählst, hängt von der Implementierung der Funktion ab.
Wird die Funktion mit dem Aufruf add_action an einen Hook gehängt, musst Du sie mit remove_action vom Hook löschen.
Befindet sich die Funktion in einer IF-Abfrage, kannst Du sie einfach überschreiben.
Funktion vom Hook löschen
Wer sich mit den Kernfunktionen von WordPress auseinander setzt, oder ein Framework wie Genesis nutzt, wird Action- und Filter aufrufe kennen. Mit ihnen werden Funktionen an einen Hook gebunden, von ihm entfernt, verändert oder ausgeführt.
Wurde eine Funktion mit add_action an einen Hook gebunden, gibt es zwei Wege, sie zu überschreiben. Du kannst sie entfernen und anschliessend Deine eigene als Ersetzung an den Hook anhängen, oder sie mit einem Filter direkt ändern. Letztere Variante ist nur möglich, wenn ein Filter zum Überschreiben bereitgestellt wurde.
Als Beispiel führe ich hier die Funktion eines Themes an, in welcher der Footer des Themes generiert wird.
function parent_footer_content() {
echo $footer_content;
}
add_action('theme_footer', 'parent_footer_content');
Die Funktion parent_footer_content() erstellt den Inhalt des Footers. Anschliessend wird sie mit add_action an den Hook ‘parent_footer’ übergeben.
Diese Funktion löschen wir, indem wir exakt den selben Aufruf von add_action übernehmen und add_action durch remove_action ersetzen. Wobei remove_action dem Hook ‘init’ angehängt wird. Warum? Weil init erst feuert, wenn bereits alle Funktionen geladen wurden und wir nur eine Funktion löschen können, die bereits an einen Hook angehängt wurde.
Die Löschung der Funktion parent_footer_content erfolgt korrekt durch folgenden Aufruf:
function remove_parent_footer_content(){
remove_action( 'theme_footer', 'parent_footer_content' );
}
add_action('init', 'remove_parent_footer_content');
Wir haben eine Funktion “remove_parent_footer_content()” erstellt. Der Name sollte bezeichnend sein, kann aber frei gewählt werden. Darin führen wir unseren remove_action Aufruf aus. Anschliessend hängen wir unsere Löschfunktion an den Hook ‘init’. Damit ist die Funktion entfernt.
Wir wollten sie jedoch nicht entfernen, sondern überschreiben. Deshlab erstellen wir unsere Funktion, die den Inhalt des Footers erzeugt und fügen sie dem Hook ‘theme_footer’ erneut hinzu.
function child_footer_content() {
echo $footer_content;
}
add_action('theme_footer', 'child_footer_content');
Geht es darum, Funktionen bzw. Funktionsausgaben zu ändern, bietet es sich an, zuvor nachzusehen, ob ein Filter existiert. Ein Filter erlaubt die Änderung der Funktion, ohne sie löschen und anschliessend wieder hinzufügen zu müssen. Ein Beispiel zur Überschreibung des Titles für die Fehlerseite beim Framework Genesis:
add_filter( 'genesis_404_entry_title', function(){return 'Seite nicht gefunden, Fehler 404';});
Die Funktion habe ich hier direkt als Argument übergeben. Solltest Du Dir nicht sicher sein, ob es einen Filter für die zu ändernde Funktion gibt, kannst Du nach apply_filter suchen.
Ein häufiger Fehler
Sollte sich Deine Funktion nicht von einem Hook löschen lassen, liegt das meist darn, dass der remove_action-Aufruf nicht exakt dem add-action-Aufruf gleicht. Wird beispielweise die Angabe der Priorität vergessen, obwohl sie bei add_action vom Standard 10 abweicht, scheitert der Versuch sie zu löschen. Im folgenden Beispiel würde die Löschung scheitern, weil es zwei verschiedene Prioritäten gibt, 25 und Standard 10.
add_action('hook', 'function', 25);
remove_action('hook', 'function');
Funktion mit niedriger Priorität überschreiben
In diesem Fall kannst Du Dir Dein bis jetzt erlangtes Wissen über Worpress zu Nutze machen. Du kopierst die Funktion in die functions.php Deines Child-Themes und übergibst ihr eine niedrigere Priorität, als die zu überschreibende Funktion. Wobei eine niedrige Priorität einer hohen Zahl entspricht. Ist in der zu überschreibenden Funktion keine Priorität angegeben, besitzt sie die Standardpriorität von 10.
Austauschbare Funktionen
Die wohl einfachste Variante. Die zu überschreibende Funktion befindet sich in einer IF-Abfrage. Es wird also geprüft, ob eine Funktion mit dem selben Namen bereits existiert. Ist das der Fall, wird die darin befindliche Funktion nie aufgerufen.
Sobald Du also eine Funktion mit gleichen Namen in die funtions.php Deines Child-Themes kopiert hast, wird die Funktion im Parent-Theme ignoriert. Du brauchst also nichts weiter machen, als die Funktion in die funktions.php Deines Child-Themes zu kopieren und dort Deinen Wünschen anzupassen.
Zusammenfassung
Die Art und Weise, wie Funktionen in einem Child-Theme überschrieben werden, hängt massgeblich von zwei Faktoren ab.
- Wie sind sie im Parent-Theme implementiert
- Möchte man die FUnktion löschen oder ändern
Funktionen die sich in einer IF-Abfrage befinden, können einfach in die functions.php Deines Child-Themes kopiert und dort geändert werden.
An einen Hook angehängte Funktionen müssen von diesem entfernt, neu angehängt, oder mit einem Filter geändert werden.
Du benötigst Hilfe bei der Anpassung Deiner WordPress-Seite. Dann schreibe mir.
Schreibe einen Kommentar