register_activation_hookでactivate_pluginが機能しない理由


10

最初のプラグインをアクティブにしながら、2番目のプラグインを自動的にアクティブにしようとしています。

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

register_activation_hook内では機能しません。次のように直接使用すると、機能します。

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

どうすれば修正できますか?手伝ってくれてありがとう

解決:

私は今これを自分のために使っています:

// 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');
        });
    }
}); 

私はもともとあなたの投稿を読み間違えました。私は言わなければならない、それは正しくフォーマットされています。この関数はプラグインのメインにありますか?
クリス

ちょっと待って。投稿を編集する必要があります。
クリス

はい、その第二のプラグインをアクティブ化しようとする最初のプラグインで...第二のプラグインは、一例としてhello.phpである
Ünsalコルクマズ

回答:


8

何が起こっているかの完全な説明については、この投稿を参照してください(これはプラグインを非アクティブ化するためのものですが、問題は同じです)。

簡単な説明:プラグインは、データベースに格納されているアクティブなプラグインの配列にプラグインを追加することにより、基本的にアクティブ化されます。最初のプラグインをアクティブ化すると、WordPressは現在アクティブなすべてのプラグインの配列を取得し、それにプラグインを追加します(ただし、まだデータベースを更新しません)。その後、インストールコールバックを実行します。

このインストールコールバックはコードを実行します。

その後、WordPressはデータベースを上記の配列で更新します。この配列には、最初のプラグインが含まれていますが、2番目のプラグインは含まれていません。したがって、2番目のプラグインがアクティブ化されていないようです。

解決策:上記のリンクで解決策は次のようなものです(試されていない):

//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);
}

時間があれば、質問を編集して、現在使用しているものを書きます。あなたはactivate_plugin($ dependent);を見ることができます; プラグインをアクティブにすると機能しません。それを修正する方法はありますか?
–ÜnsalKorkmaz 2012

コードをテストプラグインにコピーします(別のテストhello.phpテストプラグインを作成します-私には問題ありません)。プラグインがサブディレクトリに存在する場合は、フォルダを指定する必要があることに注意してくださいhello/hello.php
スティーブンハリス

私のコードは正常に動作します。次のactivate_plugin('hello.php');行に変更すると問題が始まりますactivate_plugin($dependent);
–nsal Korkmaz

これは、コールバックに指定された変数hello.phpが現在アクティブなプラグインの配列ではないためです。このようなコールバックに独自の変数を渡すことはできません。クラス/グローバル変数を使用しない限り、を使用する必要がありますactivate_plugin('hello.php');。しかし、それは問題ではありません...?
スティーブンハリス

よく私はたくさんの場所に同じ変数を書くのが好きではありません。しかし、大したことではありません。thxたくさん
–ÜnsalKorkmaz 2012

2

これが彼にとってうまくいかなかった理由と、activate_pluginメソッドをコピーして問題なく独自のカスタムメソッドを作成する方法を説明する人がいます:https : //stackoverflow.com/questions/1415958/how-to-ワードプレスプラグインを内部でアクティブ化

以下は、activate_pluginコードの元のソースです。これを使用して独自の関数を作成し、機能しない場所を確認できます。http//hitchhackerguide.com/2011/02/11/activate_plugin/

これは、他の誰かがおそらくそのソースコードから削った代替のプラグインアクティベーションメソッドを含む、可能な解決策です:コードを介してプラグインをアクティベートするには?


まだregister_activation_hookで働いていない、そのソリューション
Ünsalコルクマズ

幸いなことに、プラグインをアクティブ化するための独自の方法が用意できたので、プラグインをデバッグして、どこで正しく機能しないのかを理解できるはずです。:)デフォルトのメソッドの代わりにカスタムのactivate_pluginメソッドを使用するようにregister_activation_hookを変更しましたか?その場合は、いくつかのtrigger_errorステートメントをスローして、どこで失敗しているかを調べます。たとえば、開始に適した場所は、失敗したときにメソッドが返すものを見つけることです。
mltsy 2012

デバッグに最善を尽くしましたが、理由がわかりませんでした。多分、active_pluginsオプションは、register_activation_hookの実行後に更新されます。
Ünsalコルクマズ

すみません、交換した2つのリンク(最後の2つ)の順序を修正しました。「コードを介してプラグインをアクティブにする方法」というタイトルのリンクからコードを使用していますか?提供するもう1つの役立つヒントは、デフォルトのactivate_pluginメソッドの戻り値です。を使用trigger_errorして戻り値を検索し、ここに投稿できます。
mltsy 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.