web-dev-qa-db-de.com

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

Ich bin gerade dabei, ein (potenziell) großes Netzwerk mit mehreren Standorten einzurichten, und ich 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

  • Stecke das Plugin in /plugins, aktiviere es auf jeder Seite einzeln
  • Setzen Sie das Plugin in /plugins und aktivieren Sie es mit 'network activate' auf all sites
  • Setzen Sie das Plugin in /mu-plugins ein, das auf jeder Site automatisch aktiviert wird

Jetzt spiele ich mit den Einstellungen und möchte Akismet auf allen Sites aber eins oder zwei aktivieren. 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?

21
nobody

Sie können den Filter site_option_* verwenden.

Z.B. Das Folgende deaktiviert akismet auf 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;
}
28
sorich87

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' );
3
user33465

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.

3
andrea_r

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, z. is_plugin_active () und activate_plugin ().

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

2
codecowboy

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' );
2
GDR

Nicht sofort 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.

0

Der bessere Weg, alle Plugins in Multisite Network zu handhaben, ist "Plugin Commander", den Sie hier finden: http://wordpress.org/extend/plugins/plugin-commander/

0
user4051