web-dev-qa-db-fra.com

Désactiver le plugin lors de la désactivation d'un autre plugin

Vous vous demandez s'il est possible de désactiver un plugin dans le code de désactivation d'un autre plugin?

C'EST À DIRE. J'ai un widget que j'ajoute via son propre plugin qui ne fonctionnera pas si le plugin 'master' n'est pas activé ...

1
Peter Gibbons

Oui, enregistrez un hook de désactivation dans votre premier plugin et, à l'intérieur de ce hook, désactivez le 2nd plugin à l'aide de la fonction deactivate_plugins()

0
onetrickpony

Remarque: Après avoir écrit ceci, j'ai soumis un ticket de traçage, mais on m'a dit que celui-ci existait déjà .

@ La réponse de OneTrickPony n'a pas fonctionné, et après avoir inspecté le source (spécifiquement deactivate_plugins() ) J'ai trouvé pourquoi:

Supposons que B dépend de A et que A soit désactivé par l'utilisateur. WordPress appelle deactivate_plugins(A).

Cette fonction a les effets suivants:

  1. Obtient tous les plugins actifs en cours.]
  2. Effectue certaines vérifications (le plugin A est-il réellement actif?)
  3. Supprime A de ce tableau
  4. Déclenche le hook deactivate_A (auquel nous raccrochons en utilisant register_deactivation_hook)
  5. Met à jour le tableau dans la base de données.

Maintenant, à l'étape 4, nous appelons deactivate_plugins(B) pour le désactiver. Le même processus se répète et est terminé - c'est bien. Mais une fois que nous avons terminé, nous passons à l’étape 5 (dans le deactivate_plugins() original, appelez A). Le tableau est mis à jour dans la base de données - mais ce tableau était le très original récupéré à l'étape 1 et A n'a été supprimé. En particulier, nous l'avons récupéré au début, alors que B était toujours actif, et il contient donc B.

Remarque: vos rappels de désactivation sont déclenchés, même si WordPress pense toujours être actif au prochain chargement de la page.

La solution

La solution consiste à utiliser un hook ultérieur (après la mise à jour de l'option). Pour cela, nous pouvons tirer parti du hook update_option_{$option}:

//This goes inside Plugin A.
//When A is deactivated. Deactivate B.
  register_deactivation_hook(__FILE__,'my_plugin_A_deactivate'); 
  function my_plugin_A_deactivate(){
     $dependent = 'B/B.php';
     if( is_plugin_active($dependent) ){
          add_action('update_option_active_plugins', 'my_deactivate_dependent_B');
     }
   }

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