Jak wyłączyć wtyczkę obsługującą sieć tylko dla jednej witryny?

22

Jestem w trakcie konfigurowania (potencjalnie) dużej sieci wielostanowiskowej i staram się teraz maksymalnie ułatwić dodawanie i konfigurowanie witryn w razie potrzeby. Obecnie jestem w fazie, w której mam do czynienia z wtyczkami.

Dzięki usłudze Multisite wiem o kilku różnych sposobach aktywacji wtyczek

  • Włóż wtyczkę /plugins, aktywuj ją na każdej stronie osobno
  • Włóż wtyczkę /plugins, użyj „aktywacji sieci”, aby aktywować ją we wszystkich witrynach
  • Włóż wtyczkę /mu-plugins, aktywowaną automatycznie na każdej stronie

Teraz bawię się ustawieniami i chcę aktywować Akismet na wszystkich stronach oprócz jednej lub dwóch. Myślałem, że będę w stanie aktywować wtyczkę przez sieć, a następnie wyłączyć ją w pojedynczej witrynie, ale nie jestem w stanie tego zrobić - jeśli użyję aktywacji sieci, wówczas istnieje tylko opcja „dezaktywacji sieci” - która dezaktywuje wtyczkę wszystkie strony.

Czy istnieje sposób, aby aktywować przydatną funkcjonalność sieci, a mimo to nadal mieć wygodę dezaktywacji wtyczek dla poszczególnych witryn?

nikt
źródło

Odpowiedzi:

31

Możesz użyć filtra site_option_*.

Np. Następujące wyłączenie wyłączy akismet na blogu o 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
źródło
1
+1 za zapewnienie czystego rozwiązania na poziomie PHP, które rozwiązuje problem bez potrzeby instalowania dodatkowej wtyczki - ponieważ jestem maniakiem czystości i uwielbiam Wordpress tak czysty i bez wtyczek! :]
trejder
1
Upuściłem ten kod w pliku PHP mu-pluginsi działa jak sen!
bgallagh3r
Warto zauważyć, że tak naprawdę nie działa to w temacie. Trzeba go uruchomić wcześniej, więc wtyczki mu to świetne miejsce. Może działać jako wtyczka, ale strzeliłbym do wtyczek mu, jeśli to też nie zadziała.
Jake
1
Ponadto ten filtr jest uruchamiany DUŻO, przed rozbrojeniem sprawdziłbym, czy indeks w tablicy jest ustawiony. Po raz pierwszy będzie próbował na tablicy, w której ten element nie istnieje. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Nadal działa świetnie w wersji 4.9.4.
Jake
3

Ta wtyczka: http://firestats.cc/wiki/WPMUPluginCommander

omija elementy aktywacji sieci i działa samodzielnie. i pozwala wyłączyć wtyczkę dla poszczególnych witryn.

Aktualizacja: wygląda na to, że ta wtyczka psuje wtyczkę tagów sitewide, więc bądź ostrożny przed wypróbowaniem sieci produkcyjnej.

andrea_r
źródło
wordpress.org/plugins/plugin-commander - zmieniono adres URL. Chociaż ta wtyczka nie była aktualizowana od lat w tym momencie ...
Jake
3

Oto, co zadziałało dla mnie, aby wyłączyć wtyczkę dla jednego konkretnego motywu w instalacji na wielu serwerach / na wielu serwerach. Dodałem te kilka wierszy u góry pliku functions.php w moim motywie:

/**
 * 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' );
użytkownik33465
źródło
Jestem pewien, że będzie to działać tylko na wtyczkach mu, co jest dość ograniczające. Zrobiłbym to na init@GDR.
Jake
2

Aktywne wtyczki są przechowywane w opcjach wp_ [blog_id] _ w polu „active_plugins” i „active_sitewide_plugins” w wp_ [blog_id] _sitemeta. To są zserializowane pola, więc nie edytuj ich, chyba że wiesz, co robisz.

Zobacz także wp-admin \ plugin.php. Powinno być możliwe napisanie wtyczki, która zrobi co chcesz za pomocą funkcji tam zadeklarowanych, np. Is_plugin_active () i Activ_plugin ().

Jednak zakładam, że jesteś biegły w PHP, co może nie być prawdą.

codecowboy
źródło
2

Odpowiedzi od sorich87 i user33465 nie działały dla mnie w Wordpress 4.3. Dodanie tego do funkcji theme.php działało:

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' );
NRD
źródło
Mogę potwierdzić, że wcześniejsze sprawdzone rozwiązania już nie działają i że rozwiązanie @gdr faktycznie działa.
Mogę potwierdzić, że rozwiązanie @ sorich87 działa świetnie w 4.4.1. Nie używacie go w sposób, który najwyraźniej działa, ale nadal działa. Jednak prawdopodobnie może działać tylko w wtyczkach mu, a na pewno nie w temacie. Ta opcja będzie działać w motywach. Należy jednak pamiętać, że wymusza to dezaktywację wtyczki w porównaniu z sorich87, która po prostu przestaje narzucać ją na stronie, ale nadal pozwala na normalne korzystanie z niej w razie potrzeby. Wolę te ostatnie, ale oba mogą być przydatne.
Jake
Tak właściwie. Metoda rozwiązania @ sorich87 nie działa, jeśli Twoja witryna jest pierwszą witryną (ID: 1). W takim przypadku nie pozwoli Ci to na aktywację wtyczki przez sieć. Każdy inny identyfikator wydaje się działać.
Jake
I ta metoda robi to samo dla mnie. Nie możesz już aktywować wtyczek na stronie, jeśli jest to motywem witryny o ID = 1.
Jake
0

Nie w pudełku w WP 3, ale myślę, że byłoby możliwe zastąpienie opcji za pomocą filtrów Option_ *.

Byłoby również miło, gdybyś dodał sugestię jako żądanie funkcji w core.trac.wordpress.org.

Denis de Bernardy
źródło
-1

Udało mi się wyłączyć wtyczkę, ale nadal była tam na głównym panelu witryny. Jedynym rozwiązaniem, które udało mi się całkowicie usunąć z głównej strony, było sprawdzenie main.php wtyczki witryny i wyłączenie jej zgodnie z tym:

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
źródło