问题描述

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