使用筛选器时,函数参数的可用性到底会发生什么变化?

时间:2021-10-01 作者:progonkpa

这个问题的目标是:

为了能够更好地解释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 虽然只传递回调,但有某种形式的工作流可以使事情更快&;更简单。

有人能进一步澄清,或者只是确认一下,这里到底发生了什么
官方文件中是否记录了这种行为?

1 个回复
最合适的回答,由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, 你可以跟踪讨论,看看为什么从来没有发生过。简短的版本是性能和向后兼容性。

相关推荐

即使以管理员身份也无法使用/wp-json/wp/v2/plugins API终结点

以管理员身份使用基本身份验证时,我得到一个错误代码401 Unauthorized : [rest_cannot_view_plugins] Sorry, you are not allowed to manage plugins for this site. 尝试访问GET时出错/wp-json/wp/v2/plugins 我的服务器的终结点。我可以毫无问题地获取帖子和页面信息,但当我查询插件时,我得到了401错误。我已经确认,API调用中使用的用户ID应该能够使用CLI工具管理插件:# wp use