问题描述

我刚刚意识到,一个插件的传统 uninstall.php 文件在 Multisite 中不起作用。

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

delete_option( 'plugin_option_name' );

这不会删除所有 wp_SITE-ID_options 表中的 sub-sites 选项。

有没有一个标准的方法来做到这一点?

最佳解决方案

搜索我在我的 hard-drive 中的所有 uninstall.php 文件,我发现有两个功能 is_multisite()User Role EditorAdd Code to 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 );
}

相关问答答:Uninstall, Activate, Deactivate a plugin: typical features & how-to

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。