Desinstalar script para um plug-in no Multisite

9

Acabei de perceber que o uninstall.phparquivo tradicional ao longo de um plugin não está funcionando no Multisite.

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

delete_option( 'plugin_option_name' );

Isso não exclui as opções de subsite em todas as wp_SITE-ID_optionstabelas.

Existe uma maneira padrão de fazer isso?

brasofilo
fonte

Respostas:

8

Pesquisando em todos os uninstall.phparquivos que tenho no meu disco rígido, encontrei dois que tinham a função is_multisite(): Editor de Função de Usuário e Adicionar Código à Cabeça .

Ambos usam um $wpdbloop. Simplificado:

<?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 );
}

Perguntas e respostas relacionadas: Desinstalar, ativar, desativar um plug-in: recursos típicos e instruções

brasofilo
fonte
1
Você shold usar restore_current_blogem vez de armazenar a corrente id blog e comutação de volta mais tarde
karité
@bungeshea, sim, muito mais elegante :) Eu estava prestes a editar a resposta, mas estou pensando: o multisite uninstall.phpnem sempre será executado a partir do ID do blog == 1?
brasofilo
Você só pode excluir plugins do painel de rede, que está no site principal (id blogue 1)
karité
Sim, com certeza, e, afinal de contas, é um absurdo usar switch_to_blog(1)quando temos a restore_função de ... não me lembro exatamente onde eu li algo sobre como alterar a instância principal do blog ...
brasofilo
Você já testou isso completamente? Observando o código-fonte, parece que o uninstall.phparquivo em um plug-in seria chamado apenas se 1) existisse antes da ativação dos plug-ins (se houver, o nome do plug-in seria armazenado na tabela de opções do blog); 2) ao chamar, get_option('uninstall_plugins')na verdade, produz esse plug-in específico. Parece que não funciona no Multisite porque as informações de plug-in em toda a rede são armazenadas na sitemetatabela.
Tomas Buteler