Désinstaller le script d'un plugin dans Multisite

9

Je viens de réaliser que le uninstall.phpfichier traditionnel avec un plugin ne fonctionne pas dans Multisite.

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

delete_option( 'plugin_option_name' );

Cela ne supprime pas les options de sous-sites dans toutes les wp_SITE-ID_optionstables.

Existe-t-il un moyen standard de procéder?

brasofilo
la source

Réponses:

8

En recherchant dans tous les uninstall.phpfichiers que j'ai sur mon disque dur, j'en ai trouvé deux qui avaient la fonction is_multisite(): Éditeur de rôle d'utilisateur et Ajouter du code à la tête .

Les deux utilisent une $wpdbboucle. Simplifié:

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

Questions et réponses connexes: Désinstaller, activer, désactiver un plugin: fonctionnalités typiques et procédures

brasofilo
la source
1
Vous devez utiliser restore_current_blogau lieu de stocker l'identifiant de blog actuel et de revenir plus tard
shea
@bungeshea, oui, beaucoup plus élégant :) J'étais sur le point de modifier la réponse mais je me demande: le multisite uninstall.phpne fonctionnera pas toujours à partir de l'ID du blog == 1?
brasofilo
Vous ne pouvez supprimer que les plugins du tableau de bord du réseau, qui se trouve sur le site principal (blog id 1)
shea
Oui, bien sûr, et, après tout, c'est un non-sens d'utiliser switch_to_blog(1)quand nous avons la restore_fonction ... Je ne me souviens pas exactement où j'ai lu quelque chose sur le changement de l'instance principale du blog ...
brasofilo
L'avez-vous testé à fond? En regardant le code source, il semblerait que le uninstall.phpfichier dans un plugin ne soit appelé que si 1) il existait avant l'activation des plugins (si c'est le cas, le nom du plugin serait stocké dans la table d'options du blog); 2) lors de l'appel get_option('uninstall_plugins')donne en fait ce plugin spécifique. Cela ne semble pas fonctionner sur Multisite car les informations sur le plugin à l'échelle du réseau sont sitemetaplutôt stockées dans le tableau.
Tomas Buteler