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.