Unterschied zwischen Filter- und Aktionshaken?

51

Ich habe mir die Plugin-API in letzter Zeit etwas genauer angesehen und mich gefragt, welche wirklichen Unterschiede zwischen Action- und Filter-Hooks bestehen . Sie sind beide Ereignisse, die Daten als Parameter empfangen, und sie scheinen beide in der Lage zu sein, die gleichen Dinge zu tun.

Offensichtlich sehe ich, dass Aktionen aufgerufen werden, wenn Aktionen stattfinden, und Filter aufgerufen werden, wenn Daten manipuliert werden, aber es scheint nur ein semantischer Namensunterschied zu sein.

Welche wirklichen Unterschiede gibt es zwischen ihnen, abgesehen von der Semantik und wofür sie verwendet werden?

Sruly
quelle

Antworten:

58

Hi @Sruly :

Sie haben so ziemlich Ihre eigene Frage beantwortet, aber ich werde etwas näher darauf eingehen.

Aktionshaken

Aktionen Hooks sind für den Fall gedacht, dass WordPress Core oder ein Plugin oder Theme Ihnen die Möglichkeit gibt, Ihren Code an einer bestimmten Stelle einzufügen und eine oder mehrere der folgenden Aktionen auszuführen:

  1. Verwenden Sie echodiese Option , um HTML- Inhalt oder anderen Inhalt in den Antwortpuffer einzufügen.
  2. Ändern Sie den globalen Variablenstatus für eine oder mehrere Variablen und / oder
  3. Ändern Sie die Parameter an Ihre Hook - Funktion übergeben (der Haken unter der Annahme wurde durch genannt do_action_ref_array()statt , do_action()da diese nicht unterstützt Variablen vorbei durch Verweis .)

Filterhaken

Filter-Hooks verhalten sich sehr ähnlich wie Aktions-Hooks , sollen jedoch einen Wert empfangen und möglicherweise eine geänderte Version des Werts zurückgeben. Ein Filter-Hook kann auch genau wie ein Action-Hook verwendet werden, um z. B. eine globale Variable zu ändern oder HTML-Code zu generieren, vorausgesetzt, Sie müssen dies tun, wenn der Hook aufgerufen wird. Bei Filter-Hooks ist es sehr wichtig, dass die Person, die einen Filter-Hook verwendet (eine geänderte Version), den ersten Parameter zurückgibt, über den er übergeben wurde. Ein häufiger Anfängerfehler ist, zu vergessen, diesen Wert zurückzugeben!

Verwenden zusätzlicher Parameter zum Bereitstellen von Kontext in Filter-Hooks

Abgesehen davon hatte ich das Gefühl, dass Filter Hooks in früheren Versionen von WordPress gehumpelt wurden, weil sie nur einen Parameter erhielten. dh sie würden einen Wert zum Modifizieren erhalten, aber keinen zweiten oder dritten Parameter, um irgendeinen Kontext bereitzustellen. In letzter Zeit hat das WordPress-Kernteam jedoch freudig (für mich) zusätzliche Parameter zu Filter Hooks hinzugefügt, damit Sie mehr Kontext entdecken können. Ein gutes Beispiel ist der posts_whereHaken; Ich glaube, vor ein paar Versionen hat es nur einen Parameter akzeptiert, der die SQL-Klasse "where" der aktuellen Abfrage ist, aber jetzt akzeptiert es sowohl die where-Klausel als auch einen Verweis auf die aktuelle Instanz der WP_QueryKlasse, die den Hook aufruft.

Also, was ist der wahre Unterschied?

In Wirklichkeit sind Filter Hooks so ziemlich eine Obermenge von Action Hooks. Ersteres kann alles, was Letzteres kann, und ein bisschen mehr, obwohl der Entwickler nicht dafür verantwortlich ist, einen Wert mit dem Aktions-Hook zurückzugeben, den er oder sie mit dem Filter-Hook tut.

Anleitung und Telegraphenabsicht

Aber das ist wahrscheinlich nicht wichtig. Ich denke, was wichtig ist, ist, dass ein Entwickler, der sich für die Verwendung eines Aktions-Hooks im Vergleich zu einem Filter-Hook oder umgekehrt entscheidet, seine Absicht telegraphiert und damit dem Entwickler des Themes oder Plugins, der den Hook möglicherweise verwendet , eine Anleitung gibt . Im Wesentlichen sagen sie entweder "Ich rufe Sie an, tue, was auch immer Sie tun müssen" ODER "Ich werde Ihnen diesen Wert zur Änderung übergeben, aber stellen Sie sicher, dass Sie ihn zurückgeben ."

Letztendlich denke ich, dass die Orientierung bei der Auswahl des Hakentyps der wahre Wert hinter der Unterscheidung ist . IMO jedenfalls.

Hoffe das hilft!

MikeSchinkel
quelle
Für mich scheint es, als hätten Sie Filter für alles verwenden können, da die Rückgabe einer Variablen in PHP optional ist. Weiß jemand, warum WordPress-Entwickler zwei getrennte Begriffe gewählt haben? Ist es nur aus semantischen Gründen? Technisch kann ich die Notwendigkeit dafür nicht erkennen ...
TheStoryCoder
2
@TheStoryCoder "Ist es nur aus semantischen Gründen?" Es scheint genau das zu sein, was meine Antwort vor fünf (5) Jahren erklärt hat ...?
MikeSchinkel,
11

Wenn Sie sich die Quelle für die add_action()Kernfunktion ansehen , handelt es sich nur um einen Wrapper für die add_filter()Funktion ...

