How to disable a network enabled plugin for just one site?

The question:

I’m in the process of setting up a (potentially) large multisite network, and I’m looking to make it as easy as possible now to add and configure sites when needed. I’m currently at the phase where I’m dealing with plugins.

With multisite I am aware of several different ways you can activate plugins

  • Put the plugin in /plugins, activate it on every site invidually
  • Put the plugin in /plugins, use ‘network activate’ to activate it on all sites
  • Put the plugin in /mu-plugins, automatically activated on every site

Now, I’ve been playing with the settings and I want to activate Akismet on all sites but one or two. I thought I would be able to network activate the plugin and then disable it on a single site, but I am unable to do so – if I use network activate then there is only the option to ‘network deactivate’ – which deactivates the plugin across all sites.

Is there a way to have the handy functionality of network activate but yet still have the convenience of being able to deactivate plugins on a site-by-site basis?

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

You can use the filter site_option_*.

E.g. the following will disable akismet on blog with 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;
}

Method 2

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

bypasses the network activation stuff and does its own. and lets you disable the plugin on a site by site basis.

Update: Looks like this plugin breaks the sitewide tags plugin, so be careful before trying on a production network.

Method 3

Here is what worked for me to disable a plugin for one particular theme on a multisite / multitheme install. I added these few lines at the top of the functions.php file in my theme:

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

Method 4

The active plugins are stored in the wp_[blog_id]_options in the field ‘active_plugins’ and ‘active_sitewide_plugins’ in wp_[blog_id]_sitemeta. These are serialised fields so don’t edit them unless you know what you’re doing.

Also take a look at wp-adminplugin.php. It should be possible to write a plugin which will do what you want using the functions declared in there e.g. is_plugin_active() and activate_plugin().

However, I’m presupposing you are proficient in PHP which may not be the case.

Method 5

Answers from sorich87 and user33465 didn’t work for me with WordPress 4.3. Adding this to theme’s functions.php worked:

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

Method 6

Not out of the box in WP 3, but it would be possible, I think, to override the option using the option_* filters.

Also, it would be sweet if you added the suggestion as a feature request in core.trac.wordpress.org.

Method 7

The better way to handel all plugins in Multisite Network is “Plugin Commander” you can find here: http://wordpress.org/extend/plugins/plugin-commander/

Method 8

I managed to disabled the plugin but it was still there on the main site panel.
The only solution I found to completly remove it from the main site was to check on the main.php of the plugin the site and disable it according to it:

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

}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment