Ось кілька випадкових думок з цього приводу:
Питання 1
Скільки грошей ми відправили бабусі?
За 100 завантажень сторінок ми надіслали їй 100 x 1 $ = 100 $.
Тут ми маємо на увазі 100 x do_action( 'init' )
дзвінки.
Не важливо, що ми додали його двічі:
add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );
оскільки зворотні дзвінки та пріоритети (10 за замовчуванням) однакові .
Ми можемо перевірити, як add_action
просто оболонка для add_filter
побудови глобального $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;
}
Якщо ми все-таки змінили пріоритет:
add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );
тоді ми надсилаємо їй 2 х 1 долар за завантаження сторінки або 200 доларів за 100 завантажень сторінки.
Те саме, якщо зворотні дзвінки, де різні:
add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );
Питання №2
Якщо ми хочемо переконатися, що ми надсилаємо бабусі лише 1 долар
Якщо ми хочемо надіслати його лише один раз на завантаження сторінки , це слід зробити:
add_action( 'init','send_money_to_grandma' );
бо init
гачок вистрілюється лише один раз. У нас можуть бути інші гачки, які спрацьовують багато разів за завантаження сторінки.
Давайте подзвонимо:
add_action( 'someaction ','send_money_to_grandma' );
але що станеться, якщо someaction
пожежі 10 разів на завантаження сторінки?
Ми могли б скорегувати send_money_to_grandma()
функцію за допомогою
function send_money_to_grandma()
{
if( ! did_action( 'someaction' ) )
internetofThings("send grandma","$1");
}
або використовувати статичну змінну як лічильник:
function send_money_to_grandma()
{
static $counter = 0;
if( 0 === $counter++ )
internetofThings("send grandma","$1");
}
Якщо ми хочемо запустити його лише один раз (коли-небудь!), То ми можемо зареєструвати параметр у wp_options
таблиці через API параметрів :
function send_money_to_grandma()
{
if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
{
update_option( 'sent_grandma_money', 'yes' );
internetofThings( "send grandma","$1" );
}
}
Якщо ми хочемо відправляти їй гроші раз на день, тоді ми можемо скористатись 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 );
}
}
або навіть використовувати wp-cron.
Зауважте, що у вас можуть виникнути дзвінки Ajax. так само.
Є способи перевірити їх, наприклад, за допомогою DOING_AJAX
Також можуть бути перенаправлення, які можуть перервати потік.
Тоді ми могли б обмежити тільки на внутрішній інтерфейс is_admin()
чи ні: ! is_admin()
.
Питання №3
Це хвилює розробників плагінів?
так це важливо.
Якщо ми хочемо зробити нашу бабусю дуже щасливою, ми б зробили:
add_action( 'all','send_money_to_grandma' );
але це було б дуже погано для продуктивності ... і наш гаманець ;-)