マルチサイトのプラグインのアンインストールスクリプト


9

uninstall.phpプラグインに沿った従来のファイルがマルチサイトで機能しないことに気づきました。

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

delete_option( 'plugin_option_name' );

これにより、すべてのwp_SITE-ID_optionsテーブルのサブサイトオプションが削除されるわけではありません。

これを行うための標準的な方法はありますか?

回答:


8

すべての内部で検索uninstall.php私は私のハードドライブに、私は機能を持っていた2を発見したしたことをファイルis_multisite()ユーザロールエディタ頭にコードを追加します

どちらも$wpdbループを使用します。簡略化:

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

関連するQ&A:プラグインのアンインストール、アクティブ化、非アクティブ化:典型的な機能とハウツー


1
restore_current_blog現在のブログIDを保存して後で切り替えるのではなく、使用を保留します
shea

@bungeshea、はい、はるかにエレガントです:)私は回答を編集しようとしていましたが、疑問に思っています:マルチサイトuninstall.phpは常にブログID == 1から実行されるわけではありませんか?
ブラソフィロ2013年

メインサイト(ブログID 1)にあるネットワークダッシュボードからのみプラグインを削除できます
shea

ええ、確かに、そして結局のところ、関数switch_to_blog(1)がある場合の使用はナンセンスrestore_です...メインのブログインスタンスの変更について何かを読んだ場所を正確に思い出さないでください...
brasofilo

これを徹底的にテストしましたか?ソースコードを見ると、uninstall.phpプラグイン内のファイルは、1)プラグインがアクティブ化される前に存在した場合にのみ呼び出されるように見えます(存在する場合、プラグイン名はブログのオプションテーブルに保存されます)。2)get_option('uninstall_plugins')実際に呼び出すと、特定のプラグインが生成されます。sitemeta代わりに、ネットワーク全体のプラグイン情報がテーブルに格納されているため、マルチサイトでは機能しないようです。
Tomas Buteler 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.