wordpres plugin_api org lista hooks español do_action codex add_filter add_action actions action_reference php wordpress-plugin wordpress

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