在多站点中卸载插件的脚本


9

我刚刚意识到,uninstall.php带有插件的传统文件无法在Multisite中使用。

if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) 
    exit();

delete_option( 'plugin_option_name' );

这不会删除所有wp_SITE-ID_options表中的子站点选项。

是否有执行此操作的标准方法?

Answers:


8

uninstall.php在我的硬盘中所有文件中进行搜索后,我发现两个文件具有以下功能is_multisite()用户角色编辑器将代码添加到Head

两者都使用$wpdb循环。简化:

<?php
/**
 * Plugin Uninstall Procedure
 */

// Make sure that we are uninstalling
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) 
    exit();

// Leave no trail
$option_name = 'plugin_option_name';

if ( !is_multisite() ) 
{
    delete_option( $option_name );
} 
else 
{
    global $wpdb;
    $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
    $original_blog_id = get_current_blog_id();

    foreach ( $blog_ids as $blog_id ) 
    {
        switch_to_blog( $blog_id );
        delete_option( $option_name );     

        // OR
        // delete_site_option( $option_name );  
    }

    switch_to_blog( $original_blog_id );
}

相关问答:卸载,激活,停用插件:典型功能和操作方法


1
您保留使用,restore_current_blog而不是存储当前博客ID并稍后再切换
Shea 2013年

@bungeshea,是的,更加优雅了:)我正要编辑答案,但我想知道:多站点uninstall.php不会总是从博客ID == 1运行吗?
brasofilo

您只能从网络上的仪表板,这是主要的网站上(博客ID 1)删除插件
牛油果

是的,当然,和,毕竟它的废话使用switch_to_blog(1)的时候,我们有restore_功能......不记得确切位置,我读了一些关于改变主博客实例...
brasofilo

您是否对此进行了彻底的测试?查看源代码,似乎uninstall.php只有在以下情况下才能调用插件中的文件:1)在激活插件之前就已存在该文件(如果这样,则插件名称将存储在博客的选项表中);2)get_option('uninstall_plugins')实际调用时会产生该特定插件。它似乎在Multisite上不起作用,因为网络范围内的插件信息存储在sitemeta表中。
Tomas Buteler
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.