問題描述

我試圖使我的外掛多站點相容。我使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。