Copot pemasangan skrip untuk plugin di Multisite

9

Saya baru menyadari bahwa uninstall.phpfile tradisional di sepanjang plugin tidak berfungsi di Multisite.

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

delete_option( 'plugin_option_name' );

Ini tidak menghapus opsi sub-situs di semua wp_SITE-ID_optionstabel.

Apakah ada cara standar untuk melakukan ini?

brasofilo
sumber

Jawaban:

8

Mencari di dalam semua uninstall.phpfile yang saya miliki di hard-drive saya, saya menemukan dua yang memiliki fungsi is_multisite(): User Role Editor dan Add Code to Head .

Keduanya menggunakan $wpdbloop. Sederhana:

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

T&J terkait: Copot pemasangan, Aktifkan, Nonaktifkan plugin: fitur khas & caranya

brasofilo
sumber
1
Anda lebih suka menggunakan restore_current_blogdaripada menyimpan id blog saat ini dan beralih kembali nanti
shea
@ Bungeshea, ya, jauh lebih elegan :) Saya akan mengedit Jawaban tetapi bertanya-tanya: Multisite uninstall.phptidak akan selalu berjalan dari blog ID == 1?
brasofilo
Anda hanya dapat menghapus plugin dari dasbor jaringan, yang ada di situs utama (blog id 1)
shea
Yap, tentu, dan, setelah semua, itu omong kosong menggunakan switch_to_blog(1)ketika kita memiliki restore_fungsi ... Jangan ingat persis di mana saya membaca sesuatu tentang mengubah contoh blog utama ...
brasofilo
Sudahkah Anda menguji ini secara menyeluruh? Melihat kode sumber, tampaknya uninstall.phpfile di dalam plugin hanya akan dipanggil jika 1) ada sebelum aktivasi plugin (jika demikian, nama plugin akan disimpan dalam tabel opsi blog); 2) saat menelepon get_option('uninstall_plugins')sebenarnya menghasilkan plugin tertentu. Tampaknya tidak berfungsi di Multisite karena info plugin seluruh jaringan disimpan dalam sitemetatabel, sebagai gantinya.
Tomas Buteler