php - plugin_api - ¿Cómo funcionan las acciones do_action y add_action?
lista de hooks wordpress (3)
En realidad, add_action
es un gancho de acción que se usa para invocar una acción (un controlador registrado) en un cierto punto dependiendo de la acción y do_action
se usa para invocar manualmente esa acción registrada. Por ejemplo:
add_action(''some_hook'', ''handler_for_some_hook'');
Este manejador se invocará cuando tome o el script haga some_action
pero si lo desea, puede invocar esa acción manualmente usando do_action
. Entonces, básicamente, do_action
invoca el gancho de acción registrado cuando lo llamas. Ver más en Codex .
Estoy tratando de encontrar qué funciona exactamente do_action y add_action. Ya examino con add_action pero para do_action lo intento como nuevo ahora. Esto es lo que intenté.
function mainplugin_test() {
$regularprice = 50;
if(class_exists(''rs_dynamic'')) {
$regularprice = 100;
}
// and doing further
//like i echoing the regular price
echo $regularprice; //It print 100 from this code
}
Ahora, en lugar de colocar algunos códigos en el archivo principal, tengo la intención de crear do_action para evitar problemas con el código.
function mainplugin_test() {
$regularprice = 50;
do_action(''testinghook'');
// and doing further
//like i echoing the regular price
echo $regularprice; //It should print 100 but it print 50
}
así que creé otra función para señalar ese gancho como algo así
function anothertest() {
if(class_exists(''rs_dynamic'')) {
$regularprice = 100;
}
}
add_action(''testinghook'',''anothertest'');
¿No está seguro de cómo agregar las líneas de código a ese enlace que la función anterior puede funcionar? Como probé en mi entorno de prueba, nada ayuda. Si entiendo correctamente ¿do_action es más como incluir un archivo? Si no, por favor avíseme.
Gracias.
La razón por la que no se imprimió 100
, porque $regularprice
dentro de anothertest()
función anothertest()
es local para esa función. La variable $regularprice
utilizada en la mainplugin_test()
principal mainplugin_test()
no es la misma que la variable utilizada en la función anothertest()
, están en un ámbito separado.
Por lo tanto, debe definir $regularprice
en un ámbito global (lo cual no es una buena idea) o puede pasar el argumento como parámetro a do_action_ref_array
. do_action_ref_array
es lo mismo que do_action
cambio acepta el segundo parámetro como una matriz de parámetros.
Pasando como argumento:
function mainplugin_test() {
$regularprice = 50;
// passing as argument as reference
do_action_ref_array(''testinghook'', array(&$regularprice));
echo $regularprice; //It should print 100
}
// passing variable by reference
function anothertest(&$regularprice) {
if(class_exists(''rs_dynamic'')) {
$regularprice = 100;
}
}
// remain same
add_action(''testinghook'',''anothertest'');
do_action
crea un gancho de acción, add_action
ejecuta las funciones enganchadas cuando se llama ese gancho.
Por ejemplo, si agrega lo siguiente en el pie de página de su tema:
do_action( ''my_footer_hook'' );
Puede hacer eco del contenido en esa ubicación desde functions.php o un plugin personalizado:
add_action( ''my_footer_hook'', ''my_footer_echo'' );
function my_footer_echo(){
echo ''hello world'';
}
También puede pasar variables a un gancho:
do_action( ''my_footer_hook'', home_url( ''/'' ) );
Que puedes usar en la función de devolución de llamada:
add_action( ''my_footer_hook'', ''my_footer_echo'', 10, 1 );
function my_footer_echo( $url ){
echo "The home url is $url";
}
En su caso, probablemente esté tratando de filtrar el valor según una condición. Para eso son los ganchos de filtro:
function mainplugin_test() {
echo apply_filters( ''my_price_filter'', 50 );
}
add_filter( ''my_price_filter'', ''modify_price'', 10, 1 );
function modify_price( $value ) {
if( class_exists( ''rs_dynamic'' ) )
$value = 100;
return $value;
}
Referencia