do_action und hook Methoden

Ich versuche zu verstehen, wie Hook-Methoden in WordPress funktionieren. Ich verstehe, dass, wenn do_action aufgerufen wird, WP nach allen registrierten Listenern sucht und diese entsprechend der eingestellten Priorität aufruft.

Wie sammelt WordPress Core alle registrierten Hook-Methoden in verschiedenen Dateien? Zum Beispiel habe ich add_action für wp_head in meiner Fußzeile deklariert. Wird es ausgeführt werden? So scheint es, dass WordPress alle Daten sammeln sollte, die über alle Dateien iterieren?

Bitte erläutern Sie dies.

Solutions Collecting From Web of "do_action und hook Methoden"

Deine Analogie hier ist teilweise korrekt, aber unvollständig:

Ich verstehe, dass, wenn do_action aufgerufen wird, wp nach allen registrierten Listenern sucht und diese entsprechend der eingestellten Priorität aufruft.

Sie müssen überlegen, was passiert, wenn Sie add_action . WordPress sucht nie nach den add_action statementen, sondern nach denen in einer Liste. Wenn Sie add_action , wird eine Liste von Callbacks aktualisiert, die beim add_action dieser Aktion aufgerufen werden sollen.

In diesem Sinne ist es sinnvoller, eine Ereignisanalogie zu verwenden.

  • do_action( 'init' ) die Aktion ‘init’ ab
  • add_action('init', 'myfunction' ) Rufen myfunction add_action('init', 'myfunction' ) wenn das init Ereignis myfunction
  • function myfunction() {} Ah das init Ereignis ist function myfunction() {}

Die Analogie der Ereignisse hilft enorm, wenn Sie verstehen, wie Aktionen und Filter funktionieren, denn es gibt eine ganze Reihe von Problemen, die auftreten, wenn Sie Timing nicht verstehen.

Nehmen add_action Beispiel den Aufruf von add_action in der Fußzeile für die Aktion wp_head . wp_head wird wp_head wenn wp_head() aufgerufen wird. wp_head() sollte in der Kopfzeile zwischen den

-Tags geschehen. Wenn wir versuchen, eine Aktion in der Fußzeile hinzuzufügen, wird sie hinzugefügt und beim nächsten wp_head() wird sie wp_head() . Aber wp_head wurde bereits angerufen, es ist zu spät. Es ist, als würde man ein Kind fragen, “denken Sie daran, Ihre Tasche vor der Party zu packen”, kurz nachdem die Party beendet ist.

In diesem Sinne habe ich einige allgemeine Regeln und Empfehlungen, die als Heuristik für mehr wartbaren Code dienen:

  • Setzen Sie den gesamten Code in functionen, die auf Ereignisse ausgetriggers werden. init , after_theme_setup , wp_head und admin_init sollten das meiste davon abdecken
  • Der einzige Code außerhalb eines add_action oder Filters wären Schablonendateien und die ersten add_action Aufrufe
  • Fügen Sie keine Filter und Hooks in Templates hinzu, führen Sie sie in functions.php oder einem Plugin aus, oder wenn diese Dateien statementen für einen includes-Ordner include oder require

Es gibt Situationen, in denen Sie diese Regeln brechen müssen, normalerweise um Rekursionen beim Speichern von Dingen zu verhindern, aber dies sollten seltene Ausnahmen sein. Experimentieren Sie und sehen Sie, was funktioniert, und schauen Sie sich diesen Beitrag an, der zeigt, welche Aktionen wann ausgetriggers werden und was zu diesem Zeitpunkt sicher ist

Eine letzte Anmerkung, Aktionen und Filter sind dasselbe. Intern werden sie gleich behandelt, aber es gibt einige wichtige Unterschiede, wenn Sie möchten, dass die Dinge gut funktionieren:

  • Aktionen machen Dinge
  • Filter modifizieren Dinge
  • Aktionen müssen nichts zurückgeben
  • Filter werden übergeben, was als erstes Argument “gefiltert” wird, und es immer oder eine modifizierte Version zurückgeben
  • Filter werden oft genannt, also sollte man niemals in Filtern arbeiten, es wird die Dinge massiv verlangsamen, nur modifizieren, für die Arbeit tun, was ist
  • Seien Sie vorsichtig, wenn Sie sich in die Filter für Übersetzung und Flüchten einklinken, dies kann gefährlich sein und hat großen Einfluss auf die performance, da dies die am häufigsten genannten Filter sind
  • Es gibt eine besonders gefährliche Aktion / Filter namens all , die für jeden Filter und Hook ausgetriggers wird. Nützlich manchmal zum Debuggen, aber ich würde empfehlen, stattdessen ein Plugin wie Abfrage-Monitor zu verwenden.

Alle Ihre Aktionen gehören in Ihre functions.php , vorausgesetzt, Sie erstellen ein Thema. Hier fügen Sie Aktionen zu bestimmten Ereignissen in Ihren Vorlagen hinzu.

Jetzt, nachdem es functions.php gelesen hat, hat WP eine Liste von Aktionen, die es an bestimmten Punkten in deinen Theme Templates durchführen soll. Es gibt mehrere vordefinierte Aktions-Hooks, z. B. wp_head() und wp_footer() , die Abkürzungen für do_action('wp_head') und do_action('wp_footer') . Sie sind definiert, also haben Plugins Standardplätze, an denen sie ihre Aktionen hinzufügen können. Sie können auch eigene Aktions-Hooks mit do_action .

Wenn Sie zum Beispiel am Ende jedes Posts dasselbe Bild hinzufügen möchten, würden Sie in Ihrer functions.php die folgende Aktion definieren:

 add_action ('my_post_image', 'generate_my_post_image'); function generate_my_post_image () { echo ''; } 

Dann hättest du in deiner index.php :

 while (have_posts()) { ... generate your post ... do_action ('my_post_image'); }