检查依赖插件,如果为假,则不激活插件

时间:2015-05-23 作者:user1983017

我正在为WordPress创建一个插件,这个插件依赖于另一个具有特定版本的插件。如果我在没有依赖插件的情况下启用插件,则会出现致命错误。有没有办法检查这个?

我试图查看源代码,但WP没有为此提供任何挂钩。

提前谢谢。

--UPDATE--

我不是问如何检查插件安装或插件数据,但我想知道“如何检查是否存在依赖项,如果没有,则显示警告,不激活插件”。

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

今天早上,我在为我的插件AnsPress搜索相同的答案。所以我潜入WordPress插件wp-admin/includes/plugin.php 我有了一个主意。

WordPress在激活插件时检查致命错误,所以最简单的解决方案是触发致命错误,这将阻止WordPress激活插件。

在我下面的代码中,我检查插件文件是否存在,然后获取插件版本,如果低依赖版本触发错误。

function anspress_activate( $network_wide ) {
    //replace this with your dependent plugin
    $category_ext = \'categories-for-anspress/categories-for-anspress.php\';

    // replace this with your version
    $version_to_check = \'1.3.5\'; 

    $category_error = false;

    if(file_exists(WP_PLUGIN_DIR.\'/\'.$category_ext)){
        $category_ext_data = get_plugin_data( WP_PLUGIN_DIR.\'/\'.$category_ext);
        $category_error = !version_compare ( $category_ext_data[\'Version\'], $version_to_check, \'>=\') ? true : false;
    }   

    if ( $category_error ) {
        echo \'<h3>\'.__(\'Please update all AnsPress extensions before activating. <a target="_blank" href="http://anspress.io/questions/ask/">Ask for help</a>\', \'ap\').\'</h3>\';

        //Adding @ before will prevent XDebug output
        @trigger_error(__(\'Please update all AnsPress extensions before activating.\', \'ap\'), E_USER_ERROR);
    }
}

register_activation_hook(__FILE__, \'anspress_activate\');
这可能不是一个优雅的解决方案,但它确实有效。请随时更新此答案。

SO网友:db306

我遇到的最好的方法是基于Ian Dunn 插件。我为Wordpress编写了一个插件,它依赖于Woocommerce,随后也需要Woocommerce的特定版本。为了实现这一点,我编写了以下代码。重要的是要注意,这里回答您问题的重要性是require_once( ABSPATH . \'/wp-admin/includes/plugin.php\' ) ; 尽早调用此文件后,可以验证哪些插件处于活动状态以及这些插件的版本。下面是一个简短的演示:

define ( \'WCCF_NAME\', \'Woocommerce Plugin Example\' ) ;
define ( \'WCCF_REQUIRED_PHP_VERSION\', \'5.4\' ) ;                          // because of get_called_class()
define ( \'WCCF_REQUIRED_WP_VERSION\', \'4.6\' ) ;                          // because of esc_textarea()
define ( \'WCCF_REQUIRED_WC_VERSION\', \'2.6\' );                           // because of Shipping Class system


/**
 * Checks if the system requirements are met
 *
 * @return bool True if system requirements are met, false if not
 */
function wccf_requirements_met () {
    global $wp_version ;
    require_once( ABSPATH . \'/wp-admin/includes/plugin.php\' ) ;  // to get is_plugin_active() early

    if ( version_compare ( PHP_VERSION, WCCF_REQUIRED_PHP_VERSION, \'<\' ) ) {
        return false ;
    }

    if ( version_compare ( $wp_version, WCCF_REQUIRED_WP_VERSION, \'<\' ) ) {
        return false ;
    }

    if ( ! is_plugin_active ( \'woocommerce/woocommerce.php\' ) ) {
        return false ;
    }

    $woocommer_data = get_plugin_data(WP_PLUGIN_DIR .\'/woocommerce/woocommerce.php\', false, false);

    if (version_compare ($woocommer_data[\'Version\'] , WCCF_REQUIRED_WC_VERSION, \'<\')){
        return false;
    }

    return true ;
}

function wccf_requirements_error () {
    global $wp_version ;

    require_once( plugin_dir_path ( __FILE__ ) . \'/admin/partials/requirements-error.php\' ) ;
}

if ( wccf_requirements_met() ) {
    require_once( __DIR__ . \'/classes/wpps-module.php\' );
    require_once( __DIR__ . \'/classes/wordpress-plugin-skeleton.php\' );
    require_once( __DIR__ . \'/includes/admin-notice-helper/admin-notice-helper.php\' );
    require_once( __DIR__ . \'/classes/wpps-custom-post-type.php\' );
    require_once( __DIR__ . \'/classes/wpps-cpt-example.php\' );
    require_once( __DIR__ . \'/classes/wpps-settings.php\' );
    require_once( __DIR__ . \'/classes/wpps-cron.php\' );
    require_once( __DIR__ . \'/classes/wpps-instance-class.php\' );

    if ( class_exists( \'WordPress_Plugin_Skeleton\' ) ) {
        $GLOBALS[\'wccf\'] = WordPress_Plugin_Skeleton::get_instance();
        register_activation_hook(   __FILE__, array( $GLOBALS[\'wccf\'], \'activate\' ) );
        register_deactivation_hook( __FILE__, array( $GLOBALS[\'wccf\'], \'deactivate\' ) );
    }
} else {
    add_action( \'admin_notices\', \'wccf_requirements_error\' );
}

SO网友:dbmpls

经过测试,我发现雅利安人目前接受的答案没有检查依赖关系是否被激活,只有在它存在的情况下。

如果缺少依赖项,此解决方案将显示错误并停止激活,如果稍后停用,则会显示错误通知。

这使用内置的wordpress多站点功能

is_plugin_active_for_network($plugin)
但对于单站点,wordpress安装可以替代

is_plugin_active($plugin) 
如果依赖关系后来被停用,我还会在网络级别发布错误通知。使用挂钩:

 network_admin_notices
对于单站点wordpress,请使用

admin_notices
代码如下:

if ( ! function_exists( \'is_plugin_active_for_network\' ) ) {
    require_once( ABSPATH . \'/wp-admin/includes/plugin.php\' );
}

 // update to the plugin you are checking for

if ( ! is_plugin_active_for_network( \'acf-network-options-page/acf-network-options-page.php\' ) ) {
    function require_acf_network_plugin(){?>
        <div class="notice notice-error" >
            <p> Please Enable ACF Network Options Plugin before using CLN Admin Dashboard</p>
        </div><?php
     @trigger_error(__(\'Please Enable ACF Network Options Plugin before using CLN Admin Dashboard.\', \'cln\'), E_USER_ERROR);
    }

    add_action(\'network_admin_notices\',\'require_acf_network_plugin\');
    register_activation_hook(__FILE__, \'require_acf_network_plugin\');
}

SO网友:Pijush Gupta

这是我的简单解决方案。

add_action(\'plugins_loaded\', function () {

    require_once(ABSPATH . \'/wp-admin/includes/plugin.php\');

    if (!is_plugin_active(\'contact-form-7/wp-contact-form-7.php\')) {

          deactivate_plugins(\'my-plugin-folder/my-plugin-file.php\');

          add_action(\'admin_notices\', \'aavoya_admin_notice\');

    } else {

          require_once \'my-plugin-folder\' . \'/includes/index.php\';
    }

});

/**
 * aavoya_admin_notice
 *
 * @return void
 */
function aavoya_admin_notice()
{
    echo \'<div class="error"><p>Plugin deactivated. Please activate contact form 7 plugin!</p></div>\';
}

结束

相关推荐