WordPress: add_filter oder add_action? Eigentlich egal!

Eine wichtige Doktrin der WordPress-Entwicklung lautet:

Benutze Aktionen, um die Funktionalität zu erweitern, und Filter, um Daten zu ändern.

Wir haben alle davon gehört und sie wird von uns immer beachtet. Immer? Nun ja, …

… wenn ich an einer bestimmten Stelle eine Funktion hinzufügen möchte und weit und breit kein Action-Hook verfügbar ist, dann nehme ich eben ein Filter-Hook ohne über die Doktrin nachzudenken.

Überraschenderweise funktioniert das auch. Aber warum? Wenn immer so darauf hingewiesen wird, dass man den richtigen Hook benutzen soll, dann muss es doch einen Unterschied zwischen den beiden Arten geben. Schauen wir doch mal hinter die Kulissen (/wp-include/plugin.php):

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

Was? add_action  macht nichts anders als add_filter  aufzurufen und sonst nichts? Es gibt keinen Unterschied in der Funktionalität, es ist einfach nur ein andere Name. Es gibt also keinen Grund, warum man nicht add_filter  statt add_action  benutzen sollte, wenn es keine andere Lösung gibt.

Ich sage nicht, das man wahllos add_action  und add_filter  nehmen soll. Die Benutzung des richtigen Hook-Typs vereinfacht das Lesen und Warten des Quelltextes, für Dich und für andere. Trotzdem, wenn es einfach keine andere Lösung gibt, um ein Problem zu lösen, dann sollte man nicht zögern und einen Filter-Hook statt eines Action-Hooks zu benutzen, denn eigentlich gibt es keinen Unterschied zwischen den beiden.

2 Gedanken zu „WordPress: add_filter oder add_action? Eigentlich egal!“

  1. Hi Latz,
    wie Du auch schreibst würde ich das allerdings tatsächlich nur auf jene Fälle beschränken, in denen kein Actionhook definiert ist und ich mich unbedingt an dieser Stelle einhaken muß.

    Ich habe mir nochmal kurz die Quellcode-Änderungen an der Stelle angesehen, die Funktion ist tatsächlich seit 2.2 ziemlich stabil. Einzig ein return ist in der Zwischenzeit dazu gekommen. Aber, wir wissen natürlich nicht, was in Zukunft kommt. Vielleicht wird die add_action() ja eines Tages nicht mehr einfach nur add_filter() zurück geben.

    Bei der Gelegenheit sei auch angemerkt remove_action() führt tatsächlich auch nur remove_filter() zurück. Filter- und Actionhooks sind beide in der globalen $wp_filters hinterlegt.

    Bin gerade ein wenig erstaunt, verstehe jetzt aber, warum ich „pre_get_posts“ Ewigkeiten für einen Filter halten konnte, wo es doch ein Actionhook ist 😀

    1. Du hast natorlich recht, solange ich ein Problem mit einem Action-Hook lösen kann, sollte ich diesen benutzen, besonders, wie du auch schreibst, um eine Aufwärtskompatibilität zu garantieren, obwohl auch Action-Hooks erinfach verschwinden können (bzw. als depricatged gekennezeichnet werden).

Schreibe einen Kommentar

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