Deinstallieren Sie das Skript für ein Plugin in Multisite

9

Ich habe gerade festgestellt, dass die herkömmliche uninstall.phpDatei entlang eines Plugins in Multisite nicht funktioniert.

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

delete_option( 'plugin_option_name' );

Dadurch werden die Unterwebsites nicht in allen wp_SITE-ID_optionsTabellen gelöscht .

Gibt es einen Standardweg dafür?

brasofilo
quelle

Antworten:

8

Beim Durchsuchen aller uninstall.phpDateien auf meiner Festplatte habe ich zwei gefunden, die die Funktion hatten is_multisite(): Benutzerrollen-Editor und Code zum Kopf hinzufügen .

Beide verwenden eine $wpdbSchleife. Vereinfacht:

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

Verwandte Fragen und Antworten: Ein Plugin deinstallieren, aktivieren, deaktivieren: typische Funktionen und Anleitungen

brasofilo
quelle
1
Sie sollten verwenden, restore_current_bloganstatt die aktuelle Blog-ID zu speichern und später zurückzuschalten
shea
@bungeshea, ja, viel eleganter :) Ich wollte gerade die Antwort bearbeiten, frage mich aber: Multisite uninstall.phpwird nicht immer von der Blog-ID == 1 ausgeführt?
Brasofilo
Sie können Plugins nur aus dem Netzwerk-Dashboard löschen, das sich auf der Hauptseite befindet (Blog-ID 1)
shea
Ja, sicher, und schließlich ist es Unsinn, switch_to_blog(1)wenn wir die restore_Funktion haben ... Erinnern Sie sich nicht genau, wo ich etwas über das Ändern der Haupt-Blog-Instanz gelesen habe ...
brasofilo
Haben Sie das gründlich getestet? Wenn man sich den Quellcode ansieht, scheint es, dass die uninstall.phpDatei in einem Plugin nur aufgerufen wird, wenn 1) sie vor der Aktivierung des Plugins existiert (wenn ja, wird der Name des Plugins in der Optionstabelle des Blogs gespeichert); 2) Wenn Sie aufrufen, erhalten Sie get_option('uninstall_plugins')tatsächlich dieses spezifische Plugin. Auf Multisite scheint dies nicht zu funktionieren, da stattdessen netzwerkweite Plugin-Informationen in der sitemetaTabelle gespeichert sind .
Tomas Buteler