Come disabilitare un plugin abilitato a livello di rete per un solo sito?
Sono nel processo di configurazione di una rete multisite (potenzialmente) grande e sto cercando di rendere il più semplice possibile l'aggiunta e la configurazione dei siti quando necessario. Attualmente sono nella fase in cui mi sto occupando dei plugin.
Con il multisite sono consapevole di diversi modi in cui è possibile attivare i plugin:
- Inserire il plugin in
/plugins
, attivarlo su ogni sito individualmente - Inserire il plugin in
/plugins
, utilizzare 'attivazione di rete' per attivarlo su tutti i siti - Inserire il plugin in
/mu-plugins
, automaticamente attivato su ogni sito
Ora, stavo giocando con le impostazioni e voglio attivare Akismet su tutti i siti tranne uno o due. Pensavo di poter attivare il plugin a livello di rete e poi disabilitarlo su un singolo sito, ma non riesco a farlo - se uso l'attivazione di rete c'è solo l'opzione per 'disattivare a livello di rete' - che disattiva il plugin su tutti i siti.
Esiste un modo per avere la comoda funzionalità dell'attivazione di rete ma allo stesso tempo mantenere la comodità di poter disattivare i plugin sito per sito?

Puoi utilizzare il filtro site_option_*
.
Ad esempio, il seguente codice disabiliterà Akismet sul blog con 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 per aver fornito una soluzione pulita a livello PHP che risolve il problema in questione senza bisogno di installare plugin aggiuntivi -- perché sono un maniaco della purezza e amo WordPress il più pulito e senza plugin possibile! :]

Ho inserito questo codice in un file PHP nella cartella mu-plugins
e funziona alla perfezione!

Importante notare che questo non funzionerà davvero in un tema. Deve essere eseguito prima, quindi mu-plugins è un posto perfetto per questo. Potrebbe funzionare come plugin, ma consiglierei di usare mu-plugins se nemmeno quello funziona.

Inoltre, questo filtro viene eseguito MOLTE volte, consiglio di verificare se l'indice nell'array è impostato prima di annullarlo. Dopo la prima volta, continuerà a provare su un array dove quell'elemento non esiste. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }

In realtà, questo metodo non funziona se il tuo sito è il primo sito (ID: 1). In quel caso, non ti permetterà di attivare il plugin in rete. Qualsiasi altro ID sembra funzionare.

Un po' più di tentativi ed errori. Se disattivi sul sito con ID = 1, puoi attivarli a livello di rete, ma non appariranno come attivati a livello di rete nelle impostazioni della rete. Dovrebbero però apparire nei singoli siti. Salvare le impostazioni dei plugin a livello di rete potrebbe disattivarli di nuovo... Non sono sicuro.

Sembra che questo non funzioni più. Il plugin appare come disattivato nella lista dei plugin, ma continua a funzionare normalmente.

Questo plugin: http://firestats.cc/wiki/WPMUPluginCommander
aggira le funzionalità di attivazione della rete e fa il suo lavoro autonomamente, permettendoti di disabilitare il plugin su base sito per sito.
Aggiornamento: Sembra che questo plugin causi problemi al plugin dei tag sitewide, quindi fai attenzione prima di provarlo su una rete di produzione.

https://wordpress.org/plugins/plugin-commander/ - URL modificato. Anche se questo plugin non viene aggiornato da anni a questa parte...

Ecco cosa ha funzionato per me per disattivare un plugin per un tema specifico in un'installazione multisito / multitema. Ho aggiunto queste poche righe all'inizio del file functions.php nel mio tema:
/**
* Disattiva il plugin fancybox per questo tema, interrompe il 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' );

I plugin attivi sono memorizzati nella tabella wp_[blog_id]_options nel campo 'active_plugins' e 'active_sitewide_plugins' in wp_[blog_id]_sitemeta. Questi sono campi serializzati, quindi non modificarli a meno che tu non sappia cosa stai facendo.
Dai anche un'occhiata a wp-admin\plugin.php. Dovrebbe essere possibile scrivere un plugin che faccia ciò che desideri utilizzando le funzioni dichiarate al suo interno, come is_plugin_active() e activate_plugin().
Tuttavia, sto presupponendo che tu sia esperto in PHP, il che potrebbe non essere il caso.

Le risposte di sorich87 e user33465 non hanno funzionato per me con WordPress 4.3. Aggiungere questo al functions.php del tema ha funzionato:
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' );

Posso confermare che le soluzioni votate in precedenza non funzionano più e che la soluzione di @gdr funziona effettivamente.

Posso confermare che la soluzione di @sorich87 funziona perfettamente in 4.4.1. Voi ragazzi non la state usando nel modo corretto, ma funziona comunque. Tuttavia, probabilmente può funzionare solo in mu-plugins e sicuramente non nel tema. Questa opzione funzionerà nei temi. Ma nota che questo forza un plugin disattivato rispetto a quello di sorich87 che semplicemente smette di forzarlo sul sito, ma permette comunque di usarlo normalmente se lo si desidera. Preferisco quest'ultimo, ma entrambi potrebbero essere utili.

In realtà. Il metodo della soluzione di @sorich87 non funziona se il tuo sito è il primo sito (ID: 1). In quel caso, non ti permetterà di attivare il plugin in rete. Qualsiasi altro ID sembra funzionare.

Il modo migliore per gestire tutti i plugin in una rete Multisite è "Plugin Commander" che puoi trovare qui: http://wordpress.org/extend/plugins/plugin-commander/

Ho disabilitato il plugin ma era ancora presente nel pannello principale del sito. L'unica soluzione che ho trovato per rimuoverlo completamente dal sito principale è stata controllare il main.php del plugin e disabilitarlo in base a questo:
global $current_blog;
// Disponibile solo per B
if( $current_blog->blog_id == 2 ) {
define( 'AB_PATH', __DIR__ );
include_once 'includes.php';
// caricamento del plugin
AB_Plugin::registerHooks();
is_admin() ? new AB_Backend() : new AB_Frontend();
}
