Come disabilitare un plugin abilitato a livello di rete per un solo sito?

29 ott 2010, 16:11:17
Visualizzazioni: 27.8K
Voti: 24

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?

0
Tutte le risposte alla domanda 8
10
34

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;
}
29 ott 2010 18:35:05
Commenti

+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! :]

trejder trejder
12 nov 2012 12:14:56

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

bgallagh3r bgallagh3r
4 dic 2015 14:02:04

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.

Jake Jake
7 gen 2016 06:22:49

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

Jake Jake
7 gen 2016 06:24:13

Funziona ancora perfettamente sulla versione 4.9.4.

Jake Jake
15 feb 2018 00:29:48

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.

Jake Jake
20 feb 2018 07:41:59

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.

Jake Jake
20 feb 2018 08:10:07

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

Vincent Poirier Vincent Poirier
26 apr 2020 00:36:24

Funziona bene con la versione 5.4.1.

Feriman Feriman
2 giu 2020 00:06:15

Ho aggiunto questo nei plugin mu, ma non sta attivando affatto il plugin. Funziona ancora nel 2023?

Demian Demian
8 mar 2023 19:04:53
Mostra i restanti 5 commenti
1

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.

29 ott 2010 19:05:32
Commenti

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

Jake Jake
7 gen 2016 06:38:13
1

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' );
29 mag 2013 22:26:58
Commenti

Sono abbastanza sicuro che questo funzionerà solo su mu-plugins, il che è piuttosto limitante. Lo farei su init come @GDR.

Jake Jake
7 gen 2016 06:35:06
0

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.

29 ott 2010 17:22:13
4

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' );
22 ott 2015 14:07:38
Commenti

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

User User
23 ott 2015 06:00:04

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.

Jake Jake
7 gen 2016 06:31:54

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.

Jake Jake
20 feb 2018 07:42:12

E questo metodo fa la stessa cosa per me. Non puoi più attivare il plugin/i plugin a livello di sito se questo è nel tema per il sito con ID = 1.

Jake Jake
20 feb 2018 07:54:29
0

Non disponibile di default in WP 3, ma penso sarebbe possibile sovrascrivere l'opzione utilizzando i filtri option_*.

Inoltre, sarebbe fantastico se aggiungessi il suggerimento come richiesta di funzionalità su core.trac.wordpress.org.

29 ott 2010 16:36:09
0

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/

19 mar 2011 09:45:22
0
-1

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

}
4 feb 2016 12:31:43