Wie deaktiviere ich ein netzwerkfähiges Plugin für nur eine Site?

22

Ich bin gerade dabei, ein (potenziell) großes Netzwerk mit mehreren Standorten einzurichten und möchte es jetzt so einfach wie möglich machen, Standorte bei Bedarf hinzuzufügen und zu konfigurieren. Ich bin gerade in der Phase, in der ich mich mit Plugins befasse.

Bei multisite sind mir verschiedene Möglichkeiten bekannt, wie Sie Plugins aktivieren können

  • Setzen Sie das Plugin ein /plugins, aktivieren Sie es auf jeder Seite einzeln
  • Setzen Sie das Plugin ein /pluginsund aktivieren Sie es mit "Netzwerk aktivieren" auf allen Websites
  • Setzen Sie das Plugin ein /mu-plugins, das auf jeder Seite automatisch aktiviert wird

Jetzt habe ich mit den Einstellungen gespielt und möchte Akismet auf allen Websites aktivieren, außer auf den ein oder anderen. Ich dachte, ich könnte das Plugin über ein Netzwerk aktivieren und dann auf einer einzelnen Site deaktivieren, aber ich kann dies nicht. Wenn ich die Netzwerkaktivierung verwende, gibt es nur die Option "Netzwerk deaktivieren", mit der das Plugin für alle deaktiviert wird Alle Standorte.

Gibt es eine Möglichkeit, die praktische Funktionalität des Netzwerks zu aktivieren und dennoch die Möglichkeit zu haben, Plugins Site für Site zu deaktivieren?

niemand
quelle

Antworten:

31

Sie können den Filter verwenden site_option_*.

Das Folgende deaktiviert zB akismet auf einem Blog mit der ID 2.

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;
}
sorich87
quelle
1
+1 für die Bereitstellung einer sauberen Lösung auf PHP-Ebene, die das betreffende Problem löst, ohne dass ein zusätzliches Plugin installiert werden muss. :]
trejder
1
Wir haben diesen Code in einer PHP-Datei abgelegt mu-pluginsund arbeiten wie ein Traum!
bgallagh3r
Gut zu wissen, dass dies in einem Thema nicht wirklich funktioniert. Es muss früher ausgeführt werden, daher sind mu-plugins ein großartiger Ort dafür. Es könnte als Plugin laufen, aber ich würde nach mu-Plugins suchen, wenn das auch nicht funktioniert.
Jake
1
Auch dieser Filter wird eine Menge ausgeführt, ich würde überprüfen, ob der Index im Array gesetzt ist, bevor Sie es deaktivieren. Nach dem ersten Mal wird weiterhin versucht, ein Array zu bearbeiten, in dem dieses Element nicht vorhanden ist. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Dies funktioniert immer noch gut auf 4.9.4.
Jake
3

Dieses Plugin: http://firestats.cc/wiki/WPMUPluginCommander

Umgeht die Netzwerkaktivierung und erledigt ihre eigenen Aufgaben. und lässt Sie das Plugin Site für Site deaktivieren.

Update: Wie es aussieht, bricht dieses Plugin das Sitewide-Tag-Plugin. Seien Sie also vorsichtig, bevor Sie es in einem Produktionsnetzwerk versuchen.

andrea_r
quelle
wordpress.org/plugins/plugin-commander - URL geändert. Obwohl dieses Plugin seit Jahren nicht mehr aktualisiert wurde ...
Jake
3

Hier ist, was für mich funktioniert hat, um ein Plugin für ein bestimmtes Thema auf einer Multisite / Multitheme-Installation zu deaktivieren. Ich habe diese paar Zeilen oben in der Datei functions.php in meinem Theme eingefügt:

/**
 * 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' );
user33465
quelle
Ich bin mir ziemlich sicher, dass dies nur bei mu-Plugins funktioniert, was ziemlich einschränkend ist. Ich würde das initgerne auf @GDR machen.
Jake
2

Die aktiven Plugins werden in den Optionen wp_ [blog_id] _ im Feld 'active_plugins' und 'active_sitewide_plugins' in wp_ [blog_id] _sitemeta gespeichert. Dies sind serialisierte Felder. Bearbeiten Sie sie daher nur, wenn Sie wissen, was Sie tun.

Schauen Sie sich auch wp-admin \ plugin.php an. Es sollte möglich sein, ein Plugin zu schreiben, das mit den dort deklarierten Funktionen funktioniert, zB is_plugin_active () und activate_plugin ().

Ich gehe jedoch davon aus, dass Sie PHP beherrschen, was möglicherweise nicht der Fall ist.

Codecowboy
quelle
2

Die Antworten von sorich87 und user33465 haben bei mir mit Wordpress 4.3 nicht funktioniert. Fügte dies zu den functions.php des Themas hinzu:

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' );
DDR
quelle
Ich kann bestätigen, dass die zuvor hochgeladenen Lösungen nicht mehr funktionieren und dass die Lösung von @gdr tatsächlich funktioniert.
Ich kann bestätigen, dass die Lösung von @ sorich87 in 4.4.1 hervorragend funktioniert. Ihr benutzt es nicht so, wie es anscheinend funktioniert, aber es funktioniert immer noch. Allerdings kann es wahrscheinlich nur in mu-Plugins und definitiv nicht im Theme funktionieren. Diese Option funktioniert in Themen. Beachten Sie jedoch, dass dies ein deaktiviertes Plugin gegenüber sorich87 erzwingt, das es einfach nicht mehr auf der Site erzwingt, aber dennoch die normale Verwendung zulässt, falls dies gewünscht wird. Ich bevorzuge letzteres, aber beide könnten nützlich sein.
Jake
Tatsächlich. Die Lösungsmethode von @ sorich87 funktioniert nicht, wenn Ihre Site die erste Site ist (ID: 1). In diesem Fall können Sie das Plugin nicht über das Netzwerk aktivieren. Jede andere ID scheint zu funktionieren.
Jake
Und diese Methode macht das gleiche für mich. Sie können das / die Plugin (s) nicht mehr für die gesamte Website aktivieren, wenn dies im Design für die Website unter ID = 1 enthalten ist.
Jake,
0

Nicht out of the box in WP 3, aber ich denke, es wäre möglich, die Option mithilfe der option_ * -Filter zu überschreiben.

Außerdem wäre es nett, wenn Sie den Vorschlag als Funktionsanforderung in core.trac.wordpress.org hinzufügen würden.

Denis de Bernardy
quelle
-1

Ich habe es geschafft, das Plugin zu deaktivieren, aber es war immer noch auf der Hauptseite. Die einzige Lösung, die ich gefunden habe, um es vollständig von der Hauptseite zu entfernen, war, die main.php des Plugins der Webseite zu überprüfen und es danach zu deaktivieren:

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();

}
NetOholik
quelle