Make Blog - Themes

Actions, Filters und after_setup_theme

Unsere Themes und unser Plugin WooCommerce German Market bieten mit ihren Hooks ein simples API zur Individualisierung. Meist geschieht geht es darum, ein Code-Snippet in die functions.php eines Child-Themes einzufügen.

Beispiel: du betreibst eine Installation mit WooCommerce German Market (WGM) + Theme Hamburg + Child-Theme und möchtest den Hinweis zu Lieferzeiten in einem Produkt an einer anderen Stelle haben, als WGM bzw. Hamburg ihn platzieren.

Du platzierst ein Code-Snippet z.B. ans Ende deiner functions.php, aber es bleibt ohne Effekt. Die gewünschte Anpassung tritt nicht in Kraft. In diesem Tutorial beleuchten wir, warum nicht und wie du deine Hook-Aufrufe vom Child-Theme aus richtig ans Laufen bringst.

Filter ein- und aushaken

Das Prinzip ist relativ einfach, wo WooCommerce und WGM mit Filtern arbeiten:

  1. Den WGM-Filter herausfinden; das geht meist ganz gut über eine Quelltext-Suche;
  2. den WGM-Filter mit remove_filter() aushaken …
  3. … und mit add_filter() und der gewünschten neuen Priorität wieder einhaken.

(Auf demselben Weg lässt sich auch die Ausgabe der Funktion beeinflussen, die durch den Filter geschickt wird: zwischen Schritt 1 und 2 eine eigene Funktion mit ähnlicher Ausgabe definieren und diese statt der WGM-eigenen Methode in Schritt 3 wieder einhängen.)

Falltür: neue Filter-Prio vom Theme

Für unser Beispiel mit dem Lieferzeiten-Hinweis unter jedem Produkt hakt WGM sich mit einer Prio 11 bei WooCommerce ein:

Theoretisch könnten wir hier also, vom Child-Theme aus, mit derselben Priorität 11 die Nummer mit aus-/einhaken bringen. Allerdings kommt Hamburg uns als Parent-Theme dabei zuvor:

Die neue Prio, die wir ändern wollen, ist also die 30 – und nicht mehr die 11 aus WGM!

Problem: Nix tut!

Für unser Beispiel von oben würden wir versuchen, über folgendes Snippet in der functions.php des Child-Themes den Filter mit der richtigen Prio des Themes zu entfernen:

Kopieren wir dieses Snippet irgendwo in unsere functions.php, sehen wir: nix passiert, der gewünschte Effekt bleibt aus. Warum?

Die functions.php des Child-Themes wird vor der functions.php des Parent-Themes ausgeführt. Das add_filter() aus Hamburg kommt in der Reihenfolge nach dem remove_filter() aus Hamburg Child – das Parent-Theme überschreibt an dieser Stelle also das Child-Theme!

Reihenfolge der Ausführung von Parent- und Child-Theme

Schauen wir uns dazu das Flow-Chart von Andrey „Rarst“ Savchenko zur Initialisierung von WordPress an:

wordpress_core_load

Wir sehen: Offensichtlich wird die functions.php des Child-Themes vor der functions.php des Parent-Themes ausgeführt. Warum? Darum: Das Child-Theme soll sowohl Funktionen, als auch Templates des Parent-Themes überschreiben können.

  • Bei den Template-Dateien der Themes sorgt die WP-Architektur für eine einfache „Entweder-oder“-Hierarchie. Es wird entweder die Datei aus dem Child-Theme, oder (wenn es jene nicht gibt) die Datei aus dem Parent-Theme eingebunden.
  • Bei der functions.php gibt es diese „Entweder-oder“-Hierarchie so nicht. Hier soll das Child-Theme ggf. Funktionen überschreiben können, die im Parent-Theme definiert wurden. Dazu müssen diese Funktionen aber erstmal bekannt sein!
  • Aus diesem Grund lädt WordPress zuerst die functions.php des Parent-Themes, und danach die des Child-Themes. Nur mit dieser Reihenfolge kann ein Beispiel wie das folgende funktionieren:

Am Ende aller Dinge: after_setup_theme

Damit man Code ausführen kann, nachdem beide Themes – Parent und Child – geladen wurden, gibt es den Action Hook after_setup_theme.

Wenn wir vom Child-Theme aus also einen Filter entfernen möchten, der vom Parent-Theme aus bespielt wird, müssen wir die entsprechende remove_filter()-Funktion innerhalb der Funktion ausführen, die über den after_setup_theme-Hook ausgeführt wird. Diese Funktion nennen wir salopp oft die „Setup“-Funktion, was aber eigentlich nicht ganz richtig ist; sie kommt nach dem Theme-Setup.

In unserem Child-Theme für Hamburg ist das die Funktion hamburg_child_setup():

Damit wird unser remove_filter() nach der functions.php von Hamburg selbst ausgeführt und kann den dort erst wieder hinzugefügten Filter tatsächlich entfernen.

Zusammenfassung

Bei Anpassungen über die functions.php eines Child-Themes ist es notwendig, den Sonderfall in der Template-Hierarchie zu beachten, den diese Datei darstellt. WordPress lädt, aus gutem Grund, zuerst die functions.php des Parent-Themes, und danach die des Child-Themes.

Für die Ausführung einer Funktion nach dem Laden beider functions.php-Dateien gibt es den Hook after_setup_theme. Gute Themes nutzen diesen Hook. Du findest ihn sowohl in den (Parent-)Themes von MarketPress, als auch in unseren Child-Theme-Vorlagen.

Um deine eigenen Anpassungen über die Hooks von WooCommerce und WooCommerce German Market via functions.php in einem Child-Theme umzusetzen, solltest du Aufrufe von add_action() und add_filter() in der Regel immer innerhalb der „Setup-Funktion“ platzieren, die über den Hook after_setup_theme ausgeführt wird.

Beitrag teilen

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">