Desinstalar script para un complemento en Multisitio

9

Me acabo de dar cuenta de que el uninstall.phparchivo tradicional junto con un complemento no funciona en Multisite.

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

delete_option( 'plugin_option_name' );

Esto no elimina las opciones de subsitios en todas las wp_SITE-ID_optionstablas.

¿Hay una forma estándar de hacer esto?

brasofilo
fuente

Respuestas:

8

Al buscar dentro de todos los uninstall.phparchivos que tengo en mi disco duro, encontré dos que tenían la función is_multisite(): Editor de roles de usuario y Agregar código al encabezado .

Ambos usan un $wpdbbucle. 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 );
}

Preguntas y respuestas relacionadas: Desinstalar, activar, desactivar un complemento: características típicas y procedimientos

brasofilo
fuente
1
Debe usar en restore_current_bloglugar de almacenar la identificación actual del blog y volver a cambiar más tarde
Shea
@bungeshea, sí, mucho más elegante :) Estaba a punto de editar la respuesta, pero me pregunto: ¿Multisitio uninstall.phpno se ejecutará siempre desde el ID de blog == 1?
brasofilo
Solo puede eliminar complementos del panel de la red, que se encuentra en el sitio principal (blog id 1)
shea
Sí, claro, y, después de todo, no tiene sentido usar switch_to_blog(1)cuando tenemos la restore_función ... No recuerdo exactamente dónde leí algo sobre cómo cambiar la instancia principal del blog ...
brasofilo
¿Has probado esto a fondo? Al uninstall.phpobservar el código fuente, parecería que el archivo dentro de un complemento solo se llamaría si 1) existiera antes de la activación de los complementos (de ser así, el nombre del complemento se almacenaría en la tabla de opciones del blog); 2) cuando se llama en get_option('uninstall_plugins')realidad produce ese complemento específico. No parece funcionar en Multisitio porque la información del complemento de toda la red se almacena en la sitemetatabla.
Tomas Buteler