如何访问do_action_ref_array()中的所有数组值?

时间:2020-03-09 作者:Knownow

我正在尝试理解do\\u action\\u ref\\u array()的工作原理以及do\\u action()和do\\u action\\u ref\\u array()之间的区别。我通过了(Difference between do_action_ref_array() and do_action()) 并得到do\\u action\\u ref\\u array()现在不用于自定义挂钩,因为do\\u action()可以。do\\u action\\u ref\\u array()似乎允许我们将数组传递给动作回调,但在使用它时,我发现我只能访问动作回调中的第一个元素,而其他值在回调中不可用。考虑:

add_action(\'wp_footer\' , \'rb_action_ref_array\');
add_action(\'testing\' , \'testing_ref_array\');


function rb_action_ref_array(){
    $avar = array(5 , 6) ;
    do_action_ref_array(\'testing\' ,$avar );
}

function testing_ref_array($avar){
  var_dump ($avar) ;
这个var\\u转储int(5),尽管$avar有5,6。类似地,如果我使用核心操作过滤器pre\\u get\\u posts,在回调中我会看到WP\\u查询直接可用,尽管我假设应该传递一个值为WP\\u Query的数组

add_action(\'pre_get_posts\' , \'rb_modify_posts\'); 

function rb_modify_posts($query) {
   var_dump($query); 
} 
Var\\u转储对象(WP\\u查询)#321。

我的问题是,当使用do\\u action\\u ref\\u array()时,如何访问数组中的其他值?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

是否使用do_action()do_action_ref_array(), 对于这两个函数,从钩子回调访问参数是相同的。但它们之间的主要区别在于我们为函数提供参数的方式:

do_action(), 我们只需分别传递每个参数:

do_action( \'some_hook\', 1, 2, 3, \'etc\' );
// i.e. do_action( <hook name>, <parameter>, <parameter>, <parameter>, ... );
do_action_ref_array(), 我们将每个参数放入一个数组中,然后将该数组作为第二个参数传递给do_action_ref_array():

do_action_ref_array( \'some_hook\', array( 1, 2, 3, \'etc\' ) );
/* i.e. do_action_ref_array( <hook name>, array(
    <parameter>, <parameter>, <parameter>, ...
) ); */
do_action_ref_array() 将实际将每个数组项作为一个单独的参数传递给挂钩回调,即它执行类似的操作hook_callback( <parameter>, <parameter>, <parameter>, ... ); e、 g。my_function( $args[0], $args[1] ) 哪里my_function 是钩子回调,并且$args 数组是否传递给do_action_ref_array().

// Let\'s say you had this:
add_action( \'my_hook\', \'my_function\' );

// And then this:
$args = [ 1, 2 ]; // same as $args = array( 1, 2 )
do_action_ref_array( \'my_hook\', $args );

// And do_action_ref_array would make a call that\'s similar to:
my_function( $args[0] ); // i.e. my_function( 1 )

// But if you had this: (note the fourth parameter)
add_action( \'my_hook\', \'my_function\', 10, 2 );

// Then the call would be:
my_function( $args[0], $args[1] ); // i.e. my_function( 1, 2 )
因此,如果您希望56 如果在回调中可用,则回调需要接受两个参数and 告诉add_action() (通过第四个parameter) 要向回调传递两个参数,请执行以下操作:

// Set the callback to accept two parameters.
function testing_ref_array( $arg1, $arg2 ) {
    var_dump( $arg1, $arg2 );
}

// And then tell add_action() to pass two parameters to the callback.
add_action( \'testing\', \'testing_ref_array\', 10, 2 );
// i.e. add_action( <hook name>, <callback>, <priority>, <number of accepted parameters> )
此外,值得注意的是do_action_ref_array() 使用call_user_func_array() 调用钩子回调,那么我们如何调用call_user_func_array() 也是我们所说的do_action_ref_array(), 除了第一个参数do_action_ref_array() 是挂钩名称,而不是回调。相同的上下文适用于do_action(), 但它更像call_user_func(), 尽管如此do_action() 还使用call_user_func_array().

相关推荐