Und wenn Sie sich die do_action()Kernfunktion ansehen , ist sie der Kernfunktion sehr ähnlich apply_filters(), mit einem entscheidenden Unterschied: Sie gibt keinen Wert zurück.

Also, was bedeutet das? Aktionen ähneln Filtern, mit der Ausnahme, dass eine Aktion keinen Wert zurückgibt und Sie daher keine Daten ändern können. Es zeigt, dass es einfach war, den Aktionsmechanismus von WordPress zu erstellen, indem einfach der Filtermechanismus kopiert und kein Wert zurückgegeben wurde. Grundsätzlich können Sie mit einer Aktion nur eine Funktion ausführen, ohne einen Wert zu ändern.

trusktr
quelle
5

In einfachen Worten.

Aktionen sind die PHP-Funktionen, die die Ausgabe ausführen.

Filter sind die PHP-Funktionen, die die Ausgabe zurückgeben.

Aktualisiert: Wir können jedes Plugin erweitern, das die Aktionen und Filter verwendet, ohne den dortigen Code zu ändern. Durch Hinzufügen von Filtern und Aktionen in unserem eigenen Theme oder Plugin.


Wie benutzt man?

Aktion:

Überprüfen Sie die folgenden einfachen Beispiele in Ihrer functions.phpDesigndatei.

  1. Beispiel Eins: (Einfaches PHP-Beispiel)
Funktionstest() {
     Echo "Output";
}

Prüfung();

Über dem Programm drucken Sie die Ausgabe:

Ausgabe

[HINWEIS: test () ruft hier einfach die Funktion auf. Und führen Sie die Rückruffunktion 'test' aus.]


  1. Beispiel 2: (Einfache Verwendung von Action)
Funktion test1 () {
     Echo "Output";
}
add_action ('test', 'test1');

do_action ('test');

Über dem Programm drucken Sie die Ausgabe:

Ausgabe

[HINWEIS: Hier do_action('test')funktioniert wie das Aufrufen von Funktion. Und führen Sie die Rückruffunktion 'test1' aus.]


  1. Beispiel drei: (Eine andere Verwendung von Aktionen)
Funktion test2 () {
     Echo "Test 2";
}
add_action ('test', 'test2', 1);

Funktion test1 () {
     Echo "Test 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Über dem Programm drucken Sie die Ausgabe:

Test 2Test 1

[HINWEIS: Hier do_action('test')funktioniert wie das Aufrufen von Funktion. Und Callback-Funktionen auf seine Prioritäten ausführen.

Rückruffunktion 'test1' hat Priorität 2 und 'test2' hat Priorität 1.]

Wenn sich die Prioritäten wie 'test1' mit Priorität 1 und 'test2' mit Priorität 2 ändern, wird Folgendes ausgegeben:

Test 1 Test 2

  1. Beispiel 4: (Unterstützung von Drittanbietern) Fügen Sie den folgenden Code in einfunctions.php
Funktion test1 () {
     do_action ('test_before');
     Echo "Test 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Über dem Programm drucken Sie die Ausgabe:

Test 1

Erstellen Sie nun ein Beispiel-Plugin, um zu überprüfen, wie es für Entwickler von Drittanbietern funktioniert.

  1. Erstellen Sie den Ordner 'simple' im /wp-content/plugins/Verzeichnis.
  2. Erstellen Sie eine Datei mit dem Namen 'simple.php' und fügen Sie den folgenden Code hinzu.
/ *
* Plugin Name: Einfaches Plugin
* /
Funktion test_callback_function () {
     echo "Vom Plugin";
}
add_action ('test', 'test_callback_function');

Aktivieren Sie jetzt unser einfaches Plugin im WordPress-Admin-Dashboard.

Gehe zum Menü Plugin und aktiviere es.

Nach dem Aktivieren des Plugins über dem Programm wird die Ausgabe gedruckt:

Test 1Vom Plugin

[HINWEIS: Wenn wir die Priorität für unsere Plugin-Aktion von 1 bis 9 hinzufügen, wird die Ausgabe wie folgt gedruckt:

Aus pluginTest 1

Weil WordPress die 10 priority by defaultfür alle hinzugefügten Aktionen berücksichtigt .]

Filter

Überprüfen Sie die folgenden Beispiele:

Einfaches PHP-Beispiel:

$ data = array ('eins', 'zwei');
print_r ($ data);

Über dem Programm drucken Sie die Ausgabe:

Array ([0] => eins [1] => zwei)
  1. Beispiel eins: (Einfache Verwendung von Filter)
$ data = apply_filters ('mein_filtername', Array ('eins', 'zwei'));
print_r ($ data);

add_filter ('my_filter_name', function ($ old_data) {
     Rückgabearray ('drei', 'vier');
});

Über dem Programm drucken Sie die Ausgabe:

Array ([0] => drei [1] => vier)

Hier haben wir Filter hinzugefügt my_filter_nameund die vorhandene Ausgabe array( 'one', 'two' )mit geändert, array( 'three', 'four' )ohne die Theme / Plugin-Dateien zu ändern.


maheshwaghmare
quelle
Danke @maheshwaghmare für diesen einfachen Trick. Bitte schreiben Sie auch über "Filter"
Adi
Was genau meinst du mit "bald"?
Rapti
@ Rapti Entschuldigung für die Verzögerung. Heute Abend werde ich die Antwort zu den Filtern hinzufügen. In Zukunft werde ich einen beschreibenden Artikel zu Hooks (Actions & Filters) erstellen.
Maheshwaghmare
@ Maheshwaghmare zögern viel? : P
Gute Erklärung, ich habe jetzt ein besseres Verständnis
budiantoip