Voici quelques réflexions aléatoires à ce sujet:
Question 1
Combien d'argent avons-nous envoyé à grand-mère?
Pour 100 chargements de page, nous lui avons envoyé 100 x 1 $ = 100 $.
Ici, nous entendons en fait des 100 x do_action( 'init' )
appels.
Peu importe que nous l'ajoutions deux fois avec:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
car les rappels et les priorités (par défaut 10) sont identiques .
Nous pouvons vérifier comment le add_action
est juste un wrapper pour add_filter
construire le $wp_filter
tableau 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;
}
Si toutefois nous modifions la priorité:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
alors nous lui enverrions 2 x 1 $ par chargement de page ou 200 $ pour 100 chargements de page.
Même si les rappels sont différents:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Question 2
Si nous voulons nous assurer que nous n'envoyons que grand-mère 1 $
Si nous ne voulons l'envoyer qu'une fois par chargement de page , alors cela devrait le faire:
add_action( 'init','send_money_to_grandma' );
parce que le init
crochet n'est tiré qu'une seule fois. Nous pouvons avoir d'autres crochets qui se déclenchent plusieurs fois par chargement de page.
Appelons:
add_action( 'someaction ','send_money_to_grandma' );
mais que se passe-t-il si someaction
10 fois par chargement de page se déclenche?
Nous pourrions ajuster la send_money_to_grandma()
fonction avec
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
ou utilisez une variable statique comme compteur:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Si nous ne voulons l'exécuter qu'une seule fois (jamais!), Nous pouvons alors enregistrer une option dans le wp_options
tableau via l' API Options :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Si nous voulons lui envoyer de l'argent une fois par jour, nous pouvons utiliser l' API transitoire
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 même utiliser le wp-cron.
Notez que vous pourriez avoir des appels ajax. ainsi que.
Il existe des moyens de les vérifier, par exemple avec DOING_AJAX
Il peut également y avoir des redirections qui pourraient interrompre le flux.
Ensuite , nous pourrions vouloir limiter au back - end uniquement, is_admin()
ou non: ! is_admin()
.
Question 3
Est-ce quelque chose qui inquiète les développeurs de plugins?
oui c'est important.
Si nous voulons rendre notre grand-mère très heureuse, nous ferions:
add_action( 'all','send_money_to_grandma' );
mais ce serait très mauvais pour les performances ... et notre portefeuille ;-)