Verifique el complemento dependiente y si es falso, no active el complemento

2

Estoy creando un complemento para WordPress y este complemento depende de otro complemento con una versión específica. Si habilito mi complemento sin un complemento dependiente, hay un error fatal. ¿Hay alguna manera de verificar esto?

Intenté buscar en el código fuente pero WP no proporciona ningún enlace para esto.

Gracias de antemano.

--UPDATE--

No pregunto sobre cómo verificar el complemento instalado o sobre los datos del complemento, pero quiero saber "cómo verificar si existe un dependiente y si no aparece una advertencia y no activar el complemento".

    
pregunta user1983017 23.05.2015 - 16:59

3 respuestas

4

Estaba buscando la misma respuesta esta mañana para mi complemento AnsPress. Así que me colé en el plugin de WordPress wp-admin/includes/plugin.php y se me ocurrió una idea.

WordPress comprueba si hay errores fatales al activar el complemento, por lo que la solución más simple provocará un error fatal y esto evitará que WordPress active el complemento.

En mi código de abajo, compruebo si existen archivos de complemento, luego obtengo la versión del complemento y si la versión dependiente más baja genera un error.

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

Esto puede no ser una solución elegante pero funciona. no dude en actualizar esta respuesta.

    
respondido por el Aryan 23.05.2015 - 17:47
3

La mejor manera en que me he encontrado está basada en Ian Dunn enchufar. Escribí un complemento para Wordpress que depende de Woocommerce y, posteriormente, también requiere una versión específica de woocommerce. Para lograr esto, he escrito el siguiente código. Es importante tener en cuenta que la importancia aquí, que responde a su pregunta, es la de require_once( ABSPATH . '/wp-admin/includes/plugin.php' ) ; . Una vez que haya llamado a este archivo antes, puede verificar qué complementos están activos y la versión de dichos complementos. Aquí hay una breve demostración:

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

Después de la prueba, encontré que la respuesta actualmente aceptada por Aryan no comprobó si la dependencia estaba activada, solo si existía.

Esta solución mostrará un error y detendrá la activación si falta la dependencia, y mostrará un aviso de error si se desactiva más tarde.

Esto utiliza la función multisitio de wordpress integrada

is_plugin_active_for_network($plugin)

pero para las instalaciones de WordPress de un solo sitio se podrían sustituir

is_plugin_active($plugin) 

También publico un aviso de error a nivel de red si la dependencia se desactiva más tarde. Usando el gancho:

 network_admin_notices

Para wordpress de un solo sitio, en lugar de utilizar

admin_notices

Aquí está el 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');
}
    
respondido por el dbmpls 21.11.2018 - 16:58

Lea otras preguntas en las etiquetas