Aquí hay algunos pensamientos aleatorios sobre esto:
Pregunta # 1
¿Cuánto dinero le enviamos a la abuela?
Para 100 cargas de página, le enviamos 100 x $ 1 = $ 100.
Aquí nos referimos a 100 x do_action( 'init' )
calls.
No importó que lo añadiéramos dos veces con:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
porque las devoluciones de llamada y prioridades (por defecto, 10) son idénticas .
Podemos comprobar cómo add_action
es solo un contenedor para add_filter
que construye la matriz global $wp_filter
:
function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
global $wp_filter, $merged_filters;
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
$wp_filter[$tag][$priority][$idx] = array(
'function' => $function_to_add,
'accepted_args' => $accepted_args
);
unset( $merged_filters[ $tag ] );
return true;
}
Sin embargo, si cambiamos la prioridad:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
entonces le enviaríamos 2 x $ 1 por carga de página o $ 200 por 100 cargas de página.
Igual si las devoluciones de llamada son diferentes:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Pregunta # 2
Si queremos asegurarnos de que solo enviemos a la abuela $ 1
Si solo queremos enviarlo una vez por carga de página , entonces debería hacerlo:
add_action( 'init','send_money_to_grandma' );
porque el gancho init
solo se dispara una vez. Podríamos tener otros ganchos que se activan muchas veces por carga de página.
Llamemos:
add_action( 'someaction ','send_money_to_grandma' );
pero, ¿qué sucede si someaction
se dispara 10 veces por carga de página?
Podríamos ajustar la función send_money_to_grandma()
con
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
o utilice una variable static como contador:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Si solo queremos ejecutarlo una vez (¡alguna vez!), entonces podríamos registrar una opción en la tabla wp_options
a través de la API de opciones :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Si queremos enviarle dinero una vez al día, podemos usar la API transitoria
function send_money_to_grandma()
{
if ( false === get_transient( 'sent_grandma_money' ) ) )
{
internetofThings( "send grandma","$1" );
set_transient( 'sent_grandma_money', 'yes', DAY_IN_SECONDS );
}
}
o incluso utilizar el cron wp.
Tenga en cuenta que puede tener llamadas ajax. también.
Hay formas de verificarlos, por ejemplo, con DOING_AJAX
También puede haber redirecciones, que podrían interrumpir el flujo.
Entonces podríamos querer restringir solo al backend, is_admin()
o no: ! is_admin()
.
Pregunta # 3
¿Es esto algo de lo que se preocupan los desarrolladores de complementos?
sí, esto es importante.
Si queremos hacer muy feliz a nuestra abuela, lo haríamos:
add_action( 'all','send_money_to_grandma' );
pero esto sería muy malo para el rendimiento ... y nuestra billetera ;-)