【问题标题】:Extend Wordpress Plugin Class扩展 Wordpress 插件类
【发布时间】:2017-03-31 19:59:33
【问题描述】:

我对 OOP 很陌生,学习了基本的思想和逻辑,现在想扩展一个不打算扩展它的 wordpress 插件(据我所知):

class Main_Plugin {
    ...
    function __construct() {
        add_action('admin_notice', array($this, 'somefunction');
    }
    ...
}
enter code here
new Main_plugin

到目前为止一切顺利。现在是我的自定义插件的代码:

class Custom_Plugin extends Main_Plugin {
    ...
}
new Custom_Plugin

据我了解,“主”插件的对象和我的“子”插件一样被初始化,这意味着admin_notice

有什么方法可以正确创建“子”插件,以便“主”插件运行,而我的自定义插件只是添加了一些额外的功能?

【问题讨论】:

    标签: php wordpress class oop extend


    【解决方案1】:

    如果您使用class_exists 来检查主插件类是否存在,您实际上不需要扩展Main_Plugin 类。

     if(class_exists('Main_Plugin')){
          new Custom_Plugin;
     }
    

    您可以拆分主类,一个用于每次加载所需的内容,一个用于扩展。


    编辑:

    还有其他方法可以触发其他类中的一些自定义数据

    Main_Plugin 中,您可以定义自己的操作/过滤器或使用现有的:

     $notice_message = apply_filters('custom_notice', $screen, $notice_class, $notice_message);// you need to define parameters before
    

    在任何自定义插件中,您都可以轻松挂钩 $notice_message:

    public function __construct(){
        add_filter('custom_notice', array($this, 'get_notice'), 10, 3); 
    }
    public function get_notice($screen, $notice_class, $notice_message){
        $notice_message = __('New notice', 'txt-domain');
        return $notice_message;
    }
    

    【讨论】:

    • 好的,但是如果主程序包含另一个函数,例如:if ( $pagenow === 'wp-login.php' ) { global $error, $interim_login, $action, $user_login; @require_once ABSPATH . 'wp-login.php'; die; },因为我的插件在主程序之后运行,所以无法更改此行为,对吧?如果情况不符合我的条件,我将不得不编写一个在主插件之前运行的插件,并让主插件完成其余的工作?
    • 是的,这就是我告诉你分班的原因
    • 好的,谢谢。即使我不想更改原始插件(更新覆盖等),这对我有帮助。
    【解决方案2】:

    您的想法是正确的,但在 Wordpress 中,最好不要使用相同的操作名称来制作不同的插件。随意扩展 Main_Plugin 类,但请将您的操作名称更改为另一个名称并在您的模板中使用它。因此,您的代码将如下所示:

    class Custom_Plugin extends Main_Plugin {
        function __construct() {
          add_action('admin_notice_v2', array($this, 'somefunction');
        }
    }
    new Custom_Plugin
    

    如果您想完全覆盖之前的操作,请删除之前的操作并按照此处所述添加您的操作:https://wordpress.stackexchange.com/questions/40456/how-to-override-existing-plugin-action-with-new-action 如果您想扩展操作,则只需从您的操作中调用父操作

    【讨论】:

    • 对不起,但我认为这对我没有帮助……插件不会影响我的模板,在我看来,wordpress 动作挂钩应该被多次使用。让我换个方式解释一下:我可以使用 remove_action 函数来阻止我的插件显示主插件的 admin_notive 两次。但是所有其他功能将再次运行,因为主插件的对象在我的插件之前初始化,对吗?有没有办法扩展主插件并单独初始化扩展对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多