这个问题的目标是:
为了能够更好地解释WP文档,了解此场景中到底发生了什么,为了验证我的想法是否正确,我遇到了此代码。
function register() {
...
add_filter( "plugin_action_links_$this->plugin", array( $this, \'settings_link\' ) );
}
public function settings_link($links) {
$settings_link = \'<a href="admin.php?page=alecaddd_plugin">Settings</a>\';
array_push( $links, $settings_link );
return $links;
}
当我调试时
settings_link($links)
, 我看到$links是一个带有“deactivate”键和值的数组。
正在查看wp dev docs, 看来$links
与$actions参数相关
apply_filters( "plugin_action_links_{$plugin_file}", string[] $actions, string $plugin_file, array $plugin_data, string $context )
我注意到其他参数,$plugin_file, $plugin_data, $context
, 在调试器中不可用。
然后我将代码更改如下。
function register() {
...
add_filter( "plugin_action_links_$this->plugin", array( $this, \'settings_link\' ), 10, 4 ); ); // change 1
}
public function settings_link($links, $plugin_file, $plugin_data, $context ) { // change 2
$settings_link = \'<a href="admin.php?page=alecaddd_plugin">Settings</a>\';
array_push( $links, $settings_link );
return $links;
}
低,看,现在其他参数
$plugin_file, $plugin_data, $context
现在在我的功能中可用。
我怀疑是打电话来的add_filter
虽然只传递回调,但有某种形式的工作流可以使事情更快&;更简单。
有人能进一步澄清,或者只是确认一下,这里到底发生了什么
官方文件中是否记录了这种行为?
最合适的回答,由SO网友:Jacob Peattie 整理而成
需要注意的重要一点是,操作和过滤器挂钩大多只是标准的PHP回调行为。
第二个参数传递给add_filter()
应该是PHPCallable. 应用过滤器时apply_filters()
, 该回调只通过核心PHP函数运行call_user_func_array()
. 任何附加参数apply_filters()
然后作为$args
回拨您的电话。
WordPress特定的行为是定义回调接受的参数数量。添加过滤器时add_filter()
, 第4个参数定义回调接受的参数数。WordPress在调用时只传递该数量的参数call_user_func_array()
.
通常情况下,传递的参数比回调接受的参数多完全可以。内置PHP函数是个例外,它会引发一个错误。例如,这将引发错误:
call_user_func_array( \'addslashes\', array( \'argument one\', \'argument two\' ) );
为了防止出现这种情况,WordPress让您声明回调接受的参数数量,并修剪传递给的参数数量
call_user_func_array()
照着
反对这种行为是老生常谈here, 你可以跟踪讨论,看看为什么从来没有发生过。简短的版本是性能和向后兼容性。