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

22

Estoy en el proceso de configurar una red multisitio (potencialmente) grande, y estoy buscando hacer que sea lo más fácil posible agregar y configurar sitios cuando sea necesario. Actualmente estoy en la fase en la que estoy tratando con complementos.

Con multisitio, conozco varias formas diferentes de activar complementos

  • Coloque el complemento /plugins, actívelo en cada sitio de forma invidual
  • Coloque el complemento /plugins, use 'activar red' para activarlo en todos los sitios
  • Coloque el complemento /mu-plugins, activado automáticamente en cada sitio

Ahora, he estado jugando con la configuración y quiero activar Akismet en todos los sitios excepto uno o dos. Pensé que sería capaz de activar en red el complemento y luego deshabilitarlo en un solo sitio, pero no puedo hacerlo; si uso la activación de red, solo existe la opción de 'desactivar red', que desactiva el complemento a través de todos los sitios

¿Hay alguna manera de activar la práctica funcionalidad de la red pero aún así tener la conveniencia de poder desactivar los complementos sitio por sitio?

nadie
fuente

Respuestas:

31

Puedes usar el filtro site_option_*.

Por ejemplo, lo siguiente deshabilitará 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;
}
sorich87
fuente
1
+1 por proporcionar una solución limpia de nivel PHP que resuelve el problema en cuestión sin necesidad de instalar un complemento adicional, ¡porque soy un maníaco de la pureza y amo Wordpress lo más limpio y sin complementos posible! :]
trejder
1
¡Dejó caer este código en un archivo PHP mu-pluginsy funciona como un sueño!
bgallagh3r
Es bueno tener en cuenta que esto realmente no funcionará en un tema. Debe ejecutarse antes, por lo que mu-plugins es un gran lugar para ello. Podría ejecutarse como un complemento, pero dispararía para complementos mu si eso tampoco funciona.
Jake
1
Además, este filtro se ejecuta MUCHO, comprobaría si el índice en la matriz está configurado antes de desarmarlo. Después de la primera vez, seguirá intentando en una matriz donde ese elemento no existe. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Esto sigue funcionando muy bien en 4.9.4.
Jake
3

Este complemento: http://firestats.cc/wiki/WPMUPluginCommander

omite las cosas de activación de red y hace lo suyo. y le permite deshabilitar el complemento sitio por sitio.

Actualización: Parece que este complemento rompe el complemento de etiquetas de todo el sitio, así que tenga cuidado antes de probar en una red de producción.

andrea_r
fuente
wordpress.org/plugins/plugin-commander - URL modificada. Aunque este complemento no se ha actualizado en años en este momento ...
Jake
3

Esto es lo que funcionó para mí para deshabilitar un complemento para un tema en particular en una instalación multisitio / multitema. Agregué estas pocas líneas en la parte superior del archivo functions.php en mi tema:

/**
 * 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' );
usuario33465
fuente
Estoy bastante seguro de que esto solo funcionará en plugins mu, lo cual es bastante limitante. Haría esto initcomo @GDR.
Jake
2

Los complementos activos se almacenan en las opciones wp_ [blog_id] _ en el campo 'active_plugins' y 'active_sitewide_plugins' en wp_ [blog_id] _sitemeta. Estos son campos serializados, así que no los edite a menos que sepa lo que está haciendo.

También eche un vistazo a wp-admin \ plugin.php. Debería ser posible escribir un complemento que haga lo que quiera usando las funciones declaradas allí, por ejemplo, is_plugin_active () y enable_plugin ().

Sin embargo, supongo que usted es competente en PHP, lo que puede no ser el caso.

codecowboy
fuente
2

Las respuestas de sorich87 y user33465 no me funcionaron con Wordpress 4.3. Agregar esto a las funciones del tema.php 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' );
RDA
fuente
Puedo confirmar que las soluciones votadas anteriormente ya no funcionan y que la solución de @gdr sí funciona.
Puedo confirmar que la solución de @ sorich87 funciona muy bien en 4.4.1. Ustedes no lo están usando de una manera que aparentemente funcione, pero aún funciona. Sin embargo, probablemente solo pueda funcionar en complementos mu y definitivamente no en el tema. Esta opción funcionará en temas. Pero tenga en cuenta que esto fuerza un plugin desactivado frente a sorich87 que simplemente deja de forzarlo en el sitio, pero aún permite que se use normalmente si lo desea. Prefiero el último, pero ambos podrían ser útiles.
Jake
Actualmente. El método de solución de @ sorich87 no funciona si su sitio es el primer sitio (ID: 1). Si ese es el caso, no le permitirá activar el complemento de red. Cualquier otra identificación parece funcionar.
Jake
Y este método hace lo mismo para mí. Ya no puede activar los complementos en todo el sitio si está en el tema del sitio en ID = 1.
Jake
0

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

Además, sería bueno si agregara la sugerencia como una solicitud de función en core.trac.wordpress.org.

Denis de Bernardy
fuente
-1

Logré deshabilitar el complemento pero todavía estaba allí en el panel del sitio principal. La única solución que encontré para eliminarlo completamente del sitio principal fue verificar el main.php del complemento del sitio y deshabilitarlo de acuerdo con él:

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
fuente