Вот несколько случайных мыслей по этому поводу:
Вопрос 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" );
}
}
Если мы хотим отправлять ей деньги раз в день, тогда мы можем использовать 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 );
}
}
или даже использовать wp-cron.
Обратите внимание, что у вас могут быть вызовы ajax. также.
Есть способы проверить это, например, с DOING_AJAX
Также могут быть перенаправления, которые могут прервать поток.
Тогда мы могли бы ограничить только на внутренний интерфейс is_admin()
или нет: ! is_admin()
.
Вопрос № 3
Это то, что беспокоит разработчиков плагинов?
да это важно
Если мы хотим сделать нашу бабушку очень счастливой, мы бы сделали:
add_action( 'all','send_money_to_grandma' );
но это было бы очень плохо для производительности ... и наш кошелек ;-)