¿Cómo deshabilitar un plugin habilitado en la red para un solo sitio?

29 oct 2010, 16:11:17
Vistas: 27.8K
Votos: 24

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?

0
Todas las respuestas a la pregunta 8
10
34

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;
}
29 oct 2010 18:35:05
Comentarios

+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! :]

trejder trejder
12 nov 2012 12:14:56

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

bgallagh3r bgallagh3r
4 dic 2015 14:02:04

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.

Jake Jake
7 ene 2016 06:22:49

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

Jake Jake
7 ene 2016 06:24:13

Esto sigue funcionando perfectamente en la versión 4.9.4.

Jake Jake
15 feb 2018 00:29:48

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.

Jake Jake
20 feb 2018 07:41:59

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.

Jake Jake
20 feb 2018 08:10:07

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

Vincent Poirier Vincent Poirier
26 abr 2020 00:36:24

Funciona bien con la versión 5.4.1.

Feriman Feriman
2 jun 2020 00:06:15

Agregué esto en los plugins mu, pero no está activando el plugin en absoluto. ¿Sigue funcionando en 2023?

Demian Demian
8 mar 2023 19:04:53
Mostrar los 5 comentarios restantes
1

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.

29 oct 2010 19:05:32
Comentarios

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

Jake Jake
7 ene 2016 06:38:13
1

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' );
29 may 2013 22:26:58
Comentarios

Estoy bastante seguro de que esto solo funcionará en mu-plugins, lo cual es bastante limitante. Yo haría esto en init como @GDR.

Jake Jake
7 ene 2016 06:35:06
0

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.

29 oct 2010 17:22:13
4

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' );
22 oct 2015 14:07:38
Comentarios

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

User User
23 oct 2015 06:00:04

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.

Jake Jake
7 ene 2016 06:31:54

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.

Jake Jake
20 feb 2018 07:42:12

Y este método hace lo mismo para mí. Ya no puedes activar el plugin(s) en toda la red si esto está en el tema para el sitio con ID = 1.

Jake Jake
20 feb 2018 07:54:29
0

No está disponible por defecto en WP 3, pero creo que sería posible anular la opción usando los filtros option_*.

Además, sería genial si agregaras la sugerencia como una solicitud de característica en core.trac.wordpress.org.

29 oct 2010 16:36:09
0

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/

19 mar 2011 09:45:22
0
-1

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

}
4 feb 2016 12:31:43