Oto kilka przypadkowych przemyśleń na ten temat:
Pytanie 1
Ile pieniędzy wysłaliśmy babci?
Przy 100 ładowaniach stron wysłaliśmy jej 100 x 1 USD = 100 USD.
Tutaj mamy na myśli 100 x do_action( 'init' )
połączenia.
Nie miało znaczenia, że dodaliśmy go dwa razy z:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
ponieważ wywołania zwrotne i priorytety (domyślnie 10) są identyczne .
Możemy sprawdzić, w jaki sposób add_action
jest to tylko opakowanie, add_filter
które tworzy globalną $wp_filter
tablicę:
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;
}
Gdybyśmy jednak zmienili priorytet:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
wtedy wysyłalibyśmy jej 2 x 1 USD za ładowanie strony lub 200 USD za 100 ładowań strony.
To samo, jeśli wywołania zwrotne są różne:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Pytanie 2
Jeśli chcemy mieć pewność, że wysyłamy babci tylko 1 USD
Jeśli chcemy wysłać go tylko raz przy ładowaniu strony , należy to zrobić:
add_action( 'init','send_money_to_grandma' );
ponieważ init
hak wystrzeliwuje się tylko raz. Możemy mieć inne zaczepy, które uruchamiają się wielokrotnie podczas ładowania strony.
Zadzwońmy:
add_action( 'someaction ','send_money_to_grandma' );
ale co się stanie, jeśli someaction
uruchomi się 10 razy na ładowanie strony?
Możemy dostosować send_money_to_grandma()
funkcję za pomocą
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
lub użyj zmiennej statycznej jako licznika:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Jeśli chcemy uruchomić go tylko raz (kiedykolwiek!), Możemy zarejestrować opcję w wp_options
tabeli za pośrednictwem interfejsu API opcji :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Jeśli chcemy wysyłać jej pieniądze raz dziennie, możemy skorzystać z Transient API
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 );
}
}
lub nawet użyj wp-cron.
Pamiętaj, że możesz mieć wywołania ajax. także.
Istnieją sposoby, aby je sprawdzić, np. Za pomocą DOING_AJAX
Mogą również istnieć przekierowania, które mogą zakłócić przepływ.
Wtedy może chcemy ograniczać tylko do backend is_admin()
lub nie: ! is_admin()
.
Pytanie 3
Czy jest to coś, o co martwią się twórcy wtyczek?
tak, to ważne.
Jeśli chcemy uszczęśliwić naszą babcię, zrobilibyśmy:
add_action( 'all','send_money_to_grandma' );
ale byłoby to bardzo złe dla wydajności ... i naszego portfela ;-)