Удалить скрипт для плагина в Multisite

9

Я только что понял, что традиционный uninstall.phpфайл для плагина не работает в Multisite.

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

delete_option( 'plugin_option_name' );

Это не удаляет опции под-сайтов во всех wp_SITE-ID_optionsтаблицах.

Есть ли стандартный способ сделать это?

brasofilo
источник

Ответы:

8

Поиск во всех uninstall.phpфайлах, которые у меня есть на жестком диске, я нашел два, которые имели функцию is_multisite(): редактор ролей пользователей и добавить код в голову .

Оба используют $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 );
}

Связанные вопросы и ответы: удаление, активация, деактивация плагина: типичные функции и инструкции

brasofilo
источник
1
Вы должны использовать restore_current_blogвместо сохранения текущего идентификатора блога и переключения позже
Shea
@bungeshea, да, намного элегантнее :) Я собирался редактировать ответ, но мне интересно: мультисайт uninstall.phpне всегда будет работать с идентификатором блога == 1?
brasofilo
Вы можете удалять только плагины с панели инструментов сети, которая находится на основном сайте (идентификатор блога 1)
Shea
Да, конечно, и, в конце концов, это бессмысленное использование, switch_to_blog(1)когда у нас есть restore_функция ... Не помню точно, где я читал об изменении основного экземпляра блога ...
brasofilo
Вы тщательно это проверили? Глядя на исходный код, кажется, что uninstall.phpфайл в плагине будет вызываться только в том случае, если 1) он существовал до активации плагинов (если это так, имя плагина будет храниться в таблице параметров блога); 2) при вызове get_option('uninstall_plugins')фактически выдает этот конкретный плагин. Похоже, он не работает на Multisite, потому что информация о плагине для всей сети хранится в sitemetaтаблице.
Томас Бутелер