Come disabilitare un plug-in abilitato alla rete per un solo sito?


22

Sono in procinto di configurare una rete multisito (potenzialmente) di grandi dimensioni e sto cercando di rendere il più semplice possibile ora aggiungere e configurare siti quando necessario. Sono attualmente nella fase in cui ho a che fare con i plugin.

Con multisito conosco diversi modi in cui puoi attivare i plugin

  • Inserisci il plug-in /plugins, attivalo su ogni sito in modo casuale
  • Inserisci il plug-in /plugins, usa 'network activ' per attivarlo su tutti i siti
  • Inserisci il plug-in /mu-plugins, attivato automaticamente su ogni sito

Ora, ho giocato con le impostazioni e voglio attivare Akismet su tutti i siti tranne uno o due. Pensavo che sarei stato in grado di attivare il plug-in di rete e quindi disabilitarlo su un singolo sito, ma non sono in grado di farlo - se uso l'attivazione di rete, esiste solo l'opzione per "disattivare la rete" - che disattiva il plug-in tutti i siti.

Esiste un modo per attivare la pratica funzionalità di rete ma avere ancora la comodità di poter disattivare i plug-in sito per sito?

Risposte:


31

Puoi usare il filtro site_option_*.

Ad esempio, il seguente 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
+1 per fornire una soluzione pulita a livello di PHP che risolva il problema in questione senza la necessità di installare plug-in extra - perché sono un pazzo maniaco e amo Wordpress nel modo più pulito e meno plug-in possibile! :]
— trejder

1
Lasciato cadere questo codice in un file PHP mu-pluginse funziona come un sogno!
— bgallagh3r,

Bene notare che questo non funzionerà davvero in un tema. Deve essere eseguito prima, quindi mu-plugins è un ottimo posto per questo. Potrebbe funzionare come plugin, ma sparerei per mu-plugins se neanche quello funzionasse.
— Jake,

1
Inoltre, questo filtro viene eseguito MOLTO, vorrei verificare se l'indice nell'array è impostato prima di annullarlo. Dopo la prima volta, continuerà a provare un array in cui l'elemento non esiste. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
— Jake,

1
Funziona ancora alla grande su 4.9.4.
— Jake,


3

Ecco cosa ha funzionato per me per disabilitare un plugin per un tema particolare su un'installazione multisito / multisito. Ho aggiunto queste poche righe all'inizio del file Functions.php nel mio tema:

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

Sono abbastanza sicuro che funzionerà solo su mu-plugins che è piuttosto limitante. Lo farei su initcome @GDR.
— Jake,

2

I plug-in attivi sono memorizzati nelle opzioni wp_ [blog_id] nel campo "active_plugins" e "active_sitewide_plugins" in wp_ [blog_id] _sitemeta. Questi sono campi serializzati, quindi non modificarli se non sai cosa stai facendo.

Dai anche un'occhiata a wp-admin \ plugin.php. Dovrebbe essere possibile scrivere un plugin che farà quello che vuoi usando le funzioni dichiarate in esso, ad es. Is_plugin_active () e activ_plugin ().

Tuttavia, suppongo che tu sia competente in PHP, il che potrebbe non essere il caso.


2

Le risposte di sorich87 e user33465 non hanno funzionato per me con Wordpress 4.3. Aggiungendo questo alle funzioni.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 precedenti soluzioni votate non funzionano più e che la soluzione di @gdr funziona davvero.

Posso confermare che la soluzione di @ sorich87 funziona alla grande in 4.4.1. Ragazzi, non lo state usando in un modo che apparentemente funziona, ma funziona ancora. Tuttavia, probabilmente può funzionare solo nei mu-plug-in e sicuramente non nel tema. Questa opzione funzionerà nei temi. Ma nota che questo forza un plugin disattivato rispetto a sorich87 che smette di forzarlo sul sito, ma consente comunque di usarlo normalmente se lo desideri. Preferisco quest'ultimo, ma entrambi potrebbero essere utili.
— Jake,

In realtà. Il metodo di soluzione di @ sorich87 non funziona se il tuo sito è il primo sito (ID: 1). In tal caso, non ti consentirà di attivare il plug-in di rete. Qualsiasi altro ID sembra funzionare.
— Jake,

E questo metodo fa la stessa cosa per me. Non è più possibile attivare i plug-in a livello di sito se questo è nel tema per il sito con ID = 1.
— Jake

0

Non pronto all'uso in WP 3, ma sarebbe possibile, credo, sovrascrivere l'opzione usando i filtri option_ *.

Inoltre, sarebbe dolce se hai aggiunto il suggerimento come richiesta di funzionalità in core.trac.wordpress.org.



-1

Sono riuscito a disabilitare il plug-in ma era ancora presente sul pannello del sito principale. L'unica soluzione che ho trovato per rimuoverlo completamente dal sito principale era quella di controllare sul sito main.php del plugin il sito e disabilitarlo secondo esso:

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.