将函数传递给ADD_ACTION总是返回第一个参数

时间:2019-06-24 作者:Jody Heavener

我正在构建一个插件,它可以遍历和解析各种WordPress挂钩的参数,并且由于所需的灵活性,我正在传递一个函数作为中的可调用参数add_action:

foreach ($events as $event) {
  add_action($event, function() use($event) {
    $args = func_get_args();

    // Do something with $event and $args
  }, 100);
}
我遇到的问题是,这似乎只检索传递给操作的第一个参数。

profile_update, 例如它应该传递用户ID以及旧用户数据的对象,但如果我检查,则只会获取用户ID:

var_dump($args)
// array(1) { [0]=> int(3) } 
这也不局限于特定的钩子;对于任何这样设置的钩子,我似乎只能得到第一个论点。欢迎您提出任何建议!

1 个回复
最合适的回答,由SO网友:ChristopherJones 整理而成

我认为你走的是正确的道路,但我认为func_get_args() 只会给您传递给该函数的参数。这就是我过去一直使用它的方式。

我采取了另一种我认为可能有效的方法。我发现debug_backtrace() 有助于调试之前的操作和筛选器。它返回给您的数组中的第四个元素是do\\u action调用,其中包含您希望进行的调用中的所有参数。

以下是我编写的一段代码,以及我测试的几个操作:

<?php

// Here are the Actions I tested against.
$events = array(
    \'profile_personal_options\',
    \'profile_update\',
    \'show_user_profile\',
    \'show_user_profile\'
);

foreach ($events as $event) {
  add_action($event, function($args = null) {

    $backtrace = debug_backtrace();

    // This element is going to be the do_action call
    echo \'<pre>\';
    print_r($backtrace[3][\'function\']);
    echo \'</pre>\';

    $action_arguments = $backtrace[3][\'args\'];
    // The first element of this is going to be the $event
    array_shift($action_arguments);

    // Leaving you with the rest of the parameters available to that action
    echo \'<pre>\';
    print_r($action_arguments);
    echo \'</pre>\';

  }, 100);
}
如果这不是你想要的,或者我走了。。。让我知道,我很乐意记下我的答案!!

相关推荐

如何清理wp-content/plugins/wordpress-seo中不必要的文件?

我目前维护Wordpress网站7年。磁盘使用率最近已满,因此我需要定期检查自动备份并保存这些备份,然后将其从服务器中删除。当我检查时,插件文件夹中的wordpress seo文件夹(这是Yoast seo默认插件文件夹)占用了太多空间。据我所知,它充满了各种版本的插件文件。确切地说,它位于wordpress seo插件的js/dist文件夹中。它包含几种类型的小型javascript,每个名称的末尾都有某种序列或版本号,总容量约为250-300 MB。我可以清理这些文件吗?如果是,是否安全?如果我从以前