Używać wp init init, aby wywoływać inne hooki?

11

Chcę wiedzieć, czy jest to dobra praktyka zgodnie z motywem WordPress lub opracowaniem wtyczki.

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

}

dzięki

atinder
źródło

Odpowiedzi:

16

Ogólnie: Tak, poczekaj na dedykowany hak, aby uruchomić własny kod. Nigdy nie wrzucaj instancji obiektu do globalnej przestrzeni nazw. Ale initrzadko jest to konieczne.

Dołączasz się tak późno, jak to możliwe. Jeśli pierwszy kod działa wp_head, nie używaj wcześniejszego haka. Możesz nawet kaskadowo haki :

add_action( 'wp_head', 'first_callback' );

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

Odnośnie inithaka: użyj wp_loadedzamiast tego. To działa po initi ms_site_check()został wywołany. W ten sposób unikasz uruchamiania wtyczki na nieprawidłowej podstronie w instalacji obejmującej wiele lokacji. Cała reszta jest taka sama.

fuxia
źródło
3
+1 za wp_loadedi informacje o MS.
kaiser
bardzo dziękuję za odpowiedź, wciąż masz wątpliwości, co lepiej załadować wszystkie inne haki wewnątrz wp_loaded lub załadować je osobno? Zastanawiam się, czy dodam haki do wp_loaded, czy zostaną one zaczepione wcześniej, zamiast zostać zaczepionymi po admin_init lub admin_menu?
atinder
kaskady nie są problemem?
atinder
Nie, dlaczego tak powinno być? Wywołaj drugi haczyk tylko wtedy, gdy pierwszy był przydatny.
fuxia
3

Nie widzę wielkich korzyści z tej praktyki z następujących powodów:

Twoje funkcje oddzwaniania nie są wywoływane podczas rejestracji

Funkcje add_actioni add_filtertylko dodają wpis do zmiennej globalnej, $wp_filterktóra przechowuje wszystkie filtry i akcje. Zobacz źródło . Nie wywołuje twojej funkcji. Twój kod będzie działać tylko wtedy, gdy do_actioni apply_filtersnazywane są (z odpowiednią nazwą haka), co zdarza się bardzo późno w miejscu, gdzie te haki powinny być.

Można powiedzieć, że spowoduje to zwiększenie globalnej zmiennej $wp_filter=> więcej wymaganej pamięci. Ale myślę, że utworzenie nowej funkcji ma ten sam problem.

Kod organizacyjny

Umieszczenie wszystkiego w jednej funkcji zmusza do zapamiętania wszystkich haków w każdym pliku w kompozycji / wtyczce. Nie zrobiłbyś czegoś takiego:

  • in header.php: dodawanie haków i funkcji zwrotnych dla zdarzeń w nagłówku (np. menu, rejestracja skryptu)
  • in content.php: dodaj zaczepy i funkcje zwrotne do filtrowania zawartości
  • admin-menu.php: dodaj zaczepy i funkcje zwrotne, aby dodać menu administratora

(załóż, że te pliki są umieszczone w twoim motywie / wtyczce)

Zamiast tego musisz:

  • umieścić tylko w funkcji callback header.php, content.php,admin-menu.php
  • i umieść wszystkie haki w oddzielnej funkcji w innym pliku

=> To sprawi, że będziesz ciężko wiedzieć, co się stanie, gdy spojrzysz na zawartość header.phppliku. Musisz szukać, aby dowiedzieć się, kiedy te wywołania zwrotne są uruchamiane.

I pomyśl o sytuacji, gdy masz wiele klas w swoim motywie / wtyczce. Czy umieścisz wszystkie haki wszystkich klas w jednym miejscu? Czy może każda klasa ma funkcję otoki, która przechowuje wszystkie haki? To jest zbyteczne!

Powyżej tego powodu myślę, że to osobisty styl :). Widzę niektóre frameworki, takie jak Hybrid, robi to, co powiedziałeś. Czasami trudno mi kopać w tych ramach!

Anh Tran
źródło