【问题标题】:How to use add_action to hook a static method from other Class如何使用 add_action 挂钩来自其他类的静态方法
【发布时间】:2017-01-31 05:01:08
【问题描述】:

我尝试使用钩子调用静态方法,但失败了。

我像这样在 test.php 中添加动作

 require_once('class.test.php');
 add_action('register_new_user', array('Test','auto_signin'),20);

我的 auto_signin 函数放在 class.test.php 文件中:

 namespace MyTest;
 echo(12);
 class Test {
    function __construct()
    {

    }

    public static function auto_signin()
    {
       echo('hello');
       die();
    }
  }

当我调试它时,钩子 register_new_user 确实执行了,并且从全局变量 wp_filters 中,auto_signin 函数已添加到 register_new_user,但该函数从未执行。

【问题讨论】:

  • this并提供示例
  • @Haotian Liu 你能告诉我我应该如何解决它,我想我只是做了和例子一样的事情
  • 我试过这个并发布了我的答案,希望它可以帮助。

标签: php wordpress wordpress-hook


【解决方案1】:

您的类 Test 是命名空间,但是在调用 add_action 时您没有使用任何命名空间。

更新这个:

add_action('register_new_user', array('Test','auto_signin'),20);

到这里:

add_action( 'register_new_user', array( 'MyTest\Test', 'auto_signin' ), 20 );

【讨论】:

  • @Popnoodles 我不相信这在这种情况下是有效的。问题是关于使用 add_action 的静态方法。如果在类中调用 add_action,他们将能够使用`__CLASS__`,但提供的示例显示它来自外部。
  • 啊,来自“其他”类。好的
【解决方案2】:

我阅读了Wordpress Plugin API Reference,但找不到任何名为register_new_user 的操作,因此您必须使用自定义挂钩。

但是,当且仅当它被钩子并且这个钩子应该对应的do_action钩子时,该方法才会被执行。

查看此代码:

class PluginTest {
    function __construct(){
    }
    public static function insertNew(){
        echo 'Hi!';
        die();
    }
}

do_action('custom_admin_notices');

add_action( 'custom_admin_notices', array('PluginTest', 'insertNew'), 20);
global $wp_filter;
var_dump($wp_filter['custom_admin_notices']);

如果do_action 行被注释,你仍然可以在全局变量中看到钩子,而方法不会被执行。所以检查包含do_action的行是否被执行。

【讨论】:

  • 如果我把add_action('register_new_user', array('Test','auto_signin'),20); 改成add_action('register_new_user', function(do something);),函数就会被执行。
【解决方案3】:

当您想将对象方法附加到挂钩而不是类的静态方法时,您尝试的方式将起作用。由于您希望类的静态方法附加到挂钩,因此您需要添加如下。

 add_action('register_new_user', 'Test::auto_signin',20);

而不是add_action('register_new_user', array('Test','auto_signin'),20);

注意:如果你想从另一个文件挂钩,你还需要添加命名空间并调用如下代码

add_action('register_new_user', '\MyTest\Test::auto_signin',20);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2013-11-28
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多