这是一些随机的想法:
问题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
仅将wrapper用于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 x $ 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
通过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' );
但这对于性能和我们的钱包是非常不利的;-)