Aqui estão alguns pensamentos aleatórios sobre isso:
Questão 1
Quanto dinheiro enviamos para a avó?
Para 100 carregamentos de página, enviamos 100 x $ 1 = $ 100.
Aqui, na verdade, queremos dizer 100 x do_action( 'init' )
chamadas.
Não importava que o adicionássemos duas vezes com:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
porque os retornos de chamada e as prioridades (padrão 10) são idênticos .
Podemos verificar como o add_action
é apenas um invólucro add_filter
que constrói a $wp_filter
matriz global :
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;
}
Se, no entanto, alterássemos a prioridade:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
enviaríamos a ela 2 x US $ 1 por carregamento de página ou US $ 200 por 100 carregamentos de página.
O mesmo se os retornos de chamada forem diferentes:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Questão 2
Se quisermos ter certeza de enviar apenas à avó US $ 1
Se quisermos enviá-lo apenas uma vez por carregamento de página , faça o seguinte:
add_action( 'init','send_money_to_grandma' );
porque o init
gancho é acionado apenas uma vez. Podemos ter outros ganchos que são acionados muitas vezes por carregamento de página.
Vamos ligar:
add_action( 'someaction ','send_money_to_grandma' );
mas o que acontece se someaction
disparar 10 vezes por carregamento de página?
Nós poderíamos ajustar a send_money_to_grandma()
função com
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
ou use uma variável estática como um contador:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Se quisermos executá-lo apenas uma vez (sempre!), Poderemos registrar uma opção na wp_options
tabela através da API de opções :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Se quisermos enviar dinheiro a ela uma vez por dia, podemos usar a API transitória
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 );
}
}
ou até mesmo usar o wp-cron.
Observe que você pode ter chamadas ajax. também.
Existem maneiras de verificar isso, por exemplo, com DOING_AJAX
Também pode haver redirecionamentos, que podem interromper o fluxo.
Então nós pode querer restringir somente, para o servidor is_admin()
ou não: ! is_admin()
.
Questão 3
Isso é algo com que os desenvolvedores de plugins se preocupam?
sim, isso é importante.
Se queremos deixar nossa avó muito feliz, faremos:
add_action( 'all','send_money_to_grandma' );
mas isso seria muito ruim para o desempenho ... e nossa carteira ;-)