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


12

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

function my_activate() {
    // Do some things.
}
register_activation_hook( __FILE__, 'my_activate' );

问题是,my_activate()当我的插件被“网络激活”时,不是每个站点都运行。另外,在网络上创建新站点时,它不会运行。

如何使我的激活例程正常运行:a)为网络中的所有站点都对我的插件进行网络激活时运行,以及b)在多站点网络上创建新站点时运行?

Answers:


21

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

但是,如果您打算为网络中的每个博客运行包含在回调中的代码,那么请注意,这并非开箱即用,而是您的回调中的代码将在主博客上下文中运行。

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

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运行。


感谢您的解决方案,非常感谢!关于您的第一句话,我对问题的措词进行了略微更新。
henrywright

3
@henrywright register_activation_hook只是一个包装器,add_action('activate_' . $file, $function)其本身将在其上触发,do_action( 'activate_' . $plugin, $network_wide )您可以查看该包装器的变量$network_wide及其值状态,true或之一false始终作为参数传递给回调。因此,您可以在register_activation_hookregister_deactivation_hook包装器中访问此参数。有关更多信息,请参见中的activate_plugin功能wp-admin/includes/plugin.php。希望能有所帮助。
亚当

1
感谢您的解释,并再次感谢您的回答:)
henrywright

1
@ErenorPaz restore_current_blog必须处于foreach循环中,因为如果将其放在外面,然后迭代(切换)到10个博客,则对的最后一次调用restore_current_blog将还原您切换到的最后一个博客,而不是您最初启动的原始博客(大概是您的主站点)。codex.wordpress.org/WPMU_Functions/restore_current_blog
亚当

1
@ErenorPaz无需删除评论,这样做会使聊天记录让人难以阅读。给出意见是正确的,即使它可能是不正确的。没有人为此感到讨厌,我们在这里是一个社区,可以帮助,讨论,学习和获取观点。无论如何,一切都很好……
亚当
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.