Verwenden Sie wp init hook, um andere Hooks aufzurufen?

11

Ich möchte wissen, ob es eine gute Praxis gemäß dem WordPress-Thema oder der Plugin-Entwicklung ist.

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

add_action('admin_init',-----);
add_action('admin_menu',----);

// more like so

}

Vielen Dank

atinder
quelle

Antworten:

16

Im Allgemeinen: Ja, warten Sie, bis ein dedizierter Hook Ihren eigenen Code startet. Werfen Sie niemals einfach eine Objektinstanz in den globalen Namespace. Ist initaber selten nötig.

Sie melden sich so spät wie möglich an. Wenn Ihr erster Code ausgeführt wird, verwenden wp_headSie keinen früheren Hook. Sie können sogar Haken kaskadieren :

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

In Bezug auf den initHaken: Verwenden Sie wp_loadedstattdessen. Das läuft nach initund nach ms_site_check()wurde aufgerufen. Auf diese Weise vermeiden Sie, dass Ihr Plugin in einer Installation mit mehreren Standorten auf einer ungültigen Unterwebsite ausgeführt wird. Alles andere ist das gleiche.

Fuxia
quelle
3
+1 für wp_loadedund MS Info.
Kaiser
Vielen Dank für Ihre Antwort, immer noch ein Zweifel, welches ist besser, alle anderen Hooks in wp_loaded zu laden oder sie separat zu laden? Ich frage mich, ob ich Hooks in wp_loaded hinzufüge, die früher verknüpft werden, anstatt nach admin_init oder admin_menu verknüpft zu werden.
Atinder
Kaskadenhaken sind kein Problem?
Atinder
Nein, warum sollte es sein? Rufen Sie den zweiten Haken nur auf, wenn der erste nützlich war.
Fuxia
3

Ich sehe die großen Vorteile dieser Praxis aus folgenden Gründen nicht:

Ihre Rückruffunktionen werden bei der Registrierung nicht aufgerufen

Die Funktionen add_actionund add_filterfügen der globalen Variablen nur einen Eintrag hinzu, $wp_filterder alle Filter und Aktionen enthält. Siehe Quelle . Es ruft Ihre Funktion nicht auf. Ihr Code wird nur ausgeführt, wenn die do_actionund apply_filtersaufgerufen werden (mit dem entsprechenden Hook-Namen), was sehr spät an der Stelle geschieht, an der sich diese Hooks befinden sollten.

Sie könnten sagen, dass dadurch die globale Variable $wp_filtergrößer wird => mehr Speicher benötigt wird. Aber ich denke, das Erstellen einer neuen Funktion hat das gleiche Problem.

Code organisieren

Wenn Sie alles in eine Funktion einfügen, müssen Sie sich alle Hooks in allen Dateien Ihres Themes / Plugins merken. Sie würden so etwas nicht tun:

  • in header.php: Hooks hinzufügen und Rückruffunktionen für Dinge, die im Header passieren (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 Dateien befinden sich in Ihrem Theme / Plugin.)

Stattdessen müssen Sie:

  • setzen nur Callback - Funktionen in header.php, content.php,admin-menu.php
  • und setzen Sie alle Hooks in einer separaten Funktion in eine andere Datei

=> Dadurch ist es schwierig zu wissen, was passiert, wenn Sie sich den Inhalt der header.phpDatei ansehen . Sie müssen suchen, um zu wissen, wann diese Rückrufe ausgelöst werden.

Und denken Sie an die Situation, wenn Ihr Thema / Plugin mehrere Klassen enthält. Platzieren Sie alle Haken aller Klassen an einem Ort? Oder hat jede Klasse eine Wrapper-Funktion, die alle Hooks enthält? Es ist zu überflüssig!

Über diesen Grund denke ich, dass es persönlicher Stil ist :). Ich sehe einige Frameworks wie Hybrid, die das tun, was Sie gesagt haben. Manchmal fällt es mir schwer, in diesen Frameworks zu graben!

Anh Tran
quelle