add_action (), add_filter () przed lub po funkcji

18

Przeglądając fragmenty / samouczki / wtyczki WordPress często widzę add_action()i add_filter()umieszczam je przed zadeklarowaniem funkcji:

add_action( 'publish_post', 'email_friends' );

function email_friends( $post_ID ) {
   $friends = '[email protected], [email protected]';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

Z logicznego punktu widzenia nie ma to dla mnie sensu. Dlaczego miałbyś umieszczać funkcję po jej wywołaniu w kodzie? Tak zazwyczaj radziłbym sobie z tą samą sytuacją:

function email_friends( $post_ID )  {
   $friends = '[email protected], [email protected]';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

add_action( 'publish_post', 'email_friends' );

Wiem, że oba scenariusze działają, ale czy jest jakaś konkretna zaleta dla jednego lub drugiego? Około 90% czasu widzę, że pierwszy scenariusz jest używany, więc to prowadzi mnie do przekonania, że ​​jest to w jakiś sposób korzystne.

voodooGQ
źródło

Odpowiedzi:

13

Jest to łatwiejsze do odczytania: Kiedy jest co nazywa? Jeśli debugujesz hak, możesz od razu zobaczyć, czy musisz odczytać funkcję, czy nie: Jeśli nie jest to hak, możesz pominąć kod.

W moich motywach i wtyczkach łączę wszystkie rejestracje działań, filtrów i skrótów u góry i dodam hak do bloku PHPDoc:

add_action( 'wp_head',  'foo' );
add_action( 'shutdown', 'bar' );

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}
fuxia
źródło
2
Chociaż nie zgadzam się (tylko z powodu moich osobistych preferencji i wcześniejszych praktyk kodowania), że łatwiej to odczytać, ma sens, dlaczego tak się dzieje.
voodooGQ
6

Tak naprawdę nie ma żadnej różnicy, na przykład wolę podążać za pierwszym scenariuszem, ponieważ fajniej jest umieszczać wywołania w jednym miejscu i definiować funkcje poniżej. PHP analizuje cały dokument przed uruchomieniem czegokolwiek, a jeśli funkcje są poprawnie zdefiniowane, wszystko będzie działać normalnie, bez żadnej korzyści w żadnym ze scenariuszy.

Uważam, że słuszne powiedzenie brzmi: Cokolwiek płynie łodzią :)

OriginalEXE
źródło
Działa to nie dlatego, że PHP analizuje cały dokument, ale ponieważ call_user_func_array()(najprawdopodobniej) jest wywoływany po definicji funkcji podczas działania do_action. Możesz więc zdefiniować funkcję zaczepioną gdziekolwiek do tego momentu.
kovshenin
1

4 lata później, ale jestem pewien, że to pomoże ludziom dotrzeć tutaj z wyszukiwania.

Jak powiedzieli inni, nie ma różnicy, ponieważ php analizuje cały dokument i wykonuje w prawidłowej kolejności. Więc cokolwiek chcesz.

Osobiście lubię pierwszy styl:

add_action(hook, bar);
function bar(){
    //code here
}

Mam tendencję do myślenia wstecz. Zorientowany na cel, jeśli chcesz. Więc lubię czytać: „Robimy pasek funkcji, na haczyku. Okej, fajnie, co teraz robi funkcja?”

Lepiej konfiguruje kontekst dla funkcji. Oczywiście to tylko moje osobiste preferencje. Rób więc to, co lubisz.

John_911
źródło