Über Hooks und Funktionen in WordPress

Hooks und Funktionen in WordPress

In der Entwicklung mit WordPress kann man sehr schnell Ergebnisse vorweisen. Das liegt daran, dass neben einer relativ guten Dokumentation auf niedrige Hürden gesetzt wird: Es gibt weder eine Templatesprache, noch eine eigene Scriptsprache. WordPress setzt auf einfaches PHP und bietet für die Entwicklung sehr viele gute Werkzeuge an.

Eines der Werkzeuge sind sogenannte Hooks. Ein Hook ist eine Einsprungmarke, an welche der eigene Code gehangen wird. So erlangt man eine volle Kontrolle, wann welches Script ausgeführt werden soll. Der Vorteil liegt klar auf der Hand: Code wird nicht unabsichtlich oder unbeabsichtigt ausgeführt. Das erhöht die Performance und Sicherheit.

Innerhalb von WordPress gibt es zwei verschiedene Arten von Hooks: Actions und Filter. Der Hauptunterschied zwischen diesen beiden Prinzipien ist die Semantik. Beide Hook-Arten machen im Grunde das Gleiche, jedoch in einem anderen Kontext, welcher für die Programmierung interessant ist. Bei Actions werden Dinge ausgeführt. In den Filtern werden Daten und Ausgaben manipuliert.

Actions

Wenn WordPress geladen wird, werden verschiedene Actions an verschiedenen Punkten ausgeführt. In der /wp-settings.php finden wir zum Beispiel Folgendes:

[/crayon]

Diese Action (Link zum Source) wird ausgeführt, nachdem das WordPress Grundsystem hochgefahren und alle Plugins eingebunden wurden. Normalerweise hängt man sich mit den Plugins an diese Stelle in WordPress rein.

[/crayon]

Diese Action (Link zum Source) wird ausgeführt, nachdem die Theme-Dateien geladen und alle relevanten Daten verarbeitet worden sind. Sollten Themes irgendwelche Features, wie Widgets oder Menüs, mitbringen, dann werden diese normalerweise in diesem Kontext ausgeführt.

Möchte man sich jetzt an eine dieser Hooks hängen, dann kann man die Funktion add_action() benutzen. Diese registriert die eigene Funktion an einer bestimmten Action. Wenn wir in die /wp-includes/plugin.php schauen, dann sehen wir Folgendes:

[/crayon]

Die Funktion (Link zum Source) add_action() ist – wie oben bereits geschrieben – eigentlich das Gleiche wie ein Filter, nur in einer anderen Semantik. Hier haben wir es schwarz auf weiß. Dennoch sollte add_action() verwendet werden, da so gleich der Kontext mitgegeben wird. Die einzelnen Parameter kann man hier getrost ignorieren.

Wollen wir uns an einen dieser Hooks hängen, kann der Code so aussehen:

[/crayon]

Wir haben hier das Plugin an die Action ‘plugins_loaded’ gehangen. Wirft man einen Blick (Link zum Source) in die Funktion do_action(), dann sieht man, dass alle registrierten Aktionen geholt und in einer Schleife über den Befehl call_user_func_array() ausgeführt werden. Sobald WordPress an unserer Action ankommt, wird es gestoppt.

WordPress selbst hat im Core noch wesentlich mehr Actions registriert. Zu guter Letzt ein praktisches Beispiel: Wollen wir im Theme innerhalb des -Bereiches einen weiteren Meta-Tag ausgeben, dann sieht der Code dafür so aus:

[/crayon]

Wie wir sehen, starten wir erst innerhalb der Aktion after_setup_theme. So können wir sicher gehen, dass alle Daten geladen wurden. In der Funktion wpc_my_theme_init() registrieren wir die Aktion, welche dann den Meta-Tag ausgibt.

Filter

Filter sind in WordPress dazu da, bereits existierende Daten zu manipulieren. Sehr viele Variablen in WordPress lassen sich filtern. Das fängt bei kleinen einfachen Variablen an und kann so weit gehen, dass der komplette Inhalt eines Blogbeitrages geändert wird.

Filter werden in WordPress über den Befehl add_filter() registriert. Im Gegensatz zu den Actions sollte man hier die einzelnen Parameter (Link zum Source) nicht ignorieren.

[/crayon]

