Diferencia entre do_action y add_action
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');
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.

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

¿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 Hm, sí, pero puedes combinar ambos enfoques, no son mutuamente excluyentes.

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.

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.
- Agregarás un gancho de acción en tu archivo de plantilla
index.php
mediante<?php add_action('bp_sidebar_left'); ?>
. - 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!';
}

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
