将新函数与操作挂钩+传递参数

时间:2021-02-19 作者:Lewis

我正在尝试理解php的一些基础知识,包括向操作添加新函数。我找到了一个教程,他在其中向save_post 操作…

add_action(\'save_post\', \'log_when_saved\'); 

function log_when_saved($post_id){ do something with $post_id };
我的理解正确吗?当我们通过do_action(\'save_post\', $post_ID, $post, $update) 此时我们传递的参数是自动传递的&;立即可用在我们正在添加到动作的新功能中,这就是这里发生的事情?

当我们写作时add_action(\'save_post\', ‘log_when_saved’); 我们正在添加一些新函数,以便在启动操作时运行。要运行的这个新函数可以自动使用通过do_action. 这是正确的吗?

如果我们想通过$post$update 这个新函数的参数也是…我们是否必须执行以下操作…

add_action(\'save_post\', \'log_when_saved\'); 

function log_when_saved($post_id, $post, $update){ do something with $post_id, $post, $update};
我试图理解的一个基本问题是,传递新函数的参数必须严格按照do_action(\'save_post\', $post_ID, $post, $update) 类似地,如果我们想得到最后一个参数,是否需要调用所有3个$update 在我们的功能中使用?

关于命名规则,我们是否也可以做以下操作…

add_action(\'save_post\', \'log_when_saved\'); 

function log_when_saved($some_random_variable_name){ do something with $post_id };
它会知道的$some_random_variable_name 将是post id,因为是do_action(‘save_post’, $post_ID, $post, $update) 陈述

提前感谢您,

2 个回复
SO网友:Buttered_Toast

对于这个示例,假设我们有以下内容

do_action(\'bt_custom_action\', get_the_ID(), get_the_title(), get_the_content());
将传递给的参数add_action 按此顺序

默认情况下,如果我们连接到do_action 没有任何争论,像这样

add_action(\'bt_custom_action\', \'bt_callback_func\');
我们的回拨功能“;获取;一个参数,在本例中为ID

function bt_callback_func ($id) {
    echo $id;
}
为了得到帖子的内容,我们需要这样做

add_action(\'bt_custom_action\', \'bt_callback_func\', 10, 3);
这将向回调函数传递三个参数,要使用它们,我们可以执行如下操作

function bt_callback_func ($id, $title, $content) {
    echo $id . \'<br>\' . $title . \'<br>\' . $content;
}
现在,最后回答你关于获得具体论点的问题。

如果我们按照这个例子

add_action(\'bt_custom_action\', \'bt_callback_func\', 10, 3);
我们知道回调函数将得到三个参数,但我们只需要内容。我们不必为每个预期参数设置参数。我们可以使用PHP..., 看见Variable-length argument lists.

现在我们的回调函数如下所示

function bt_callback_func (...$args) {
    echo args[2];
}
因为在add操作中,我们告诉回调需要三个参数,我们知道第三个参数是我们需要的(内容),使用... 现在,我们创建了一个变量,该变量将包含所有传递的argumnets。

在本例中,它将包含一个按顺序包含三个元素的数组。ID、标题,然后是内容。

我们知道内容在我们的数组中是最后一个,第三个。我们可以像这样直接瞄准它$args[2].

希望这有帮助=]

SO网友:Jacob Peattie

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().

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

相关推荐

更改函数后无法访问站点。php

我正在编辑函数。当我的整个网站宕机时,我的网站中出现了php。我甚至无法进入仪表板或登录。任何试图访问该网站的行为都会导致以下消息:"E;此网站出现严重错误。请查看您的站点管理电子邮件收件箱以了解说明"E;我没有收到任何电子邮件。我上网查看了一下,所有的解决方案都说去仪表板做点什么,但我无法访问仪表板。一种解决方案是使用FileZilla访问该网站,但进行了更多研究,似乎之前必须在仪表板中设置该选项,才能获得访问该网站的用户名,这是我无法做到的。我没有访问该网站主机的权限,因为我不是主机所