Child Plugins: Die Funktionsweise von Plugins mit Hooks anpassen

Im ersten Beitrag zum Thema Child Plugins habe ich euch berichtet, wie man Konstanten einsetzen kann, um Plugins anzupassen. Darin habe ich auch erwähnt, dass man Konstanten als Entwickler eher vermeiden sollte. Heute möchte ich euch einen Weg vorstellen, wie man es besser machen kann.

Das WordPress Hook-System

Eines der mächtigsten Werkzeuge bei der Anpassung von WordPress sind die sogenannten Hooks. Dieser Oberbegriff meint die beiden Varianten Actions und Filters. Mit diesen beiden Hilfsmitteln kann man den WordPress Core, aber auch Themes und Plugins anpassen.

Action oder Filter?

Zuerst einmal sollten wird den Unterschied zwischen Action und Filter kurz erklären. Diese werden gerade von Anfängern in der WordPress Programmierung gerne mal verwechselt oder gar als Synonym verwendet. Rein technisch gesehen kann man schon mal auf die Idee kommen, dass sie ein und das selbe sind, denn die Funktion zum Verwendung einer Action ruft die Funktion für Filter einfach nur auf:

function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
   return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

Wo also liegt der Unterschied zwischen den beiden? Und welchen sollte man in welchem Falle verwenden? Man kann es sehr vereinfacht wie folgt darstellen:

Filter

  • Ein Filter-Funktion bekommt eine Variable übergeben
  • Innerhalb des Filters wird diese Variable „gefiltert“, also eventuell verändert
  • Die Funktion gibt die Variable anschließend zurück
  • Seiteneffekte (z.B. Text per „echo“ ausgeben, Dateien speichern, E-Mails verschicken, etc.) sollten in einer Filter-Funktion vermieden werden

Action

  • Die Action-Funktion muss keine Variable übergeben bekommen
  • Eine Action-Funktion führt einen Seiteneffekt aus (z.B. einen Text per „echo“ ausgeben, Dateien verarbeiten)
  • Die Funktion gibt in der Regel nichts zurück

Möchtet ihr also einen Wert in einem Plugin verändern, dann verwendet ihr einen Filter, möchtet ihr z.B. an einer bestimmten Stelle zusätzlichen Text ausgeben, dann verwendet ihr eine Action.

Verwendung eines Filters

Ich möchte im heutigen Beitrag erst einmal nur kurz auf beide Möglichkeiten eingehen und sie in den nachfolgenden Artikeln etwas tiefer beleuchten. Ich habe mir das bekannte Yoast SEO Plugin ausgesucht, um euch die Grundlagen zu zeigen. Dieses bietet eine Reihe von vordefinierten Filtern und Actions an. Einer dieser Filter ermöglicht es z.B. das og:image zu verändern, das dafür zuständig ist, ein Bild für das Teilen eines Beitrags in sozialen Netzwerken, zu definieren. Das Open Graph protocol wurde zwar von Facebook entwickelt, aber auch viele andere Netzwerke nutzen diese Metadaten. Nehmen wir einfach mal den Anwendungsfall, dass ihr für die Kategorie-Archive ein spezielles Bild verwenden möchtet. Dann könnt ihr folgenden Filter einsetzen:

function category_archive_og_image( $image ) {

   if ( is_category() ) {
      $image = get_stylesheet_directory_uri() . '/images/category_thumbnail.png';
   }

   return $image;
}
add_filter( 'wpseo_opengraph_image', 'category_archive_og_image' );

An den Filter wpseo_opengraph_image wird dabei eine eigene Callback-Funktion category_archive_og_image gehängt. Diese prüft, ob es sich bei der aufgerufenen Seite um eine Kategorie-Archivseite handelt und tauscht in diesem Fall das Bild aus. Hier sehen wir also, dass der Filter einen Wert erhält, diesen verändert und anschließend zurückgibt. Es gibt auch keinen Seiteneffekt (z.B. die Ausgabe eines IMG-Tags).

Verwendung einer Action

Ähnlich verhält es sich mit Actions. Auch diese werden über eine eigene Funktion erweitert. Möchten wir z.B. weitere Open Graph Metadaten in den Kopf der Seite einfügen, die Yoast SEO selbst nicht definiert, so können wir das mit einer Action tun:

function add_custom_metadata_to_opengraph() {
	echo '<meta name="og:locale:alternate" content="en_US" />';
}
add_action( 'wpseo_opengraph', 'add_custom_metadata_to_opengraph' );

Im Beispiel definieren wir, dass die aktuelle Seite ebenfalls in englischer Sprache verfügbar ist. Innerhalb der Action-Funktion, die hier auch keine Variable übergeben bekommt, wird dafür zusätzlicher HTML-Code per „echo“ ausgegeben. Eine Rückgabe gibt es allerdings nicht.

Fazit

Da ich euch nicht gleich mit den vielen Möglichkeiten beim Einsatz von Hooks, also Actions und Filtern, überfordern möchte, soll es das fürs Erste gewesen sein. Im nächsten Artikel werde ich euch zeigen, wie diese Hooks im Quellcode von Plugins umgesetzt sind, wie ihr sie also finden könnt, wenn es keine Dokumentation gibt. Aber natürlich auch, wie ihr als Plugin-Entwickler am besten selbst solche Hooks anbieten könnt. Bis dahin freue ich mich natürlich wieder über eure Kommentare und Anmerkungen 🙂

Weitere Artikel zu Themenreihe

Dies ist der zweite Teil der Themenreihe „Child Plugins“. Hier findest du die anderen Beiträge:

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

2 Kommentare » Schreibe einen Kommentar

  1. Hi,
    erstmal danke für die recht anschauliche Erklärung.
    Mit der Programmierung beschäftige ich mich meist nur am Rande, wenn ein Problem mal nicht gelöst wird und ich selber Hand anlege.
    Daher bitte die Frage ersnt nehmen, ist kein versteckter Linksschreiboberlehrer….

    Hast du die Funktion extra so genannt? also CUTOM anstelle von CUSTOM um Problemen mit anderen aus dem Weg zu gehen, oder ist da doch einfach nur ein Buchstabe übersehen worden?

    • Hallo Micha,

      danke für deinen Kommentar. Es ist tatsächlich nur ein Typo, der Buchstabe fehlt also nicht absichtlich.

      Man sollte natürlich immer Funktionsnamen verwenden, die nicht zu Konflikten führen. In der Regel verwende ich einen projektbezogenen Präfix, also etwas in der Art projektname_beschreibender_name_der_funktion() oder aber direkt einen objektorientierten Ansatz inkl. Namespaces.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.