Die Parameter $tag und $function_to_add haben wir oben schon in dem Beispiel für Actions benutzt. Dabei repräsentiert $tag den eigentlichen Filter, zum Beispiel the_title und $function_to_add die Funktion, die ausgeführt werden soll, zum Beispiel wpc_manipulate_the_title(). Der optionale Parameter $priority zeigt an, in welcher Reihenfolge Aktionen ausgeführt werden sollen. Der Wert 10 ist für die meisten Filter ausreichend. Mit dem Parameter $accepted_args legen wir fest, wie viele Argumente eine Funktion mitbekommt. Dieser Wert ist für uns interessant, da einige Filter mehr als einen Parameter liefern können. Dazu gleich mehr.

Filter werden in WordPress mit dem Befehl (Link zum Source) apply_filters() ausgeführt. Wie auch in do_action() werden hier alle registrierten Filter durchlaufen und über call_user_func_array() geladen. Haben wir im Core einen Filter, dann kann das so (Link zum Source) aussehen:

[/crayon]

Wie wir sehen, werden zwei Parameter registriert, zum einen $title (im Grunde ist das der fertige String für einen Beitragstitel kurz vor der Ausgabe) und $id (das ist die ID des Beitrages, für welchen der Titel bestimmt ist). Da innerhalb von apply_filters() der Befehl call_user_func_array() steht werden auch alle Parameter mitgeliefert, aber interessanterweise auch nur so viele, wie wir im Parameter $accepted_args mitgeben. Das heisst, dass wir uns aussuchen können, ob wir alle Parameter brauchen, oder nur einen.

Möchten wir zum Beispiel nur den Titel eines Beitrages manipulieren, dann kann der Code so aussehen:

[/crayon]

Wie wir hier sehen können, geben wir an add_filter() keine weiteren Parameter mit, da die Default-Werte für unsere Zwecke völlig ausreichend sind. Möchten wir jedoch noch einen Wert zum Beispiel aus den Post-Metas laden, um diesen am Titel zu zeigen, dann sieht das so aus:

[/crayon]

Da wir jetzt die beiden möglichen Parameter aus den apply_filters() verwenden, müssen wir den Parameter $accepted_args auf zwei setzen. (Da wir die Priorität nicht ändern wollen, setzen wir diesen Wert auf den Standard-Wert, also 10.) In der Funktion call_user_func_array() wird nun ein Parameter-Array übergeben, welches genau zwei Werte enthält. Das Ganze kann dann so erweitert werden, dass zum Beispiel (Link zum Source) im Filter request_filesystem_credentials bis zu sechs Parameter verwendet werden können.

Eigene Filter und Actions definieren

Was WordPress anfängt, sollte in eigenen Plugins und Themes unbedingt fortgeführt werden. Ich selbst finde es sehr hilfreich, wenn eigene Actions und Filter definiert werden. Somit ist es möglich, über zusätzliche Plugins das eigene Plugin zu erweitern. Das Plugin WooCommerce ist dafür eines der schönsten Beispiele. Hier werden im ganzen Source-Code eigene Actions und Filter registriert, die dann über Plugins manipuliert werden können. Nur so ist es möglich, dass es mehrere hundert Plugins allein für WooCommerce gibt.

Als erstes Beispiel für eigene Actions möchte ich den Template-Part eines Themes zeigen (etwas gekürzt). Für den Kontext: Dieser Template Part wird innerhalb der single.php via get_template_part() aufgerufen.

[/crayon]

Hier werden zwei Actions definiert: wpc_my_theme_single_post_before_content und wpc_my_theme_single_post_after_content. Schreiben wir ein Plugin für das Theme, dann können wir eine dieser beiden Actions benutzen. Natürlich können wir uns auch an the_content hängen. Aber vielleicht gibt es ja den einen oder anderen Anwendungsfall, bei dem diese beiden Actions gebraucht werden.

[/crayon]

In diesem Beispiel geht es um ein Plugin. Hier haben wir eine Action registriert, nachdem alle Arbeiten im Plugin abgeschlossen sind. Damit ist es möglich, dass weitere Plugins sich genau hinter diese Action klemmen und so Code ausführen, der für das Plugin interessant wäre.

Für Filter sieht die Sache ähnlich aus. Wo auch immer wir mit definierten Variablen arbeiten, kann es Sinn machen, eigene Filter zu registrieren:

