add_action (), add_filter () antes o después de la función

18

Al mirar a través de fragmentos / tutoriales / complementos de WordPress, a menudo veo add_action()y add_filter()se coloca antes de que se declare la función:

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;
}

Desde un punto de vista lógico, esto simplemente no tiene sentido para mí. ¿Por qué colocarías la función después de que se llama en tu código? Por lo general, así es como manejaría la misma situación:

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' );

Sé que ambos escenarios funcionan, pero ¿hay alguna ventaja específica para uno u otro? Alrededor del 90% de las veces veo que se usa el primer escenario, por lo que eso me lleva a creer que hay algún beneficio para esto de alguna manera.

voodooGQ
fuente

Respuestas:

13

Es más fácil de leer: ¿ Cuándo se llama lo que se llama? Si está depurando un enlace, puede ver inmediatamente si tiene que leer la función o no: si no es su enlace, puede omitir el código.

En mis temas y complementos, combino todos los registros de acciones, filtros y códigos cortos en la parte superior y agrego el gancho al bloque PHPDoc:

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

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}
fuxia
fuente
2
Aunque no estoy de acuerdo (solo por mi preferencia personal y prácticas de codificación anteriores) de que es más fácil de leer, tiene sentido el por qué se hace de esta manera.
voodooGQ
6

En realidad, no hay una diferencia real, por ejemplo, prefiero seguir el primer escenario, porque es más conveniente hacer llamadas en un solo lugar y definir funciones debajo de eso. PHP analiza todo el documento antes de ejecutar cualquier cosa, y si las funciones están definidas correctamente, todo funcionará normalmente, sin ventaja en ninguno de los escenarios.

Creo que el dicho correcto aquí es: Lo que sea que haga flotar tu bote :)

OriginalEXE
fuente
No funciona porque PHP analiza el documento completo, sino porque call_user_func_array()(probablemente) se llama después de la definición de su función cuando se ejecuta do_action. Por lo tanto, puede definir la función enganchada en cualquier lugar hasta ese punto.
kovshenin
1

4 años después, pero estoy seguro de que ayudará a las personas a llegar desde la búsqueda.

Como han dicho otros, no hay diferencia ya que php analiza el documento completo y se ejecuta en el orden correcto. Entonces, lo que quieras.

Personalmente me gusta el primer estilo:

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

Tiendo a pensar al revés. Orientado a objetivos si quieres. Así que me gusta leer, "estamos haciendo la barra de funciones, en el gancho. Muy bien, ahora, ¿qué hace la función?"

Establece mejor el contexto para la función. Por supuesto, esto es solo mi preferencia personal. Entonces haz lo que quieras.

John_911
fuente