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.
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:
init
, after_theme_setup
, wp_head
und admin_init
sollten den größten Teil davon abdeckenadd_action
-Aufrufefunctions.php
oder einem Plugin aus, oder verwenden diese Dateien include
- oder require
-Anweisungen für einen Includes-OrdnerEs 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:
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.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');
}