web-dev-qa-db-ja.com

マルチサイトでプラグインがネットワークで有効化されている場合に有効化機能を実行する方法

私は自分のプラグインをマルチサイト互換にしようとしています。私はregister_activation_hook()関数を使用して、プラグインがアクティブになったときに実行する私のmy_activate()関数を登録します。これはシングルサイトインストールではうまく機能します。

function my_activate() {
    // Do some things.
}
register_activation_hook( __FILE__, 'my_activate' );

問題は、私のプラグインが「ネットワーク起動」されている場合、my_activate()が各サイトで実行されないことです。また、ネットワーク上に新しいサイトが作成されたときには実行されません。

ネットワーク内のすべてのサイトでプラグインがネットワークでアクティブ化されたときにアクティブ化ルーチンを a) に実行し、マルチサイトネットワーク上に新しいサイトが作成されたときに b) を実行する方法

10
henrywright

コールバック関数shouldは、プラグインがネットワークでアクティブ化されるか、単一のサイトでアクティブ化されるときに実行されます。いずれにせよ、動作するはずです。

ただし、ネットワーク内の各ブログに対してコールバックに含まれるコードを実行する場合は、これはそのままでは発生せず、代わりにコールバック内のコードがプライマリブログコンテキストで実行されることに注意してください。

ネットワークアクティベーション時に各ブログでコードを実行する必要がある場合:

function my_plugin_activate($network_wide) {

    if ( is_multisite() && $network_wide ) { 

        global $wpdb;

        foreach ($wpdb->get_col("SELECT blog_id FROM $wpdb->blogs") as $blog_id) {
            switch_to_blog($blog_id);
            //do your specific thing here...
            restore_current_blog();
        } 

    } else {
        //run in single site context
    }

}

register_activation_hook( __FILE__, 'my_plugin_activate' );

新しいブログの作成時にコードを実行する必要がある場合:

function my_plugin_new_blog($blog_id, $user_id, $domain, $path, $site_id, $meta) {

    //replace with your base plugin path E.g. dirname/filename.php
    if ( is_plugin_active_for_network( 'my-plugin-name-dir/my-plugin-name.php' ) ) {
        switch_to_blog($blog_id);
        //do your specific thing here...
        restore_current_blog();
    } 

}

add_action('wpmu_new_blog', 'my_plugin_new_blog', 10, 6 );

さらに:

同様の機能を必要としているが、ネットワークをアクティブにするすべてのプラグイン(該当する場合は、制御するプラグインだけでなく)の場合、ご覧ください: https://wordpress.org/plugins/proper-network-activation/ これにより、ネットワークがアクティブ化されているマルチサイトネットワーク内の各プラグインがregister_activation_hookおよびregister_deactivation_hookは、各ブログコンテキストで実行されます。

20
Adam