¿Cómo deshabilitar un plugin habilitado en la red para un solo sitio?
Estoy en el proceso de configurar una red multisite (potencialmente) grande, y busco que sea lo más fácil posible configurar y añadir sitios cuando sea necesario. Actualmente estoy en la fase donde estoy gestionando los plugins.
Con multisite conozco varias formas diferentes de activar plugins
- Colocar el plugin en
/plugins
, activarlo en cada sitio individualmente - Colocar el plugin en
/plugins
, usar 'activación en red' para activarlo en todos los sitios - Colocar el plugin en
/mu-plugins
, automáticamente activado en todos los sitios
Ahora, he estado jugando con la configuración y quiero activar Akismet en todos los sitios excepto en uno o dos. Pensé que podría activar el plugin en red y luego deshabilitarlo en un solo sitio, pero no puedo hacerlo - si uso la activación en red solo existe la opción de 'desactivar en red' - lo cual desactiva el plugin en todos los sitios.
¿Existe alguna manera de tener la útil funcionalidad de la activación en red pero aún mantener la conveniencia de poder desactivar plugins sitio por sitio?

Puedes utilizar el filtro site_option_*
.
Por ejemplo, lo siguiente desactivará Akismet en el 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 por proporcionar una solución limpia a nivel de PHP que resuelve el problema en cuestión sin necesidad de instalar un plugin adicional -- ¡porque soy un maniático de la pureza y amo WordPress lo más limpio y libre de plugins posible! :]

¡Coloqué este código en un archivo PHP en mu-plugins
y funciona como un sueño!

Es bueno notar que esto no funcionará realmente en un tema. Necesita ejecutarse antes, por lo que mu-plugins es un gran lugar para ello. Podría funcionar como un plugin, pero optaría por mu-plugins si eso tampoco funciona.

Además, este filtro se ejecuta MUCHAS veces, yo verificaría si el índice en el array está definido antes de eliminarlo. Después de la primera vez, seguirá intentando en un array donde ese elemento no existe. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }

En realidad, este método no funciona si tu sitio es el primer sitio (ID: 1). Si ese es el caso, no te permitirá activar el plugin en la red. Cualquier otro ID parece funcionar.

Un poco más de prueba y error. Si desactivas en el sitio con ID = 1, puedes activarlos a nivel de toda la red, pero no aparecerán como activados globalmente en los ajustes de la red. Sin embargo, deberían aparecer en los sitios. Guardar los ajustes de plugins a nivel de red podría desactivarlos nuevamente... No estoy seguro.

Esto parece no funcionar más. El plugin aparece como desactivado en la lista de plugins, pero sigue funcionando como siempre.

Este complemento: http://firestats.cc/wiki/WPMUPluginCommander
evita la activación en red y realiza su propio sistema, permitiéndote desactivar el complemento sitio por sitio.
Actualización: Parece que este complemento interfiere con el complemento de etiquetas para toda la red, así que ten cuidado antes de probarlo en una red de producción.

https://wordpress.org/plugins/plugin-commander/ - La URL ha cambiado. Aunque este plugin no ha sido actualizado en años hasta este momento...

Esto es lo que funcionó para mí para desactivar un plugin para un tema en particular en una instalación multisitio/multitema. Agregué estas pocas líneas al principio del archivo functions.php en mi tema:
/**
* Desactiva el plugin fancybox para este tema, rompe el 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' );

Los plugins activos se almacenan en la tabla wp_[blog_id]_options en el campo 'active_plugins' y en 'active_sitewide_plugins' en wp_[blog_id]_sitemeta. Estos son campos serializados, así que no los edites a menos que sepas lo que estás haciendo.
También puedes revisar el archivo wp-admin\plugin.php. Debería ser posible escribir un plugin que haga lo que necesitas usando las funciones declaradas allí, como is_plugin_active() y activate_plugin().
Sin embargo, estoy asumiendo que eres competente en PHP, lo cual puede no ser el caso.

Las respuestas de sorich87 y user33465 no funcionaron para mí con WordPress 4.3. Añadir esto al functions.php del tema funcionó:
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' );

Puedo confirmar que las soluciones votadas anteriormente ya no funcionan y que la solución de @gdr sí funciona de hecho.

Puedo confirmar que la solución de @sorich87 funciona perfectamente en la versión 4.4.1. Al parecer, ustedes no la están usando de la manera correcta, pero aún así funciona. Sin embargo, probablemente solo funcione en mu-plugins y definitivamente no en el tema. Esta opción funcionará en temas. Pero ten en cuenta que esto fuerza a desactivar el plugin, a diferencia de la solución de @sorich87 que simplemente deja de forzarlo en el sitio, pero aún permite usarlo normalmente si se desea. Prefiero la última opción, pero ambas pueden ser útiles.

En realidad, el método de solución de @sorich87 no funciona si tu sitio es el primer sitio (ID: 1). En ese caso, no te permitirá activar el plugin en la red. Cualquier otro ID parece funcionar.

La mejor manera de gestionar todos los plugins en una red Multisite es con "Plugin Commander", que puedes encontrar aquí: http://wordpress.org/extend/plugins/plugin-commander/

Logré desactivar el plugin pero todavía aparecía en el panel principal del sitio. La única solución que encontré para eliminarlo completamente del sitio principal fue verificar el archivo main.php del plugin y desactivarlo según corresponda:
global $current_blog;
// Solo disponible para B
if( $current_blog->blog_id == 2 ) {
define( 'AB_PATH', __DIR__ );
include_once 'includes.php';
// cosas cargadas del plugin
AB_Plugin::registerHooks();
is_admin() ? new AB_Backend() : new AB_Frontend();
}
