问题描述
我试图使我的插件多站点兼容。我使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。