当插件在多站点上被网络激活时如何运行激活功能?

时间:2015-03-14 作者:henrywright

我正在尝试使我的插件与多站点兼容。我正在使用register_activation_hook() 注册my的函数my_activate() 插件激活时要运行的函数。这在单站点安装上运行良好。

function my_activate() {
    // Do some things.
}
register_activation_hook( __FILE__, \'my_activate\' );
问题是,my_activate() 当我的插件为“网络激活”时,不会为每个站点运行。此外,在网络上创建新站点时,它不会运行。

如何使我的激活例程a) 在网络中所有站点的“我的插件”处于网络激活状态时运行,并且b) 在多站点网络上创建新站点时运行?

1 个回复
最合适的回答,由SO网友:Adam 整理而成

当插件被网络激活或为单个站点激活时,回调函数应该运行。无论哪种方式,它都应该起作用。

但是,如果您打算为网络中的每个博客运行回调中包含的代码,那么请注意,这不会在开箱即用的情况下发生,相反,回调中的代码将在主博客上下文中。

如果您的代码需要在网络激活时在每个博客上运行:

function my_plugin_activate($network_wide) {

    if ( is_multisite() && $network_wide ) { 

        foreach (get_sites([\'fields\'=>\'ids\']) 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) {

    //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\');

另外:

对于那些想要类似功能的读者,但是对于所有被网络激活的插件(不只是你控制的插件,如果适用的话),那么你可能希望看看:https://wordpress.org/plugins/proper-network-activation/ 这将确保网络激活的多站点网络中的每个插件register_activation_hookregister_deactivation_hook 在每个博客上下文中运行。

结束

相关推荐

Multisite Login problem

自从我将我的多站点网络从3.8升级到3.9后,我就无法通过主博客登录。它是一个子目录安装,而不是子域。当我尝试登录到主站点时:http://uspress.avenues.org/wp-login.php, 获取消息“此用户已选择删除其帐户,并且内容不再可用。”这不是真的。据我所知,你不能删除主网站,我已经检查了数据库,网站被设置为公共网站。如果转到子网站的登录页,我可以这样登录:http://uspress.avenues.org/kgarnier/wp-login.php主站点的主页是可以访问的,但是