如何让一个插件需要另一个插件?

时间:2013-12-28 作者:kosinix

我正在构建一个插件,为主插件添加额外功能。理想情况下,在插件管理屏幕中,应禁用“激活”链接,并添加一条内联注释,告知用户在使用当前插件之前先安装并激活主插件。

4 个回复
最合适的回答,由SO网友:kosinix 整理而成

谢谢大家的回答。虽然这两个答案都让我走上了正确的道路,但没有一个是现成的。因此,我在下面分享我的解决方案。

方法1-使用register\\u activation\\u挂钩:

在插件/父插件/父插件中创建父插件。php:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件/子插件/子插件中创建子插件。php:

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
register_activation_hook( __FILE__, \'child_plugin_activate\' );
function child_plugin_activate(){

    // Require parent plugin
    if ( ! is_plugin_active( \'parent-plugin/parent-plugin.php\' ) and current_user_can( \'activate_plugins\' ) ) {
        // Stop activation redirect and show error
        wp_die(\'Sorry, but this plugin requires the Parent Plugin to be installed and active. <br><a href="\' . admin_url( \'plugins.php\' ) . \'">&laquo; Return to Plugins</a>\');
    }
}
注意,我没有使用deactivate_plugins( $plugin ); 由于某种原因,它不起作用。因此,我使用wp\\u die取消激活重定向并通知用户。

Advantage:

<简单的解决方案,与方法2相比不会产生额外的db命中

Disadvantages:

<如果使用插件管理屏幕中的复选框同时激活父插件和子插件,wp\\U die屏幕仍然会显示

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件/子插件/子插件中创建子插件。php:

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
add_action( \'admin_init\', \'child_plugin_has_parent_plugin\' );
function child_plugin_has_parent_plugin() {
    if ( is_admin() && current_user_can( \'activate_plugins\' ) &&  !is_plugin_active( \'parent-plugin/parent-plugin.php\' ) ) {
        add_action( \'admin_notices\', \'child_plugin_notice\' );

        deactivate_plugins( plugin_basename( __FILE__ ) ); 

        if ( isset( $_GET[\'activate\'] ) ) {
            unset( $_GET[\'activate\'] );
        }
    }
}

function child_plugin_notice(){
    ?><div class="error"><p>Sorry, but Child Plugin requires the Parent plugin to be installed and active.</p></div><?php
}

Advantage:

<当您使用复选框同时激活父插件和子插件时,ul>
  • 工作

    Disadvantage:

    • 会导致额外的db点击,因为插件实际上首先被激活,一旦admin\\u init运行就会被停用
    至于我关于禁用激活链接的问题,我可以使用:

    add_filter( \'plugin_action_links\', \'disable_child_link\', 10, 2 );
    function disable_child_link( $links, $file ) {
    
        if ( \'child-plugin/child-plugin.php\' == $file and isset($links[\'activate\']) )
            $links[\'activate\'] = \'<span>Activate</span>\';
    
        return $links;
    }
    
    然而,事实证明这是非常不切实际的,因为没有地方放置此代码。我无法将其放在父插件上,因为父插件应该处于活动状态才能运行此代码。当然不属于子插件或函数。php。所以我放弃了这个想法。

  • SO网友:vovafeldman

    这两种建议的解决方案都有缺陷。

    Method 1: 如上所述,当父插件和子插件使用插件管理屏幕中的复选框同时激活时,wp\\u die()屏幕仍将显示。

    Method 2: 在某些用例中,这并不好,因为“admin\\u init”是在“plugins\\u load”之后执行的(https://codex.wordpress.org/Plugin_API/Action_Reference), 卸载挂钩之后(https://codex.wordpress.org/Function_Reference/register_uninstall_hook). 因此,例如,如果我们确实希望加载项在卸载时运行一些代码,无论父插件是否处于活动状态,这种方法将不起作用。

    Solution:

    首先,我们需要将以下代码附加到父插件的主PHP文件的末尾:

    do_action( \'my_plugin_loaded\' );
    
    这将向所有订阅者发送事件/信号,告知核心插件已加载。

    然后,外接程序的类应该如下所示:

    class My_Addon
    {
        static function init ()
        {
            register_activation_hook( __FILE__, array( __CLASS__, \'_install\' ) );
    
            if ( ! self::_is_parent_active_and_loaded() ) {
                return;
            }
        }
    
        #region Parent Plugin Check
    
        /**
         * Check if parent plugin is activated (not necessarly loaded).
         *
         * @author Vova Feldman (@svovaf)
         *
         * @return bool
         */
        static function _is_parent_activated()
        {
            $active_plugins_basenames = get_option( \'active_plugins\' );
            foreach ( $active_plugins_basenames as $plugin_basename ) {
                if ( false !== strpos( $plugin_basename, \'/my-plugin-main-file.php\' ) ) {
                    return true;
                }
            }
    
            return false;
        }
    
        /**
         * Check if parent plugin is active and loaded.
         *
         * @author Vova Feldman (@svovaf)
         *
         * @return bool
         */
        static function _is_parent_active_and_loaded()
        {
            return class_exists( \'My_Plugin\' );
        }
    
        /**
         *
         * @author Vova Feldman (@svovaf)
         */
        static function _install()
        {
            if ( ! self::_is_parent_active_and_loaded() ) {
                deactivate_plugins( basename( __FILE__ ) );
    
                // Message error + allow back link.
                wp_die( __( \'My Add-on requires My Plugin to be installed and activated.\' ), __( \'Error\' ), array( \'back_link\' => true ) );
            }
        }
    
        #endregion Parent Plugin Check
    }
    
    if (My_Addon::_is_parent_active_and_loaded())
    {
        // If parent plugin already included, init add-on.
        My_Addon::init();
    }
    else if (My_Addon::_is_parent_activated())
    {
        // Init add-on only after the parent plugins is loaded.
        add_action( \'my_plugin_loaded\', array( __CLASS__, \'init\' ) );
    }
    else
    {
        // Even though the parent plugin is not activated, execute add-on for activation / uninstall hooks.
        My_Addon::init();
    }
    
    希望有帮助:)

    SO网友:MrJustin

    试试这个,它的评论,所以这应该有助于你理解它。

    <?php
    register_activation_hook( __FILE__, \'myplugin_activate\' ); // Register myplugin_activate on
    function myplugin_activate() {
        $plugin = plugin_basename( __FILE__ ); // \'myplugin\'
        if ( is_plugin_active( \'plugin-directory/first-plugin.php\' ) ) {
            // Plugin was active, do hook for \'myplugin\'
        } else {
            // Plugin was not-active, uh oh, do not allow this plugin to activate
            deactivate_plugins( $plugin ); // Deactivate \'myplugin\'
        }
    }
    ?> 
    
    如果出现错误,您还可以检查“myplugin”的“option”,并将其设置为false或not activated。

    SO网友:Amir Hossein Hossein Zadeh

    我想你需要TGM Plugin Activation.

    TGM Plugin Activation 是一个PHP库,允许您轻松地为WordPress主题(和插件)要求或推荐插件。它允许您的用户使用原生WordPress类、函数和接口以单数或批量方式安装、更新甚至自动激活插件。您可以引用捆绑的插件、WordPress插件库中的插件,甚至是internet上其他地方托管的插件。

    结束

    相关推荐