Butterend\\u Toast所说的一切都是正确的,但我想谈谈为什么会这样。
在引擎盖下,do_action() 和apply_filters() 正在调用核心PHP函数call_user_func_array(). 当你跑步时add_action() 您正在存储对的引用callable, 用一个数字表示函数接受多少个参数。
add_action(
\'save_post\', // Hook name
\'log_when_saved\', // Callable.
10, // Priority
3 // How many arguments the callable can accept.
);
所以当你打电话的时候
do_action(), WordPress使用
call_user_func_array() 使用该可调用函数,以及传递给哪个参数的数组
do_action().
避免某些错误,并允许开发人员使用接受的参数少于传递给的参数的函数do_action(), WordPress将截断传递给的数组call_user_func_array() 以匹配add_action() 呼叫如果它不这样做,那么如果您的函数不接受所有变量,您将得到一个致命错误。
因此,可以在回调函数中使用的变量由以下因素决定:
传递给哪些参数do_action().运行时选择接受多少变量add_action().变量的名称无关紧要,但顺序无关紧要。这就是所有PHP函数的工作方式。如果我编写此函数:
function add_numbers( $one, $two ) {
return $one + $two;
}
传递给函数的第一个参数将被赋予变量名
$one 在该函数中,第二个函数将被命名为
$two. 函数外部使用的变量名无关紧要:
$a = 1;
$b = 3;
$c = add_numbers( $a, $b ); // Works fine.
$d = add_numbers( 2, 4 ); // Even if I don\'t pass named variables.
钩子也是如此。传递给的参数
do_action() 作为参数传递给
call_user_func_array() 按顺序。所以如果我像这样上钩:
add_action( \'save_post\', \'log_when_saved\', 10, 3 );
那么这就行了:
function log_when_saved( $post_id, $post, $update ) {
echo $post_id;
}
这也是:
function log_when_saved( $a $b, $c ) {
echo $a;
}
但不管名字是什么,
$a 将始终是传递给的帖子ID
do_action() 因为这是第一个论点。所以在这个例子中,
$b 是帖子ID:
function log_when_saved( $b, $a, $c ) {
echo $b;
}
这就是为什么将变量名与所传递的内容相匹配是一种很好的做法。不是出于任何技术原因,而是为了更容易理解。
这将不起作用:
function log_when_saved( $a, $b, $c ) {
echo $post_id;
}
因为
$post_id 未定义。如果要使用正在保存的帖子的ID,则需要使用传递的ID作为第一个参数。
所有这些都提出了一个问题,即如何知道在钩子回调中可以或需要接受哪些变量。这就是documentation 进来了。如果你看the documentation for save_post 您将看到哪些参数被传递给回调函数,因此您知道哪些参数表示哪种类型的值。