如何正确地在主插件之后插入一个插件?

时间:2017-12-20 作者:J.BizMai

我正在写一个插件,它有一个主要的插件依赖项。我使用POO-so类和名称空间来实现这一点。

我想在主插件之后加载一个插件,并在适当的时候进行一些检查和正确初始化。

我找到了一个awful solution 是为了检查主插件是否处于非活动状态is_plugin_inactive. 这个解决方案的问题是您需要一个钩子,以便稍后加载加载项并创建其他问题-例如:当您想要使用wp_ajax_

 namespace MyPlugin;

 class AddonMainClass{

     public function __construct(){
         $this->init(); //<-- Option 1
         add_action(\'admin_init\',  array( $this , \'init\' ) ); //<-- Option 2
         add_action(\'_admin_menu\',  array( $this , \'init\' ) ); //<-- Option 3 
     }

     public function init(){
         if( is_admin() ){
            if ( is_plugin_inactive( \'main-plugin/MainPlugin.php\' ) ) {
               // admin notices    
            }else{
               // Init the addon 
            }
         }
     }
 }

Problems with each option

<选项1:无法使用函数is\\u plugin\\u inactive(),我不确定之前是否加载了主插件add_action( \'admin_menu\', array( $this, \'load_view_page\')); 在我的主插件内的类中显示所有菜单项_admin_menu 初始化我的插件似乎为时已晚,因此它会干扰一些钩子加载,如wp_ajax_my_function.

正确执行此操作的最佳方法是什么?

1 个回复
最合适的回答,由SO网友:J.BizMai 整理而成

我找到的最佳解决方案是……:

在初始化加载项之前检查主插件是否处于活动状态wp_ajax_my_function使用挂钩plugins_loaded 初始化加载项

使用函数签入纯PHPclasses, functionsconstants 从主插件here

 namespace MyPlugin;

 class AddonMainClass{

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

     public function init(){
         if( is_admin() ){
              $is_main_plugin_active = $this->detect_plugin(
                array(
                      \'classes\' => array(   
                              \'MyPlugin\\\\Common\\\\ClassA\',
                              \'MyPlugin\\\\Common\\\\ClassB\'
                      ),
                      \'functions\' => array(
                              \'MyPlugin\\\\useful_function\'
                      ),
                      \'constants\' => array(
                              \'MyPlugin\\\\PLUGIN_DOMAIN\'
                      )
                )
            );
            if ( ! $is_main_plugin_active ) {
               // admin notices    
            }else{
               // Init the addon 
            }
         }
     }
     
     private function detect_plugin( $plugins ) {

         /** Check for classes */
         if ( isset( $plugins[\'classes\'] ) ) {
             foreach ( $plugins[\'classes\'] as $name ) {
                if ( class_exists( $name ) )
                    return true;
             }
        }

        /** Check for functions */
        if ( isset( $plugins[\'functions\'] ) ) {
            foreach ( $plugins[\'functions\'] as $name ) {
                if ( function_exists( $name ) )
                    return true;
            }
        }

        /** Check for constants */
        if ( isset( $plugins[\'constants\'] ) ) {
            foreach ( $plugins[\'constants\'] as $name ) {
                if ( defined( $name ) )
                    return true;
            }
        }

        /** No class, function or constant found to exist */
        return false;

    }

}

结束

相关推荐