問題描述

我試圖使我的插件多站點兼容。我使用 register_activation_hook()功能來註冊我的 my_activate()功能,以在插件激活時運行。這在 single-site 安裝上運行良好。

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

問題是,當我的插件是’network activated’ 時,my_activate()不會為每個站點運行。此外,在網絡上創建新站點時,它不會運行。

如何讓我的激活程序 a) 當我的插件在網絡中的所有站點進行網絡激活時運行,以及 b) 在多站點網絡上創建新站點時運行?

最佳解決方案

您的回調函數應該在您的插件被網絡激活或為單個站點激活時運行。無論哪種方式,它應該是工作。

但是,如果您打算為您的網絡中的每個博客運行回調中包含的代碼,那麼請注意,這不會發生在開箱即用的情況下,您的回調中的代碼將在主要博客上下文中。

如果您的代碼需要在網絡激活時在每個博客上運行:

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 都在每個博客上下文中運行。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。