it-swarm.com.de

Was ist der Unterschied zwischen Hooks, Filtern und Aktionen?

Die Begriffe Hooks, Filter und Actions werden anscheinend synonym verwendet. Was ist der Unterschied zwischen ihnen? Was machen Sie? Wie benutze ich sie?

1
cjbj

Hooks ist die Sammelbezeichnung für Filter und Aktionen . Beides soll das normale Verhalten von Funktionen verändern. Programmatisch gesehen gibt es keinen großen Unterschied, wie Sie an der Tatsache erkennen können, dass im WP Quellcode das Hinzufügen einer Aktion ist das gleiche wie das Hinzufügen eines Filters.

Der Unterschied liegt in der Nutzung. Sie verwenden eine Aktion, um das Verhalten einer Funktion vollständig zu ändern oder einer vorhandenen Funktion etwas hinzuzufügen. Sie verwenden einen Filter, um das Ergebnis einer Funktion oder einer Variablen zu ändern. Lesen Sie hier ein bisschen mehr über die Theorie .

Beispiel

Angenommen, dies ist Ihre Designvorlagendatei index.php:

$me = 'I love Star Wars';
$you = 'I love Star Trek';
$me = apply_filters ('do_force', $me);
$you = apply_filters ('do_force', $you);
do_action ('echo_me_you', $me, $you);

Dann können Sie im functions.php Ihres Themas oder in der Haupt-PHP-Datei Ihres Plugins Filter und Aktionen definieren. Zum Beispiel:

add_filter ('do_force','wpse_do_force');
function wpse_do_force ($string) {
  str_replace ('Trek','Wars', $string); // change all occurences of 'Trek ' to 'Wars'
  return $string;
  }

Der Filter hat keine Auswirkung auf $me, ändert jedoch $you, da er den String nach 'Trek' durchsucht und in 'Wars' ändert. Nachdem die Filter angewendet wurden, lieben wir beide Star Wars.

Nun geht der Code zur Aktion. Das kann sehr einfach sein:

add_action ('echo_me_you', 'wpse_echo_neutral');
function wpse_echo_neutral ($me, $you) {
  echo $me;
  echo $you;
  }

Aber die Aktion kann so kraftvoll gemacht werden, wie Sie wollen. Sie können zum Beispiel die Filter aufheben, indem Sie alle Vorkommen von "Wars" wieder auf "Trek" setzen:

add_action ('echo_me_you', 'wpse_echo_trek');
function wpse_echo_trek ($me, $you) {
  str_replace ('Wars','Trek', $me);
  str_replace ('Wars','Trek', $you);
  echo $me;
  echo $you;
  }

Wie funktioniert das?

Wenn WordPress mit dem Zusammenstellen einer Seite beginnt, liest es zuerst Ihren functions.php. Dort sammelt es alle Aktionen und Filter, die Sie hinzufügen. Es stellt diese in eine Warteschlange. Wenn es dann einen do_action oder apply_filters findet, nimmt es die entsprechende Warteschlange und führt die Aktionen/Filter nacheinander in der Reihenfolge aus, in der es sie gefunden hat.

Im obigen Beispiel ist also eine Funktion definiert, die für den Filter do_force ausgelöst wird, und es sind zwei Funktionen definiert, die für die Aktion echo_me_you ausgelöst werden. Zuerst wendet es den Filter auf $me an, dann wendet es den Filter auf $you an, dann führt es die Funktion wpse_echo_neutral und schließlich wpse_echo_trek aus.

Prioritäten

Nachdem Ihr (untergeordnetes) Thema geladen wurde, werden auch die Plugins (und das übergeordnete Thema) geladen. Sie fügen auch Aktionen und Filter hinzu. Der Filter, den Sie für the_title geschrieben haben, scheint möglicherweise nicht zu funktionieren, da der Filter von einem anderen Filter in einem Plugin außer Kraft gesetzt wird. Hier bieten sich Prioritäten an.

Mit Prioritäten können Sie den Ort Ihres Filters/Ihrer Aktion in der Warteschlange bestimmen. Also, wenn Sie dies definieren:

add_filter ('the_title', 'wpse_the_title', 999, 2);

Die Priorität 999 sollte sicherstellen, dass dieser Filter als letzter in der Warteschlange ausgeführt wird (die Zahl 2 gibt die Anzahl der an den Filter/die Aktion übergebenen Parameter an).

Es funktioniert nicht!

Ja, das passiert, oder so scheint es. Wie Sie aus dem obigen Beispiel ersehen können, können Sie mit einer Aktion, die einen Filter außer Kraft setzt, alles mit Ihrem Filter machen, ohne dass dies Auswirkungen hat. Ihr Setup von Child/Parent und Plugins kann so komplex sein, dass Sie das Debuggen sorgfältig durchführen müssen.

Der erste Schritt ist das Einfügen von echo 'GOT HERE' als erste Zeile Ihrer Funktion. Hier erfahren Sie, ob Ihr Filter/Ihre Aktion überhaupt aufgerufen wurde. Wenn es nicht so ist, hakt ihr zu spät. Sehen Sie sich diesen Code an, der in Ihrem functions.php enthalten sein könnte:

add_action ('wp_footer','wpse_footer');
function wpse_footer() {
  add_action ('wp_head', 'wpse_head');
  }
function wpse_head() {
  echo 'GOT HERE';
  }

Dies funktioniert nicht, da do_action (wp_head) bereits von WP ausgeführt wird, wenn es auf do_action (wp_footer) stößt. Wenn Sie also zu diesem Zeitpunkt eine Aktion zur Warteschlange wp_head hinzufügen, hat dies keine Auswirkung. Überprüfen Sie immer die Hook-Reihenfolge , wenn Sie Aktionen zu nativen WordPress-Hooks hinzufügen. Ein häufiger Fehler ist der Versuch, Skript-/Stildateien aus einem Widget in die Warteschlange zu stellen. Wie Sie der Hook-Reihenfolge entnehmen können, wird dynamic_sidebar, in dem die Widgets in die WordPress-Seite eingebunden sind, weit nach wp_enqueue_scripts ausgeführt.

Es gibt andere Gründe, warum ein Filter/eine Aktion möglicherweise überhaupt nicht ausgeführt wird. Zum Beispiel, weil WP unter bestimmten Umständen einen Filter überspringt. Hier haben Sie keine andere Wahl, als in den Quellcode einzutauchen (oder hier bei WPSE nachzufragen).

Wenn Sie sicher sind, dass der Filter aufgerufen wird, müssen Sie im zweiten Schritt eine sehr hohe Priorität festlegen, um sicherzustellen, dass er nicht übersteuert wird. Deaktivieren Sie außerdem alle Plugins, um Interferenzen auszuschließen.

Dritter Schritt : Wenn Ihre Funktion aufgerufen wird und Interferenzen ausgeschlossen sind, dies aber immer noch nicht funktioniert, hat dies wahrscheinlich etwas mit Ihren eigenen Codierungsfähigkeiten zu tun. Suchen Sie nach Tippfehlern, Echo-Zwischenergebnissen usw., um festzustellen, wo Sie einen Fehler gemacht haben.

Zusammenfassung

Das Hooks-System ist ein mächtiges, aber manchmal verwirrendes System, um das Verhalten von WordPress selbst oder von Plugins/Themes zu ändern. Da alle gängigen Hooks verwenden, können die Ergebnisse unerwartet sein. Die meisten Probleme können jedoch durch sorgfältiges Betrachten der Hook-Reihenfolge und der Prioritäten behoben werden.

3
cjbj