如何使用add_action从其他Class挂钩静态方法

时间:2017-01-31 05:01:08

标签: php wordpress wordpress-hook

我尝试使用hook来调用静态方法,但它失败了。

我在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,但该函数从未执行过。

2 个答案:

答案 0 :(得分:4)

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

更新此内容:

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

对此:

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

答案 1 :(得分:0)

我看了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的行是否已执行。