以下是对此的一些随机想法:
问题#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)是
identical.
我们可以检查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 x 1美元或100页200美元。
如果回调不同,则相同:
add_action( \'init\',\'send_money_to_grandma_1_dollar\' );
add_action( \'init\',\'send_money_to_grandma_also_1_dollar\' );
如果我们想确保只给奶奶寄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 APIfunction 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\' );
但这对性能非常不利。。。还有我们的钱包;-)