Comment désactiver un plugin compatible réseau pour un seul site?

22

Je suis en train de mettre en place un réseau multisite (potentiellement) important, et je cherche à rendre aussi facile que possible maintenant l'ajout et la configuration de sites en cas de besoin. Je suis actuellement à la phase où je traite des plugins.

Avec multisite, je connais plusieurs façons d'activer les plugins

  • Mettez le plugin /plugins, activez-le sur chaque site de manière individuelle
  • Mettez le plugin /pluginsdedans, utilisez 'network activate' pour l'activer sur tous les sites
  • Mettez le plugin /mu-plugins, activé automatiquement sur chaque site

Maintenant, je joue avec les paramètres et je veux activer Akismet sur tous les sites sauf un ou deux. Je pensais que je serais en mesure d'activer le plugin en réseau puis de le désactiver sur un seul site, mais je ne suis pas en mesure de le faire - si j'utilise l'activation du réseau, il n'y a que l'option de `` désactivation du réseau '' - qui désactive le plugin sur tous les sites.

Existe-t-il un moyen d'activer les fonctionnalités pratiques du réseau tout en ayant la possibilité de désactiver les plug-ins site par site?

personne
la source

Réponses:

31

Vous pouvez utiliser le filtre site_option_*.

Par exemple, ce qui suit désactivera akismet sur le blog avec l'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;
}
sorich87
la source
1
+1 pour avoir fourni une solution propre au niveau PHP qui résout le problème en question sans avoir besoin d'installer de plugin supplémentaire - parce que je suis un fou de pureté et j'aime Wordpress aussi propre et sans plugin que possible! :]
trejder
1
Lâché ce code dans un fichier PHP mu-pluginset fonctionne comme un rêve!
bgallagh3r
Bon à noter que cela ne fonctionnera pas vraiment dans un thème. Il doit être exécuté plus tôt, donc mu-plugins est un excellent endroit pour cela. Il pourrait fonctionner comme un plugin, mais je tirerais pour les plugins mu si cela ne fonctionne pas non plus.
Jake
1
En outre, ce filtre est exécuté beaucoup, je vérifierais si l'index dans le tableau est défini avant de le désactiver. Après la première fois, il continuera d'essayer un tableau où cet élément n'existe pas. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Cela fonctionne toujours très bien sur 4.9.4.
Jake
3

Ce plugin: http://firestats.cc/wiki/WPMUPluginCommander

contourne les éléments d'activation du réseau et fait le sien. et vous permet de désactiver le plugin site par site.

Mise à jour: il semble que ce plugin casse le plugin de balises à l'échelle du site, alors soyez prudent avant d'essayer sur un réseau de production.

andrea_r
la source
wordpress.org/plugins/plugin-commander - URL modifiée. Bien que ce plugin n'ait pas été mis à jour depuis des années à ce stade ...
Jake
3

Voici ce qui a fonctionné pour moi pour désactiver un plugin pour un thème particulier sur une installation multisite / multithème. J'ai ajouté ces quelques lignes en haut du fichier functions.php dans mon thème:

/**
 * 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' );
user33465
la source
Je suis sûr que cela ne fonctionnera que sur les plugins mu, ce qui est assez limitant. Je le ferais sur initcomme @GDR.
Jake
2

Les plugins actifs sont stockés dans les options wp_ [blog_id] _ dans les champs 'active_plugins' et 'active_sitewide_plugins' dans wp_ [blog_id] _sitemeta. Ce sont des champs sérialisés, ne les modifiez donc que si vous savez ce que vous faites.

Jetez également un œil à wp-admin \ plugin.php. Il devrait être possible d'écrire un plugin qui fera ce que vous voulez en utilisant les fonctions déclarées ici, par exemple is_plugin_active () et activate_plugin ().

Cependant, je suppose que vous maîtrisez PHP, ce qui n'est peut-être pas le cas.

codecowboy
la source
2

Les réponses de sorich87 et user33465 ne fonctionnaient pas pour moi avec Wordpress 4.3. L'ajout de ceci à functions.php du thème a fonctionné:

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' );
RDA
la source
Je peux confirmer que les solutions votées précédemment ne fonctionnent plus et que la solution de @gdr fonctionne en fait.
Je peux confirmer que la solution de @ sorich87 fonctionne très bien dans 4.4.1. Vous ne l'utilisez pas d'une manière qui fonctionne apparemment, mais cela fonctionne toujours. Cependant, il ne peut probablement fonctionner que dans les plugins mu et certainement pas dans le thème. Cette option fonctionnera par thèmes. Mais notez que cela force un plugin désactivé contre sorich87 qui arrête juste de le forcer sur le site, mais permet quand même de l'utiliser normalement si vous le souhaitez. Je préfère ce dernier, mais les deux pourraient être utiles.
Jake
Réellement. La méthode de solution de @ sorich87 ne fonctionne pas si votre site est le premier site (ID: 1). Si tel est le cas, cela ne vous permettra pas d'activer le plugin en réseau. Tout autre ID semble fonctionner.
Jake
Et cette méthode fait la même chose pour moi. Vous ne pouvez plus activer le (s) plugin (s) sur tout le site si celui-ci est dans le thème du site à ID = 1.
Jake
0

Pas tout de suite dans WP 3, mais il serait possible, je pense, de remplacer l'option en utilisant les filtres option_ *.

En outre, il serait préférable que vous ajoutiez la suggestion en tant que demande de fonctionnalité dans core.trac.wordpress.org.

Denis de Bernardy
la source
-1

J'ai réussi à désactiver le plugin mais il était toujours là sur le panneau du site principal. La seule solution que j'ai trouvée pour le supprimer complètement du site principal était de vérifier le main.php du plugin du site et de le désactiver en fonction de celui-ci:

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

}
NetOholik
la source