web-dev-qa-db-fra.com

Pourquoi activate_plugin ne fonctionne pas dans register_activation_hook

J'essaie d'activer le second plugin automatiquement tout en activant le premier plugin.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

Son ne fonctionne pas dans register_activation_hook .. Son fonctionnement si je l'utilise directement comme:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

Comment puis-je résoudre ce problème? Merci pour l'aide

Solution:

J'utilise ceci pour moi maintenant:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 
10
Ünsal Korkmaz

Pour une explication complète de ce qui se passe, voir cet article (il s’agit de désactiver les plug-ins, mais le problème est le même).

Une brève explication: Les plug-ins sont essentiellement activés en les ajoutant au tableau des pug-ins actifs stockés dans la base de données. Lorsque vous activez le premier plug-in, WordPress récupère le tableau de tous les plug-ins actuellement actifs, y ajoute le plug-in (mais ne met pas encore à jour la base de données), puis exécute votre rappel d'installation.

Ce rappel d'installation exécute votre code.

Après cela, WordPress met à jour la base de données avec le tableau ci-dessus, qui contient le premier mais non deuxième plug-in. Ainsi, votre deuxième plug-in semble ne pas être activé.

Solution: a mentionné dans le lien ci-dessus, la solution ressemble à ceci (non testé):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}
8
Stephen Harris

Voici quelqu'un qui explique pourquoi cela ne fonctionnait pas pour lui et comment il a dû copier la méthode activate_plugin et créer son propre compte sans le problème: https://stackoverflow.com/questions/1415958/how- activer-wordpress-plugins en interne

Voici la source originale du code activate_plugin, que vous pouvez utiliser pour créer votre propre fonction et voir où cela ne fonctionne pas: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Voici une solution possible, contenant une méthode d'activation de plug-in alternative que quelqu'un d'autre a probablement retirée de ce code source: Comment activer des plug-ins via du code?

2
mltsy