Pourquoi activate_plugin ne fonctionne pas dans register_activation_hook


10

J'essaie d'activer le deuxième plugin automatiquement lors de l'activation du 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 à l'intérieur de register_activation_hook .. Son fonctionne si je l'utilise directement comme:

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

Comment puis-je le réparer? 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');
        });
    }
}); 

J'ai mal lu votre message à l'origine. Je dois dire que c'est formaté correctement. Cette fonction est-elle au cœur de votre plugin?
Chris

Juste une seconde. Besoin de modifier mon message.
Chris

oui c'est dans le premier plugin qui essaye d'activer le deuxième plugin .. le deuxième plugin est hello.php comme exemple
Ünsal Korkmaz

Réponses:


8

Pour une explication complète de ce qui se passe, consultez cet article (c'est pour 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 de 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 pas le deuxième plug-in. Ainsi, votre deuxième plug-in ne semble pas être activé.

Solution: a mentionné dans le lien ci-dessus la solution est quelque chose comme 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);
}

Si vous avez le temps, je modifie ma question pour écrire ce que j'utilise maintenant. Vous pouvez voir activate_plugin ($ dependant); ne fonctionne pas lors de l'activation du plugin. Une idée de comment résoudre ce problème?
Ünsal Korkmaz

Copier votre code dans un plug-in de test (et créer un autre hello.phpplug-in de test - cela fonctionne très bien pour moi). N'oubliez pas que si les plug-ins existent dans un sous-répertoire, vous devrez donner le dossier: par exemple hello/hello.php.
Stephen Harris

mon code fonctionnera normalement .. le problème démarre lorsque vous changez de activate_plugin('hello.php');ligne avecactivate_plugin($dependent);
Ünsal Korkmaz

C'est parce que la variable donnée à votre rappel n'est pas hello.phpmais le tableau des plug-ins actuellement actifs. Vous ne pouvez pas passer vos propres variables à des rappels comme ça. À moins que vous n'utilisiez des variables de classe / globales que vous devrez utiliser activate_plugin('hello.php');. Mais cela ne devrait pas être un problème ...?
Stephen Harris du

eh bien je n'aime pas écrire les mêmes variables dans beaucoup de place tbh. mais ce n'est pas un gros problème. merci beaucoup
Ünsal Korkmaz

2

Voici quelqu'un expliquant pourquoi cela ne fonctionnait pas pour lui, et comment il a dû copier la méthode activate_plugin et en créer une personnalisée sans problème: /programming/1415958/how-to- 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 pour vous: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Voici une solution possible, contenant une méthode alternative d'activation de plugin que quelqu'un d'autre a probablement tailladée à partir de ce code source: Comment activer des plugins via le code?


cette solution ne fonctionne toujours pas dans register_activation_hook
Ünsal Korkmaz

Eh bien, heureusement, maintenant que vous avez votre propre méthode pour activer un plugin, vous devriez pouvoir le déboguer et comprendre où il échoue, n'est-ce pas? :) Avez-vous changé votre register_activation_hook pour utiliser votre méthode activate_plugin personnalisée au lieu de celle par défaut? Si c'est le cas, ajoutez quelques instructions trigger_error et découvrez où cela échoue. Par exemple, un bon point de départ serait de découvrir ce que votre méthode retourne en cas d'échec.
mltsy

J'ai fait de mon mieux pour le débogage mais je n'ai pas trouvé de raison. Peut-être que l'option active_plugins est mise à jour après l'exécution de register_activation_hook.
Ünsal Korkmaz

Je suis désolé, je viens de corriger l'ordre des deux liens que j'avais échangés (les deux derniers). Utilisez-vous le code du lien intitulé "Comment activer le plug-in via le code?" Une autre indication utile à fournir serait la valeur de retour de la activate_pluginméthode par défaut . Vous pouvez utiliser trigger_errorpour trouver la valeur de retour et la publier ici.
mltsy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.