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?

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

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

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

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ą.


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

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.



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

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.