访问插件主类实例的子类

时间:2016-03-01 作者:W00tW00t111

在WordPress插件中,作者定义了父类,并使用标准实例方法供其他插件作者访问插件示例:

function WP_Plugin() {
     return WP_PLUGIN_NAME::instance();
}
__construct 在其他几个类上初始化该插件类的函数require\\u一次示例:

require_once( \'includes/class-wp-plugin-child-class.php\' );
该类还具有__construct 函数(在初始化主类时运行)。

问题是,从主类加载的其他类没有实例方法或任何直接访问它们的方式(我可以找到)

如何访问这些其他类中的任何函数/挂钩/等。当然不需要重新说明类别,即:

$subclass = new WpPluginChildClass();
将不起作用(它将触发所有__construct 函数等重新运行)。

<小时>Edit - 添加更多详细和精确的示例插件代码,尝试使用。

我在几个不同的较大插件中遇到过这种情况(尤其是与WooCommerce相关的插件)。目前我正在尝试的是一个付费插件,所以我觉得我只需负责包含与问题相关的内容:)

该插件使用单例实例化模式:

class WC_Freshdesk {
    protected static $instance = null;

    public static function get_instance() {
        // If the single instance hasn\'t been set, set it now.
        if ( null == self::$instance ) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}
__construct() 方法父类包括多个文件。其中之一是儿童班。

class WC_Freshdesk_Integration extends WC_Integration {
    public function __construct() {
        add_action( \'woocommerce_view_order\', array( $this, \'view_order_create_ticket\' ), 40 );
    }
}
我正在尝试访问add\\u操作,以将其从主题模板中删除。

我尝试了以下方法:

$freshdesk = WC_Freshdesk::get_instance();

remove_action( \'woocommerce_view_order\', array( $freshdesk, \'view_order_create_ticket\', 40 ) );
那里没有骰子。

然后尝试时:

$freshdesk = new WC_Freshdesk_Integration();

remove_action( \'woocommerce_view_order\', array( $freshdesk, \'view_order_create_ticket\', 40 ) );
显然,我最终重新声明了WC\\u Freshdesk\\u integration()类,因为add\\u操作挂钩运行了两次。

访问此子类以删除该操作的正确方法是什么?

1 个回复
SO网友:Adam

如果你想了解WC_Freshdesk 实例而不重新实例化,然后调用:

$integrations = WC()->integrations->get_integrations();

remove_action(\'woocommerce_view_order\', array($inegrations[\'wc-freshdesk\'], view_order_create_ticket\'), 40 ); 
注:我只是在猜测wc-freskdesk, 否则检查阵列

呼叫WC()->integrations->get_integrations() 返回在woocommerce初始化过程早期实例化的所有集成,如果您知道id 的集成。

您将发现id 扩展的类中的类属性WC_Integration, 在这种情况下WC_Freshdesk_Integration.