マルチサイトでプラグインがネットワークでアクティブ化されたときにアクティベーション機能を実行する方法は?


12

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

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

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

アクティベーションルーチンをa)ネットワーク内のすべてのサイトでプラグインがネットワークでアクティベートされるときに実行し、b)マルチサイトネットワークで新しいサイトが作成されるときに実行するにはどうすればよいですか?

回答:


21

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

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

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

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_hookregister_deactivation_hook実行の両方を確実に実行するようにします。


ソリューションのおかげで、大歓迎です!最初の文に関して、質問の文言を少し更新しました。
ヘンリーライト

3
@henrywright register_activation_hookadd_action('activate_' . $file, $function)、それ自体が起動するラッパーでありdo_action( 'activate_' . $plugin, $network_wide )、変数$network_wideとその値の状態を確認できます。いずれか、trueまたはfalse常にコールバックへの引数として渡されます。したがって、register_activation_hookおよびregister_deactivation_hookラッパーでこの引数にアクセスできます。詳細については、activate_plugin内の関数を参照してくださいwp-admin/includes/plugin.php。お役に立てば幸いです。
アダム

1
説明を感謝し、あなたの答えに再び感謝します:)
henrywright

1
@ErenorPaz restore_current_blogforeachループ内にある必要があります。外部に配置した場合、たとえば10個のブログを反復(切り替え)すると、最後の呼び出しrestore_current_blogは元のブログではなく、最後に切り替えたブログを復元します(おそらく)あなたのメインサイト)。codex.wordpress.org/WPMU_Functions/restore_current_blog
アダム

1
@ErenorPazはコメントを削除する必要はありません。削除すると、チャットの履歴が読みにくくなります。たとえそれが正しくない場合でも、意見を述べることは間違っていません。誰もあなたを憎むつもりはありません。私たちはここでコミュニティを支援し、議論し、学び、視点を獲得しています。とにかくすべての良い...
アダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.