Verifique o plugin dependente e, se falso, não ative o plugin

2

Estou criando um plugin para o WordPress e este plugin depende de outro plugin com uma versão específica. Se eu ativar meu plug-in sem o plugin dependente, haverá um erro fatal. Existe uma maneira de verificar isso?

Eu tentei olhar o código-fonte, mas o WP não fornece nenhum gancho para isso.

Obrigado antecipadamente.

- ATUALIZAÇÃO -

Eu não estou perguntando sobre como verificar o plugin instalado ou sobre os dados do plugin, mas eu quero saber "como verificar se o dependente existe e se não mostrar um aviso e não ativar o plugin".

    
por user1983017 23.05.2015 / 16:59

3 respostas

4

Eu estava procurando a mesma resposta esta manhã para o meu plugin AnsPress. Então eu me esgueirei para o plugin WordPress wp-admin/includes/plugin.php e tive uma idéia.

WordPress verifica se há erro fatal ao ativar o plugin, então a solução mais simples será disparar um erro fatal e isso impedirá que o WordPress ative o plug-in.

No meu código abaixo, verifico se existem arquivos de plugins e, em seguida, obtenho a versão do plug-in e, se o erro de acionamento da versão dependente for menor.

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');

Esta pode não ser uma solução elegante, mas funciona. fique à vontade para atualizar esta resposta.

    
por Aryan 23.05.2015 / 17:47
3

A melhor maneira que me deparei é baseada em Ian Dunn plugar. Eu escrevi um plugin para o Wordpress, que é dependente do Woocommerce e, posteriormente, requer uma versão específica do woocommerce também. Para conseguir isso, escrevi o seguinte código. É importante notar que a importância aqui, que responde à sua pergunta, é require_once( ABSPATH . '/wp-admin/includes/plugin.php' ) ; . Uma vez que você tenha chamado este arquivo cedo, você pode verificar quais plugins estão ativos e a versão de tais plugins. Aqui está uma breve demonstração:

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' );
}
    
por db306 13.11.2016 / 15:26
1

Após o teste, descobri que a resposta aceita atualmente por Aryan, não verifica se a dependência foi ativada, somente se ela existisse.

Esta solução mostrará um erro e interromperá a ativação se a dependência estiver ausente e mostrará um aviso de erro se for desativado posteriormente.

Isso usa a função multisite do wordpress integrada

is_plugin_active_for_network($plugin)

mas para instalações de wordpress de site único pode ser substituído por

is_plugin_active($plugin) 

Eu também posto um aviso de erro no nível da rede se a dependência for desativada posteriormente. Usando o gancho:

 network_admin_notices

Para o wordpress de site único, use

admin_notices

Este é o código:

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');
}
    
por dbmpls 21.11.2018 / 16:58