Verwenden Sie wp init hook, um andere Hooks aufzurufen?
2 Antworten
- Stimmen
-
- 2012-10-09
Im Allgemeinen: Ja,warten Sie,bisein dedizierter Hook Ihreneigenen Code startet. Niemals einfacheine Objektinstanzin denglobalen Namespace werfen.
init
istjedoch seltenerforderlich.Siemelden sich so spät wiemöglich an. Wenn Ihrerster Code auf
wp_head
ausgeführt wird,verwenden Sie keinenfrüheren Hook. Sie können sogar Kaskadenhaken :add_action ('wp_head','first_callback'); Funktionfirst_callback () { //etwastun //dann add_action ('wp_footer','second_callback'); }}
Bezüglich des Hooks
init
: Verwenden Sie stattdessenwp_loaded
. Dies wird ausgeführt,nachdeminit
undms_site_check ()
aufgerufen wurde. Auf diese Weise vermeiden Sie,dass Ihr Pluginin einer Installationmit mehreren Standorten aufeiner ungültigen Unterwebsite ausgeführt wird. Alles andereist dasgleiche.In general: Yes, wait for a dedicated hook to start your own code. Never just throw an object instance into the global namespace. But
init
is rarely necessary.You hook in as late as possible. If your first code runs on
wp_head
do not use an earlier hook. You can even cascade hooks:add_action( 'wp_head', 'first_callback' ); function first_callback() { // do something // then add_action( 'wp_footer', 'second_callback' ); }
Regarding the
init
hook: Usewp_loaded
instead. That runs afterinit
and afterms_site_check()
was called. This way you avoid to run your plugin on an invalid sub site in a multi-site installation. Everything else is the same.-
+1für `wp_loaded` und MS Info.+1 for `wp_loaded` and MS info.
- 3
- 2012-10-09
- kaiser
-
Vielen Dankfür Ihre Antwort,immernochein Zweifel,welchesistbesser,alle anderen Hooksin wp_loaded zu laden oder sie separat zu laden?Ichfragemich,obich Hooksin wp_loaded hinzufüge,diefrüher verknüpft werden,anstattnach admin_init oder admin_menu verknüpft zu werden.thanks a lot for your response, still a doubt, which is better load all other hooks inside wp_loaded or load them separately ? i wonder if i add hooks in wp_loaded they will be hooked earlier instead of getting hooked after admin_init or admin_menu ?
- 0
- 2012-10-09
- atinder
-
Kaskadenhaken sind kein Problem?cascading hooks isn't an issue ?
- 0
- 2012-10-09
- atinder
-
Nein,warum solltees sein?Rufen Sie den zweiten Hakennur auf,wenn dererstenützlich war.No, why should it be? Call the second hook only if the first was useful.
- 0
- 2012-10-09
- fuxia
-
- 2012-10-10
Ich sehe die großen Vorteile dieser Praxis ausfolgenden Gründennicht:
Ihre Rückruffunktionen werdenbei der Registrierung
nicht aufgerufenDie Funktionen
add_action
undadd_filter
fügennureinen Eintrag zurglobalen Variablen$wp_filter
hinzu,der alle Filter und Aktionenenthält. Siehe Quelle . Es ruft Ihre Funktionnicht auf. Ihr Code wird nur ausgeführt,wenn diedo_action
undapply_filters
aufgerufen werden (mit dementsprechenden Hook-Namen),was sehr spät an der Stelle,an der sich diese Hakenbefinden sollten.Sie könnten sagen,dass dadurch dieglobale Variable
$wp_filter
größer wird=>mehr Speicherbenötigt wird. Aberich denke,das Erstelleneinerneuen Funktion hat dasgleiche Problem.Organisationscode
Wenn Sie allesin die Funktion one einfügen,müssen Sie sich alle Hooksin allen Dateienin Ihrem Theme/Pluginmerken. Sie würden soetwasnichttun:
- in
header.php
: Fügen Sie Hooks und Rückruffunktionenfür Dinge hinzu,dieim Headerpassieren (wie Menü,Registrierungsskript) - in
content.php
: Fügen Sie Hooks und Rückruffunktionen zum Filtern von Inhalten hinzu -
admin-menu.php
: Fügen Sie Hooks und Rückruffunktionen hinzu,um das Admin-Menü hinzuzufügen
(Angenommen,diese Dateienbefinden sichin Ihrem Theme/Plugin)
Stattdessenmüssen Sie:
- Fügen Sienur Rückruffunktionenin
header.php
,content.php
,admin-menu.php
ein
- und setzen Sie alle Hooksin einer separaten Funktionin eine andere Datei
=> Dadurchistes schwierig zu wissen,waspassiert,wenn Sie sich den Inhalt der Datei
header.php
ansehen. Siemüssen suchen,um zu wissen,wann diese Rückrufe ausgelöst werden.Und denken Sie an die Situation,wenn Ihr Thema/Pluginmehrere Klassenenthält. Platzieren Sie alle Haken aller Klassen aneinem Ort? Oder hatjede Klasseeine Wrapper-Funktion,die alle Hooksenthält? Esist zu redundant!
Über diesen Grund hinaus denkeich,dassesein persönlicher Stilist :). Ich seheeinige Frameworks wie Hybrid,die dastun,was Siegesagt haben. Manchmalfälltesmir schwer,in diesen Frameworks zugraben!
I don't see the big benefits of this practice, for these reasons:
Your callback functions aren't called when registering
The
add_action
andadd_filter
functions only add an entry to global variable$wp_filter
which holds all filters and actions. See source. It doesn't call your function. Your code will run only when thedo_action
andapply_filters
are called (with appropriate hook name), which happens very late in the place where those hooks should be.You might say that doing so will make the global variable
$wp_filter
getting bigger => more memory required. But I think creating a new function has the same problem.Organizing code
Putting everything in one function force you to remember all hooks in every files in your theme/plugin. You wouldn't do something like this:
- in
header.php
: add hooks and callback functions for things happen in header (like menu, registering script) - in
content.php
: add hooks and callback functions for filtering content admin-menu.php
: add hooks and callback functions to add admin menu
(assume that those files are put in your theme/plugin)
Instead of that, you have to:
- put only callback functions in
header.php
,content.php
,admin-menu.php
- and put all hooks in a separated function in another file
=> That will make you hard to know what happens when you look at the content of
header.php
file. You have to search to know when these callbacks are fired.And think about situation when you have multiple classes in your theme/plugin. Do you put all hooks of all classes in one place? Or does each class has a wrapper function that holds all hooks? It's too redundant!
Above these reason, I think it's personal style :). I see some frameworks like Hybrid does what you said. Sometimes it makes me hard to digg in those frameworks!
Ichmöchte wissen,obes sich umeine bewährte Methodegemäß dem WordPress-Thema oder der Plugin-Entwicklung handelt.
danke