这是一个非常糟糕的主意。
您可以通过这样做来实现这一点:
add_action( \'init\', function(){
do_action()//rinse recycle repeat for every hook
});
我强烈建议你不要走这条路。这可能会导致很多问题,如不需要时挂钩开火等。
钩子的思想是扩展在给定时间处理的流程的功能,它们提供的数据仅在某些操作(如添加注释)期间可用。
如果对每个钩子都执行\\u操作,则可能是灾难性的。更不用说你没有每个钩子的数据了。
如果您希望在每次加载页面时启动函数,那么请使用init挂钩,因为admin面板仅使用admin\\u init
但不要在一个钩子中触发每一个WordPress操作。这不是个好主意
只是为了掩盖all 地面
执行:
add_action( \'init\', function(){
add_action( \'hook\', function(){
// do code here
})
})
这将在每个钩子上激发函数,但不要在一个钩子上激发每个钩子。当然,您会对每个要启动函数的挂钩执行单独的add\\u操作,但没有真正的启动挂钩的方法。
重用代码的更好途径可以是:
add_action( \'init\', function(){
$hooks = array(
\'hook1\',
\'hook2\',
\'hook3\'//and so on.
);
foreach( $hooks as $hook ){
add_action( $hook, function(){
// Do code
});
}
// Do the same but in add_filter
});
同样,为了覆盖所有理由,直接在上面的方法将添加操作/筛选器,但操作/筛选器在使用apply\\u filter或do\\u操作激发之前不会激发,这只是将函数添加到操作或筛选器。
然后,您必须接受函数的参数,而不提供add\\u action上的第四个参数,您保证只有一个参数,因此您必须在代码中过滤您使用的参数,以及一些if或else。
对于详细说明arg的评论,您可以执行类似的操作:
add_action( \'init\', function(){
$hooks = array(
\'hook1\' => array( \'argname1\', \'argname2\', \'argname3\' ),
\'hook2\' => array( \'argname1\', \'argname2\', \'argname3\' ),
\'hook3\' => array( \'argname1\', \'argname2\', \'argname3\' )//and so on.
);
foreach( $hooks as $hook=>$args ){
add_action( $hook, function(){
$numargs = func_num_args();
for( $i=0; $i<$numargs; $i++ ){
$$args[$i] = func_get_arg($i);
}
// Do code
}, 10, count( $args ) );
}
// Do the same but in add_filter
});
然后使用for,显然可以判断避免错误所需的参数数量。
为了更好地避免错误,请先检查$args[$i]是否存在或不为空,然后再为其设置func\\u get\\u arg。
回复评论:下面是一个实时示例,说明如何将其用于save\\u post操作
add_action( \'init\', function(){
$hooks = array(
\'save_post\' => array( \'post_id\', \'post\', \'update\' )
);
foreach( $hooks as $hook=>$arg ){
add_action( $hook, function(){ // Note we dont do any args here
$num_args = func_num_args(); // would return 3 because we supplied 3 args
for( $i=0; $i<$num_args; $i++ ){
if( !empty( $arg[$i] ) ){
$$arg[$i] = func_get_arg( $i );
// We use !empty as it will check if isset AND not empty
// This would set all three array values to the respective variable
// $post_id, $post, $update
// Make sure you put the args in the right order in the hooks array above to avoid mixing up var names.
}
}
if( isset( $post ) ){
update_post_meta( $post->ID, \'meta_key_whatever_you_want\', \'meta_value_whateveryouwant\' );
// I used $post to show you that the second argumnet supplied by do_action is $post and we set $$arg[1] as $post and retrieved the arg with same key 1 Normally you would just use post_id
}
// Can do with any of the args just be carefull.
}, 10, count( $args ) );
// We count the hook arg array which is the array with simple strings for our variable names and supply it to add_action to let wordpress know we want 3 arguments. If you supply more than 3 arguments you may get errors for this hook, so setting array with 50 args for a hook that only supplies 3 is not good.
// 10 is simply priority in which this hook fires.
}
});
这只是实现这一点的一种方法,然后只需为钩子执行一个数组键,为每个钩子的参数执行一个数组,并检查变量是否已设置。您可能需要对变量进行一些额外的验证,以确保您拥有正确的数据,因为某些挂钩共享变量名称,但您可以自定义,因此$post\\u id可以设置为$$arg[0],并且在arg数组中设置为“post\\u id\\u custom”,使用挂钩$post\\u id提供的数据将其设置为$post\\u id\\u custom。
还有一件事,要真正完全简化事情,您也可以这样做:
function someFunc(){
// do code here
}
add_action(\'hook1\', \'someFunc\' );
add_action(\'hook2\', \'someFunc\' );
add_action(\'hook3\', \'someFunc\' );
add_action(\'hook4\', \'someFunc\' );
这将激发与所提供的所有动作挂钩相同的乐趣。
add_action( \'all\', function() {
static $hooks = [];
global $allhooks;
$filter = current_filter();
if ( isset ( $hooks[ $filter ] ) )
return;
$types = array_map( function ( $arg ) {
return $arg;
}, func_get_args() );
$hooks[$filter] = $types;
if( \'shutdown\' !== $filter )
return;
foreach( $hooks as $hook=>$args ){
$allhooks[$hook] = $args;
}
});
add_action( \'shutdown\', function(){
global $allhooks;
var_dump( $allhooks );
});
这将打印挂钩附带的所有挂钩和所有参数供参考。对toscho代码的简单修改,它会为每个钩子转储类似的内容。
array (size=809)
\'after_setup_theme\' =>
array (size=1)
0 => string \'after_setup_theme\' (length=17)
\'ot_theme_mode\' =>
array (size=2)
0 => string \'ot_theme_mode\' (length=13)
1 => boolean false
\'ot_child_theme_mode\' =>
array (size=2)
0 => string \'ot_child_theme_mode\' (length=19)
1 => boolean false
\'ot_show_pages\' =>
array (size=2)
0 => string \'ot_show_pages\' (length=13)
1 => boolean true
这只是将其转储到浏览器中,简单地重复并帮助您解释toscho所说的参数名称不仅仅是提供的值。
经过审查,它缺少像save\\u post这样的挂钩。因此,即使是all钩子也不能提供每个动作和过滤器。
真的没有办法做到这一点,这真的是个坏主意。
再说一次,我不是WordPress专家。