1つのサイトのネットワーク対応プラグインを無効にする方法は?


22

私は(潜在的に)大規模なマルチサイトネットワークのセットアップを進めていますが、必要に応じてサイトを追加して構成することをできる限り簡単にすることを目指しています。現在、私はプラグインを扱っている段階にいます。

マルチサイトでは、プラグインをアクティブにするいくつかの異なる方法を認識しています

  • プラグインを入れて、/pluginsすべてのサイトで個別に有効にします
  • プラグインを入れて、/plugins「network activate」を使用してすべてのサイトでプラグインをアクティブにします
  • プラグインをに入れて、/mu-pluginsすべてのサイトで自動的にアクティブ化されます

今、私は設定でプレーしてきたと私はすべてのサイトにアキスメットをアクティブにしたいが、 1または2。プラグインをネットワークでアクティブにしてから単一のサイトで無効にできると思っていましたが、それを行うことはできません-ネットワークをアクティブにする場合は、「ネットワークを無効にする」オプションのみがあり、プラグインを無効にしますすべてのサイト。

ネットワークの便利な機能を有効にする方法はありますが、それでもサイトごとにプラグインを無効にできるという便利さがありますか?

回答:


31

フィルターを使用できますsite_option_*

たとえば、次のコードはID 2のブログでakismetを無効にします。

add_filter('site_option_active_sitewide_plugins', 'modify_sitewide_plugins');

function modify_sitewide_plugins($value) {
    global $current_blog;

    if( $current_blog->blog_id == 2 ) {
        unset($value['akismet/akismet.php']);
    }

    return $value;
}

1
追加のプラグインをインストールすることなく問題の問題を解決するクリーンなPHPレベルのソリューションを提供するための+1-私は純粋なマニアであり、可能な限りクリーンでプラグインのないWordpressが大好きだからです!:]
trejder

1
このコードをPHPファイルにドロップしmu-plugins、夢のように動作します!
bgallagh3r

これは、テーマでは実際には機能しないことに注意してください。早めに実行する必要があるため、mu-pluginsは最適な場所です。プラグインとして実行される可能性がありますが、それが機能しない場合は、muプラグインを使用します。
ジェイク

1
また、このフィルターはLOTを実行します。設定を解除する前に、配列内のインデックスが設定されているかどうかを確認します。初回以降、そのアイテムが存在しない配列で試行し続けます。if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
ジェイク

1
これはまだ4.9.4でうまく機能しています。
ジェイク

3

このプラグイン:http : //firestats.cc/wiki/WPMUPluginCommander

ネットワークアクティベーションをバイパスし、独自の処理を行います。サイトごとにプラグインを無効にできます。

更新:このプラグインはサイト全体のタグプラグインを壊すように見えるので、実稼働ネットワークで試す前に注意してください。


wordpress.org/plugins/plugin-commander-URLが変更されました。このプラグインはこの時点で何年も更新されていませんが
ジェイク

3

マルチサイト/マルチテーマのインストールで特定のテーマのプラグインを無効にするために私が働いたのは次のとおりです。テーマのfunctions.phpファイルの先頭にこれらの数行を追加しました。

/**
 * Disable fancybox plugin for this theme, it breaks javascript
 */
function deactivate_plugin_conditional() {
    if ( is_plugin_active('fancybox-for-wordpress/fancybox.php') ) {
        deactivate_plugins('fancybox-for-wordpress/fancybox.php');
    }
}
add_action( 'muplugins_loaded', 'deactivate_plugin_conditional' );

これはmuプラグインでのみ機能することはかなり確信していますが、これはかなり制限されています。init@GDRのようにこれを行います。
ジェイク

2

アクティブなプラグインは、wp_ [blog_id] _sitemetaの 'active_plugins'および 'active_sitewide_plugins'フィールドのwp_ [blog_id] _optionsに保存されます。これらはシリアル化されたフィールドなので、何をしているのかわからない限り編集しないでください。

また、wp-admin \ plugin.phpもご覧ください。そこに宣言されている関数(is_plugin_active()やactivate_plugin()など)を使用して、必要な処理を実行するプラグインを作成できるはずです。

ただし、PHPに習熟していることを前提としていますが、そうでない場合もあります。


2

sorich87とuser33465からの回答は、Wordpress 4.3では機能しませんでした。これをテーマのfunctions.phpに追加するとうまくいきました:

function deactivate_plugin_conditional() {
    $deactivated_plugin_name = 'lazy-load/lazy-load.php';
    deactivate_plugins($deactivated_plugin_name, false, true);
}
add_action( 'init', 'deactivate_plugin_conditional' );

以前の投票されたソリューションが機能しなくなり、@ gdrによるソリューションが実際に機能することを確認できます。

@ sorich87のソリューションが4.4.1でうまく機能することを確認できます。皆さんは、明らかに機能する方法でそれを使用していませんが、それでも機能します。ただし、おそらくmuプラグインでのみ機能し、テーマでは機能しません。このオプションはテーマで機能します。ただし、これによりプラグインが強制的に非アクティブ化され、vs sorich87'sになり、サイト上でプラグインが強制的に停止されますが、必要に応じて通常どおり使用できます。私は後者を好むが、両方とも有用かもしれない。
ジェイク

実際に。サイトが最初のサイト(ID:1)の場合、@ sorich87の解決方法は機能しません。その場合、プラグインをネットワークアクティベートすることはできません。その他のIDは機能しているようです。
ジェイク

そして、この方法は私にとって同じことをします。これは、ID = 1で、サイトのテーマになっている場合は、もはやプラグイン(S)サイト全体を活性化させることはできません
ジェイク

0

WP 3ではすぐに使用できますが、option_ *フィルターを使用してオプションをオーバーライドすることは可能だと思います。

また、core.trac.wordpress.orgで機能のリクエストとして提案を追加した場合も便利です。



-1

プラグインを無効にすることはできましたが、メインサイトパネルにはまだありました。メインサイトから完全に削除することがわかった唯一の解決策は、サイトのプラグインのmain.phpを確認し、それに応じて無効にすることでした。

global $current_blog;

// Only available to B
if( $current_blog->blog_id == 2 ) {


    define( 'AB_PATH', __DIR__ );

    include_once 'includes.php';

    //  plugin loaded stuff

    AB_Plugin::registerHooks();

    is_admin() ? new AB_Backend() : new AB_Frontend();

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.