Cum se dezactivează un plugin activat la nivel de rețea doar pentru un singur site?
Sunt în procesul de configurare a unei rețele multisite (potențial) mare și încerc să fac cât mai ușor posibil procesul de adăugare și configurare a site-urilor atunci când este necesar. În prezent, sunt în faza în care mă ocup de plugin-uri.
Cu multisite, cunosc mai multe modalități diferite prin care poți activa plugin-urile:
- Pune plugin-ul în
/plugins
, activează-l pe fiecare site individual - Pune plugin-ul în
/plugins
, folosește 'network activate' pentru a-l activa pe toate site-urile - Pune plugin-ul în
/mu-plugins
, activat automat pe fiecare site
Acum, m-am jucat cu setările și vreau să activez Akismet pe toate site-urile cu excepția unuia sau două. Am crezut că voi putea activa plugin-ul la nivel de rețea și apoi să-l dezactivez pe un singur site, dar nu pot face acest lucru - dacă folosesc activarea la nivel de rețea, există doar opțiunea de 'network deactivate' - care dezactivează plugin-ul pe toate site-urile.
Există vreo modalitate de a avea funcționalitatea utilă a activării la nivel de rețea, dar în același timp să păstrez convenabilitatea de a putea dezactiva plugin-urile site cu site?

Puteți utiliza filtrul site_option_*
.
De exemplu, următorul cod va dezactiva Akismet pe blogul cu ID-ul 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 pentru oferirea unei soluții curate la nivel de PHP care rezolvă problema în cauză fără a fi nevoie să instalezi un plugin suplimentar -- pentru că sunt un maniac al purității și iubesc WordPress cât mai curat și fără plugin-uri! :]

Am pus acest cod într-un fișier PHP în mu-plugins
și funcționează perfect!

Este bine de știut că acest lucru nu va funcționa cu adevărat într-o temă. Trebuie rulat mai devreme, așa că mu-plugins este un loc minunat pentru asta. S-ar putea să funcționeze ca un plugin, dar aș opta pentru mu-plugins dacă nici asta nu funcționează.

De asemenea, acest filtru este rulat FOARTE DES, aș recomanda să verifici dacă indexul din array este setat înainte de a-l elimina. După prima rulare, va încerca în continuare pe un array în care acel element nu mai există. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }

De fapt. Această metodă nu funcționează dacă site-ul tău este primul site (ID: 1). În acest caz, nu îți va permite să activezi plugin-ul în rețea. Orice alt ID pare să funcționeze.

Încă puțin încercare și eroare. Dacă dezactivezi pe site-ul cu ID = 1, le poți activa la nivelul întregii rețele, dar nu vor apărea ca activate la nivel global în setările de rețea. Totuși, ar trebui să fie active pe site-uri. Salvarea setărilor plugin-urilor la nivel global ar putea să le dezactiveze din nou... Nu sunt sigur.

Se pare că nu mai funcționează. Plugin-ul apare ca dezactivat în lista de plugin-uri, dar în continuare rulează normal.

Acest plugin: http://firestats.cc/wiki/WPMUPluginCommander
ocolește activarea în rețea și își face propria activare. De asemenea, îți permite să dezactivezi pluginul pe fiecare site individual.
Actualizare: Se pare că acest plugin intră în conflict cu pluginul sitewide tags, așa că fiți atenți înainte de a-l încerca pe o rețea de producție.

https://wordpress.org/plugins/plugin-commander/ - URL-ul s-a schimbat. Deși acest plugin nu a mai fost actualizat de ani de zile până acum...

Iată ce a funcționat pentru mine pentru a dezactiva un plugin pentru o anumită temă într-o instalație multisite / multiteme. Am adăugat aceste câteva linii la începutul fișierului functions.php din tema mea:
/**
* Dezactivează pluginul fancybox pentru această temă, deoarece strică javascript-ul
*/
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' );

Plugin-urile active sunt stocate în tabelul wp_[blog_id]_options în câmpurile 'active_plugins' și 'active_sitewide_plugins' din wp_[blog_id]_sitemeta. Acestea sunt câmpuri serializate, așa că nu le editați decât dacă știți ce faceți.
De asemenea, aruncați o privire la wp-admin\plugin.php. Ar trebui să fie posibil să scrieți un plugin care să facă ceea ce doriți folosind funcțiile declarate acolo, cum ar fi is_plugin_active() și activate_plugin().
Totuși, presupun că sunteți priceput în PHP, ceea ce poate să nu fie cazul.

Răspunsurile de la sorich87 și user33465 nu au funcționat pentru mine în WordPress 4.3. Adăugând acest cod în functions.php al temei a funcționat:
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' );

Pot confirma că soluțiile votate anterior nu mai funcționează și că soluția propusă de @gdr funcționează într-adevăr.

Pot confirma că soluția lui @sorich87 funcționează excelent în versiunea 4.4.1. Pare că voi nu o folosiți într-un mod corect, dar ea încă funcționează. Totuși, probabil că poate funcționa doar în mu-plugins și cu siguranță nu în tema. Această opțiune va funcționa în teme. Dar rețineți că aceasta forțează dezactivarea unui plugin, în timp ce soluția lui sorich87 doar oprește forțarea acestuia pe site, dar încă permite utilizarea lui normal dacă se dorește. Prefer ultima variantă, dar ambele pot fi utile.

De fapt, metoda soluției lui @sorich87 nu funcționează dacă site-ul tău este primul site (ID: 1). În acest caz, nu îți va permite să activezi plugin-ul în rețea. Orice alt ID pare să funcționeze.

Cel mai bun mod de a gestiona toate pluginurile într-o rețea Multisite este „Plugin Commander”, pe care îl puteți găsi aici: http://wordpress.org/extend/plugins/plugin-commander/

Am reușit să dezactivez plugin-ul, dar acesta era încă prezent în panoul principal al site-ului. Singura soluție pe care am găsit-o pentru a-l elimina complet de pe site-ul principal a fost să verific în fișierul principal.php al plugin-ului și să-l dezactivez conform acestuia:
global $current_blog;
// Disponibil doar pentru site-ul B
if( $current_blog->blog_id == 2 ) {
define( 'AB_PATH', __DIR__ );
include_once 'includes.php';
// Încărcare funcționalități plugin
AB_Plugin::registerHooks();
is_admin() ? new AB_Backend() : new AB_Frontend();
}
