問題描述
我試圖使我的插件多站點兼容。我使用 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_hook 和 register_deactivation_hook 都在每個博客上下文中運行。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。