it-swarm.com.de

do_action und hook Methoden

Ich versuche zu verstehen, wie Hook-Methoden in WordPress funktionieren. Ich verstehe, dass beim Aufruf von do_action WP nach allen registrierten Listenern sucht und diese entsprechend der festgelegten Priorität aufruft.

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

Bitte erläutern Sie dies.

2
Ptzhub

Ihre Analogie hier ist teilweise richtig, aber unvollständig:

Ich verstehe, dass wp beim Aufruf von do_action nach allen registrierten Listenern sucht und diese entsprechend der festgelegten Priorität aufruft.

Sie müssen überlegen, was passiert, wenn Sie add_action aufrufen. WordPress sucht niemals nach den add_action-Anweisungen, es hat diese in einer Liste. Wenn Sie add_action aufrufen, wird eine Liste der Rückrufe aktualisiert, die bei dieser Aktion aufgerufen werden sollen.

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

  • do_action( 'init' ) Die Aktion 'init' auslösen
  • add_action('init', 'myfunction' ) Wenn das Ereignis init eintritt, rufen Sie myfunction auf
  • function myfunction() {} Ah das Ereignis init ist passiert

Die Ereignisanalogie hilft enorm, wenn Sie verstehen, wie Aktionen und Filter funktionieren, da es eine ganze Reihe von Problemen gibt, die auftreten, wenn Sie das Timing nicht verstehen.

Nehmen wir als Beispiel den Aufruf von add_action in der Fußzeile für die Aktion wp_head. wp_head wird ausgelöst, wenn wp_head() aufgerufen wird. Dies sollte in der Kopfzeile zwischen den <header> -Tags geschehen. Wenn wir versuchen, eine Aktion in die Fußzeile einzufügen, wird sie hinzugefügt und beim nächsten Aufruf von wp_head() ausgelöst. Aber wp_head wurde bereits aufgerufen, es ist zu spät. Es ist, als würde man ein Kind bitten, "Vergiss nicht, deine Tasche vor der Party zu packen", kurz nachdem die Party beendet ist.

Vor diesem Hintergrund habe ich einige allgemeine Regeln und Empfehlungen, die als Heuristik für besser wartbaren Code dienen:

  • Setzen Sie den gesamten Code in Funktionen, die Ereignisse auslösen. init, after_theme_setup, wp_head und admin_init sollten den größten Teil davon abdecken
  • Der einzige Code außerhalb eines Hooks oder Filters wären Vorlagendateien und die ersten add_action-Aufrufe
  • Fügen Sie keine Filter und Hooks in Vorlagen ein, führen Sie diese nicht in functions.php oder einem Plugin aus, oder verwenden diese Dateien include- oder require-Anweisungen für einen Includes-Ordner

Es gibt einige Situationen, in denen Sie diese Regeln brechen möchten, normalerweise, um eine Rekursion beim Speichern von Dingen usw. 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 ausgelöst werden und was zu diesen Zeitpunkten sicher ist

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

  • Aktionen machen Dinge
  • Filter verändern Dinge
  • Aktionen müssen nichts zurückgeben
  • Filter werden übergeben, was als erstes Argument "gefiltert" wird, und geben es immer oder eine geänderte Version zurück
  • Filter werden häufig aufgerufen, daher sollten Sie in Filtern niemals schwere Arbeit verrichten. Sie verlangsamen die Arbeit erheblich. Sie können nur Änderungen vornehmen
  • Seien Sie vorsichtig, wenn Sie sich in die Übersetzungs- und Escape-Filter einklinken, da dies gefährlich sein kann und einen erheblichen Einfluss auf die Leistung hat, da dies die am häufigsten als Filter bezeichneten Filter sind
  • Es gibt eine besonders gefährliche Aktion/Filter namens all, die für jeden Filter und Hook ausgelöst wird. Nützlich manchmal für das Debuggen, aber ich würde empfehlen, stattdessen ein Plugin wie Query Monitor zu verwenden.
5
Tom J Nowell

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

Nachdem functions.php WP gelesen wurde, enthält es eine Liste der Aktionen, die an bestimmten Stellen in Ihren Themenvorlagen ausgeführt werden sollen. Es gibt mehrere vordefinierte Aktions-Hooks wie wp_head() und wp_footer(), die für do_action('wp_head') und do_action('wp_footer') stehen. Sie sind definiert, sodass Plug-ins Standardorte haben, an denen sie ihre Aktion hinzufügen können. Sie können auch Ihre eigenen Aktions-Hooks mit do_action definieren.

Wenn Sie beispielsweise am Ende jedes Posts dasselbe Bild hinzufügen möchten, definieren Sie in Ihrem functions.php die folgende Aktion:

add_action ('my_post_image', 'generate_my_post_image');
function generate_my_post_image () {
    echo '<img src="path_to_my_image">';
    }

Dann hätten Sie in Ihrem index.php:

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