Diferencia entre do_action y add_action

28 oct 2013, 12:35:05
Vistas: 58.8K
Votos: 27

Esta pregunta podría estar mal planteada, no estoy seguro al respecto. Ya que no lo tengo del todo claro.

Sé que add_action se usa para conectar nuestra función a la función especificada. Por ejemplo add_action('wp_head','myfunc'); ahora cualquier código en myfunc se ejecutará en wp_head(). Esto está claro pero tengo dudas sobre do_action ¿qué hace?

Creo que se usa para crear nuestros propios hooks como los hooks ya disponibles (wp_head, wp_footer, etc.) Si estoy en lo correcto, ¿alguien puede mostrarme una respuesta simple y comprensible con un ejemplo sencillo?

He buscado la diferencia en internet pero todos apuntan a la diferencia entre add_action y add_filter. No quiero ir allí porque primero quiero aclarar esto y luego seguiré con lo otro.

¿Alguien puede ayudarme?

EDICIÓN después de publicar la pregunta

function custom_register()
{
    echo '<script>jQuery(document).ready(function(){alert("Aprendiendo Hooks");});</script>';

}
do_action('custom');

add_action('custom','custom_register');

Probé esto en un plugin pero no obtuve el mensaje de alerta.

Pero cuando conecto la misma función con wp_head entonces funciona bien

/******************funcionando****************/
add_action('wp_head','custom_register');
4
Comentarios

¿Qué sucede cuando llamas a do_action('custom'); después de registrar el callback? Y asegúrate de que jQuery esté cargado.

fuxia fuxia
28 oct 2013 13:07:32

No recibí el mensaje de alerta ni en el backend ni en el frontend

sun sun
28 oct 2013 13:12:08

jQuery está cargado. Cuando engancho la misma función con wp_head funciona bien, pero no con custom

sun sun
28 oct 2013 13:28:03

Sun, creo que tu pregunta original fue respondida por toscho y deberías marcarla como resuelta. Las ediciones #3 y #4 que has realizado corresponden a una nueva pregunta.

brasofilo brasofilo
30 oct 2013 15:32:09
Todas las respuestas a la pregunta 4
3
21

Usa do_action( 'nombre_unico' ) para crear tus propias acciones.

Puedes usarlo para ofrecer una API para tu plugin, de modo que otros plugins puedan registrar callbacks para tu acción personalizada. Ejemplo: ¿Necesito llamar a do_action en mi plugin?

Pero también puedes usar acciones personalizadas (o filtros) en un tema. Ejemplo: Mejor práctica para implementar secciones personalizadas en un tema de WordPress

Y puedes combinar ambos para hacer que un plugin y un tema trabajen juntos. Ejemplo: ¿Cómo hacer que un método de un plugin esté disponible en el tema?

Resumen: add_action( 'foo' ) registra un callback, do_action( 'foo' ) ejecuta ese callback registrado.

28 oct 2013 12:42:43
Comentarios

Gracias por la ayuda, esto es principalmente para propósitos de API. Intenté un ejemplo pero no funcionó. ¿Puedes encontrar algún problema allí? Revisa mi EDIT @toscho

sun sun
28 oct 2013 13:07:58

¿Podemos decir que este es otro caso como herencia? En lugar de extender y sobrescribir la clase, estamos yendo por este camino. ¿Es esto correcto?

sun sun
28 oct 2013 14:11:38

@sun Hm, sí, pero puedes combinar ambos enfoques, no son mutuamente excluyentes.

fuxia fuxia
28 oct 2013 14:19:46
0

Esta es mi suposición, así que si sabes algo mejor, por favor haz un comentario para que pueda actualizar mi conjetura.

El código de tu plugin se ejecuta antes de wp_head() (que podemos asumir que invocará las acciones añadidas a él). Cuando haces add_action('wp_head','custom_register'), le estás diciendo a PHP que cuando (en el futuro) se llame a do_action('wp_head'), también llame a custom_register(). Lo mismo ocurre con tu llamada a add_action('custom','custom_register'), pero como ves en tu código, la llamada a do_action('custom') ya se ha realizado, y cuando se llamó, no había (todavía) ninguna acción añadida a ella.

Por eso Toscho preguntó qué pasa cuando llamas a do_action('custom') después de haber registrado el callback. Tu respuesta sobre el back end y el front end es ambigua. Si intercambias las dos últimas líneas en el siguiente código, creo que funcionará:

function custom_register()
{
    echo '<script>jQuery(document).ready(function(){alert("Aprendiendo Hooks");});</script>';

}
do_action('custom');                    // Esto se llama antes de que tenga efecto.

add_action('custom','custom_register'); // Demasiado tarde - do_action ya fue llamado.
14 feb 2016 21:23:47
1

do_action: Registra un gancho de acción (action hook) mientras que add_action: agrega una función de callback al gancho registrado.

Ejemplo

Imagina que quieres imprimir algo antes de la barra lateral en tu plantilla.

  1. Agregarás un gancho de acción en tu archivo de plantilla index.php mediante <?php add_action('bp_sidebar_left'); ?>.
  2. Ahora en tu archivo functions.php puedes agregar una función de callback a ese gancho para imprimir lo que desees.
add_action('bp_sidebar_left', 'bp_sidebar_left_cb');
function bp_sidebar_left_cb() {
    echo '¡Hola Mundo!';
}
19 abr 2018 09:10:05
Comentarios

¿Qué significa 'registrar un hook'? ¿Dónde se está registrando?

Cornelius Cornelius
25 ene 2021 07:08:17
1
-1

Debes usar de la siguiente manera:

function custom_register()
{
    echo '<script>jQuery(document).ready(function(){alert("Aprendiendo Hooks");});</script>';

}
.

add_action('custom','custom_register'); // Demasiado tarde - do_action ya fue llamado
do_action('custom');                    // Esto se llama antes de que tenga efecto
1 feb 2017 18:15:51
Comentarios

Funciona para mí

user112289 user112289
1 feb 2017 18:16:37