Aqui estão alguns pensamentos aleatórios sobre isso:
Pergunta # 1
Quanto dinheiro enviamos para a vovó?
Para 100 carregamentos de página, enviamos a ela 100 x $ 1 = $ 100.
Aqui, na verdade, queremos dizer 100 x do_action( 'init' )
chamadas.
Não importa que tenhamos adicionado duas vezes com:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
porque os retornos de chamada e prioridades (padrão 10) são idênticos .
Podemos verificar como o add_action
é apenas um wrapper para add_filter
que constrói a 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;
}
No entanto, alteramos a prioridade:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
enviaremos para ela 2 x 1 por carregamento de página ou 200 para 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' );
Pergunta # 2
Se quisermos garantir que apenas enviamos a vovó $ 1
Se quisermos enviá-lo apenas uma vez por carregamento de página , isso deve ser feito:
add_action( 'init','send_money_to_grandma' );
porque o gancho init
é acionado apenas uma vez. Podemos ter outros ganchos que são acionados várias 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?
Poderíamos ajustar a função send_money_to_grandma()
com
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
ou use uma variável static como um contador:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Se desejarmos executá-lo apenas uma vez (sempre!), poderemos registrar uma opção na tabela wp_options
por meio 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 o dinheiro dela uma vez por dia, podemos usar a API temporá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 use o wp-cron.
Note que você pode ter chamadas ajax. também.
Existem maneiras de verificar essas, por exemplo com DOING_AJAX
Também pode haver redirecionamentos que podem interromper o fluxo.
Então, poderíamos restringir apenas ao back-end, is_admin()
ou não: ! is_admin()
.
Pergunta # 3
Isso é algo com que os desenvolvedores de plug-ins se preocupam?
sim, isso é importante.
Se quisermos fazer nossa avó muito feliz, faríamos:
add_action( 'all','send_money_to_grandma' );
mas isso seria muito ruim para o desempenho ... e nossa carteira; -)