web-dev-qa-db-ja.com

別のプラグインを無効にしたらプラグインを無効にする

別のプラグインの無効化コードでプラグインを無効にすることが可能かどうか疑問に思いますか?

IEです。私は 'マスター'プラグインがアクティブになっていない場合は機能しません独自のプラグインを介して追加しているウィジェットがあります...

1
Peter Gibbons

はい、 最初のプラグインに無効化フック を登録し、このフック内で deactivate_plugins() 関数を使用して2番目のプラグインを無効にします。

0
onetrickpony

注:これを書いた後、私はtracチケットを提出しました。 このチケットはすでに存在していたということです

@ OneTrickPonyの答えは形式的にはうまくいきませんでした、そしてソースを調べた後(特に deactivate_plugins() )私はその理由を見つけました:

BがAに依存し、Aがユーザーによって無効にされたとしましょう。 WordPressはdeactivate_plugins(A)を呼び出します。

この関数は以下のことを行います。

  1. 現在アクティブなすべてのプラグインを取得します。]
  2. いくつかのチェックを実行します(たとえば、プラグインAは実際にアクティブになっていますか?)
  3. この配列からAを削除します
  4. フックdeactivate_A(これはregister_deactivation_hookを使ってフックします)を起動します。
  5. 配列をデータベースに更新します。

今度はステップ4で、無効にするためにdeactivate_plugins(B)を呼び出します。同じプロセスが再び起こり、完了しました - それで大丈夫です。しかし、それが完了したら、(元のdeactivate_plugins()のAの呼び出しで)ステップ5に進みます。配列はデータベースに更新されます - しかし、この配列はステップ1で検索された最初のもので、Aだけが削除されています。特に、Bがまだアクティブだったときに最初にそれを取得したので、Bが含まれています。

注:WordPressを介しても、無効化コールバックは起動されますが、次回ページが読み込まれたときには有効になっています。

ソリューション

解決策は、(オプションが更新された後で)後でフックを使用することです。これには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