我能用另一个钩子钩住吗?

时间:2014-12-01 作者:GreyWolfram

我的问题是,例如,当我们使用oop方式钩住某个动作时

class My_Plugin_Class { 
    public function __construct( ) {
       add_action( \'admin_init\', array( &$this, \'some_function\' ) );
    }

    public function some_function() {
       //do something here
       include( \'some_php_file.php\' );
    }
}
然后在该some\\u php\\u文件中。您包含的php

class Some_Class_Again { 
    public function __construct( ) {
       add_action( \'init\', array( &$this, \'another_function\' ) );
    }

    public function another_function() {
       //do something here like enqueue script
    }
}
这可能吗?您将类中的一个方法挂接在动作挂钩中,然后在该方法中包含另一个类文件,以制作或挂接到另一个动作挂钩中。因为当我尝试的时候,第二节课什么都没有发生。我只是想知道这是否可能,是否我做错了什么?如果不是,请告诉我原因。我已经想了很长一段时间了。

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

当涉及到oop方式时,您需要的不仅仅是类,如果希望启动操作,您还需要在某个时候将其实例化为对象。

class myClass{

    function __construct(){
        add_action( \'init\', array( $this, \'someFun\' ) );
    }

    function someFun(){
        include( \'my-script.php\' );
    }

}
//instantiate an instance of myClass
new myClass();
然后,在我的脚本中。php,

class anotherClass{

    function __construct(){
        add_action( \'wp\', array( $this, \'moreFun\' ) );
    }

    function moreFun(){
        //do something.
    }

}
除了包含anotherClass. 更有趣的是,不会调用函数;其他事情都不会发生。

为了让它在wp中更加有趣,您还必须实例化另一个类,例如。

    function someFun(){
        include( \'my-script.php\' );
        new anotherClass();
    }
然而,这有什么意义呢?为什么要包含我的脚本。php在someFun中,当您可以在一开始就包含它,而不冒在其他地方丢失它的风险时?

我认为这样做的唯一原因是,如果你想对另一个类有不止一个定义(这通常是很糟糕的做法)。

最好这样做:

class pluginRootClass{

    function __construct(){
        //include all your class definitions
        include( \'my-script.php\' );
        include( \'scripty.php\' )

        //then do your actions
        add_action( \'init\', array( $this, \'someFun\' ) );
    }

    function someFun(){
        new anotherClass();
    }

}

//instantiate an instance of pluginRootClass
new pluginRootClass();
这样做效果更好,因为不可能意外地$x = new anotherClass(); 由于操作“init”(或任何操作)尚未激发而未定义其他类,因此破坏了一切。

此外,对于pluginRootClass,它有被多次实例化的风险。因此多次调用\\uu构造函数,从而多次包含相同的类定义,从而导致错误。因此,最好通过制作一个pluginRootClass的单例来阻止这种情况的发生。

function myPlugin(){
    //If object already exists return it, if not create it, save it and return it
    if( ! ( $ob = wp_cache_get( \'root\', \'plugin-namespace\' ) ) ){
        $ob = new pluginRootClass();
        wp_cache_set( \'root\', $ob, \'plugin-namespace\' );
    }
    return $ob;
}
myPlugin();
然后仅使用函数myPlugin调用该类。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