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

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?

-

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;
}

-
+1 for providing clean, PHP-level solution which solves problem in question without need to install extra plugin -- because I'm a purity maniac and love Wordpress as clean and plugin-less as possible! :] –  trejder Nov 12 '12 at 10:14

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

-

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-admin\plugin.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.

-

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

-

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.

-

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.

-