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
您将看到哪些参数被传递给回调函数,因此您知道哪些参数表示哪种类型的值。