Ecco alcuni pensieri casuali su questo:
Domanda 1
Quanti soldi abbiamo inviato alla nonna?
Per 100 caricamenti di pagina, le abbiamo inviato 100 x $ 1 = $ 100.
Qui intendiamo effettivamente 100 x do_action( 'init' )
chiamate.
Non importa che l'abbiamo aggiunto due volte con:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
perché i callback e le priorità (default 10) sono identici .
Possiamo verificare come add_action
sia solo un wrapper per add_filter
quello che costruisce l' $wp_filter
array globale :
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 abbiamo comunque cambiato la priorità:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
quindi le invieremo 2 x $ 1 per caricamento della pagina o $ 200 per 100 caricamenti della pagina.
Lo stesso se i callback erano diversi:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Domanda 2
Se vogliamo assicurarci di inviare solo nonna $ 1
Se vogliamo inviarlo solo una volta per caricamento della pagina , allora dovremmo farlo:
add_action( 'init','send_money_to_grandma' );
perché l' init
hook viene sparato solo una volta. Potremmo avere altri hook che si attivano molte volte per caricamento della pagina.
Chiamiamo:
add_action( 'someaction ','send_money_to_grandma' );
ma cosa succede se viene someaction
generato 10 volte per caricamento della pagina?
Potremmo regolare la send_money_to_grandma()
funzione con
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
o usa una variabile statica come contatore:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Se vogliamo eseguirlo solo una volta (mai!), Potremmo registrare un'opzione nella wp_options
tabella tramite l' API delle opzioni :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Se vogliamo inviarle denaro una volta al giorno, allora possiamo usare l' API Transient
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 persino usare wp-cron.
Nota che potresti avere chiamate Ajax. anche.
Ci sono modi per verificare quelli, ad esempio con DOING_AJAX
Potrebbero esserci anche reindirizzamenti, che potrebbero interrompere il flusso.
Poi si potrebbe desiderare di limitare solo al backend is_admin()
o meno: ! is_admin()
.
Domanda 3
È qualcosa di cui gli sviluppatori di plugin si preoccupano?
si questo è importante.
Se vogliamo rendere molto felice nostra nonna, faremmo:
add_action( 'all','send_money_to_grandma' );
ma questo sarebbe molto male per le prestazioni ... e il nostro portafoglio ;-)