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.