[/crayon]

Hier haben wir einen Filter auf die Variable $meta gelegt, welcher zwei Parameter mitbringt. Damit ist es möglich, den Wert über verschiedene Plugins zu beeinflussen.

Komplexe Funktionen sauber gestalten

Neben einem ordentlichen Code-Style (Präfixe, richtige Benennung von Funktionen und Variablen) ist es wichtig, dass komplexere Funktionen mit mehreren Parametern gut gestaltet werden. Anhand dieser Beispielfunktion können wir die Möglichkeiten einschätzen:

[/crayon]

Innerhalb dieser Funktion werden insgesamt drei Filter registriert: pre_my_plugin_wp_list_categories, my_plugin_wp_list_categories_args und my_plugin_wp_list_categories. All diese Filter haben eine bestimmte Aufgabe:

  • pre_my_plugin_wp_list_categories – Der Pre-Filter dient dazu, die komplette Funktion auszuhebeln, um einen eigenen return zu definieren. Der erste Parameter ‘FALSE’ dient als Überprüfung für den möglichen break der gesamten restlichen Funktion.
  • my_plugin_wp_list_categories_args – Der Args-Filter ist für Funktionen mit mehr als einem Parameter gedacht. Hier können vor dem eigentlichen Programmcode noch die Argumente manipuliert werden. Als Übergabewert dient das Array $args, welches schon mit den $default_args zusammengeführt wurde.
  • my_plugin_wp_list_categories – Der Return-Filter dient dazu, das letztendliche Ergebnis nochmals filtern zu können, um etwaige Features anzuhängen. Im Return-Filter können weitere Attribute zu der $return_value und den $args hinzugefügt werden, um diese sinnvoll zu ergänzen.

Allein mit diesen drei Filtern ist es möglich, das komplette Plugin von einem anderen Plugin ändern zu lassen – Pluginception sozusagen.

Fazit

Hooks sind eine tolle Sache und sollten verwendet werden, um WordPress zu erweitern. Auch eigene Plugins und Themes sollten eigene Filter mitbringen. Entwicklerinnen bieten wir so die Möglichkeit, unsere Sachen zu ändern, ohne umständlich zu Forken, das Support-Forum zu bemühen oder überhaupt irgendeinen zeitaufwendigen Kontakt herzustellen. So können Dinge mit dem eigenen Plugin entstehen, an welche bei der Entwicklung gar nicht gedacht worden sind.
 
Der Beitrag wurde ursprünglich auf wpcoding.de veröffentlicht.

Beitrag teilen

Author Avatar

Thomas ist Senior-WordPress-Entwickler bei der Inpsyde GmbH, der aber auch über den Tellerand hinaus schaut und sprachunabhängig entwickeln kann. Der 1985 geborene Wahl-Düsseldorfer macht in seiner Freizeit Musik, spielt Spiele, kocht gern und verbringt seine Zeit am liebsten mit seiner Frau.

Auch interessant:

youtube

Neu: Video-Tutorials für German Market

von Michael Firnkes

Du willst wissen, wie sich die einzelnen Module in unserer Rechtssicherheits-Suite German Market für WooCommerce bedienen lassen? Dann helfen wir dir jetz ...

Weiterlesen
woonews19

WooCommerce Wochenrückblick #19: Google Analytics, kostenlose Themes und neue Kennzeichnungspflicht

von Michael Firnkes

Die Shop-Analyse ist wichtig, muss aber rechtlich abgesichert werden. Für WooCommerce gibt es neue Theme-Inspirationen und ein neues German Market. Dies u ...

Weiterlesen
slack-blog

Neues Plugin: Slack Connector - Verbinde WordPress, WooCommerce und Slack

von Michael Firnkes

Anfangs wollten wir lediglich unsere eigenen Slack-Prozesse optimieren. Mit automatisierten Benachrichtigungen aus dem MarketPress-Shop, dem Blog und unser ...

Weiterlesen
woo26

WooCommerce 2.6: Deutlich mehr Versandoptionen, bessere Bestellübersicht

von Michael Firnkes

WooCommerce 2.6 "Zipping Zebra" steht kurz vor der Veröffentlichung, das Release ist für kommenden Dienstag geplant. Wir zeigen dir, was sich für dich ...

Weiterlesen

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="">