Deshabilitar plugin / acción de plugin mediante tema
He instalado el plugin Google Analyticator en mi sitio. También estoy usando el plugin MobilePress para mostrar un tema diseñado para navegadores móviles que no son smartphones. He configurado Google Analytics para Móvil para usar en este tema y me gustaría deshabilitar el plugin Analyticator ya que incluye una llamada a un archivo js más grande.
¿Alguien sabe si es posible deshabilitar un plugin usando functions.php u otro método?
Creo que he localizado el código que agrega las funciones a la página, así que si no es posible deshabilitar el plugin completo, ¿es posible evitar que las acciones se ejecuten? He intentado deshabilitarlas directamente sin éxito. Aquí está el código del archivo del plugin:
// Añadir Google Analytics
add_action('wp_head', 'add_google_analytics', 999999);
// Añadir enlaces salientes
add_action('init', 'ga_outgoing_links');
Intenté eliminar esas acciones con:
// Eliminar Google Analytics
remove_action('wp_head','add_google_analytics',9999999);
// Eliminar enlaces salientes
remove_action('init', 'ga_outgoing_links');
Cualquier ayuda es muy apreciada.

Cuando WordPress activa un plugin, llama a la función activate_plugin()
. Esta función activa el plugin en un entorno aislado (sandbox) y redirige a otra ubicación en caso de éxito. Algunos desarrolladores la han utilizado para activar dependencias de plugins de manera programática.
Existe otra función, deactivate_plugins()
, que hace algo similar pero en sentido contrario... de hecho, es la forma en que WordPress desactiva plugins cuando haces clic en "desactivar" o "deshabilitar".
Para desactivar un plugin instalado, simplemente llama:
deactivate_plugins( '/carpeta-del-plugin/nombre-del-plugin.php' );
O, para desactivar múltiples plugins a la vez:
deactivate_plugins( array( '/primer-plugin/first.php', '/segundo-plugin/second.php' ) );
Hay un segundo parámetro (el primero es una cadena o un array de los plugins a desactivar) que permite desactivar los plugins sin llamar a los hooks de desactivación. Por defecto, está configurado como false, y recomiendo dejarlo así. A menos que por alguna razón quieras evitar la desactivación, en cuyo caso harías:
deactivate_plugins( '/carpeta-del-plugin/nombre-del-plugin.php', true );
Esto simplemente desactivaría el plugin, pero no ejecutaría ninguna acción que el plugin haya registrado para hacer al desactivarse. Así que si el plugin elimina opciones o tablas de la base de datos al desactivarse, podrías usar esta desactivación "silenciosa" para preservar esa información y utilizarla en otro lugar.
- Alguna documentación de A HitchHacker's Guide through WordPress

Excelente respuesta, y no solo en comparación con otra respuesta, digamos, mediocre de "aquí hay un sitio web" que podría estar cerca.

Este código, colocado en el functions.php desactivará el plugin en el administrador, deshabilitándolo así para los otros dos temas. Gracias Rarst por señalarlo. Yo solo quería desactivarlo para el tema donde estaba el archivo functions.php.

Esto es gracias a la brillante respuesta de EAMann mencionada anteriormente, y pensé que podría ser útil también para el autor de la publicación original...
Necesitaba una solución para asegurarme de que los usuarios desactivaran mi plugin si subían la versión premium (para evitar posibles conflictos). Anteriormente detectaba su estado con is_plugin_active y mostraba un mensaje de error en el administrador para pedir a los usuarios que lo desactivaran. Esto es MUCHO más fluido...
function deactivate_plugin_conditional() {
if ( is_plugin_active('plugin-folder/plugin-name.php') ) {
deactivate_plugins('plugin-folder/plugin-name.php');
}
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );
Nota: No pareció funcionar con register_activation_hook, pero admin_init funciona perfectamente.

Aquí está mi solución, crea un plugin que pueda desactivar otros plugins de la siguiente manera:
/*
* Plugin Name: Desactivar/Configurar Plugins
* Description: Te permite desactivar/configurar plugins basado en variables de entorno
* Author: Chris Sewell
*/
/**
* Desactiva plugins específicos en entorno de desarrollo.
*
* Este es un plugin "Must-Use". El código aquí se carga automáticamente antes que los plugins regulares.
* Este es el único lugar desde donde se pueden desactivar plugins regulares programáticamente.
*
* Coloca este código en un archivo en WP_CONTENT_DIR/mu-plugins o especifica una ubicación personalizada
* a "development" o "production" en cada servidor/entorno particular.
*/
/* Desactiva plugins específicos en entorno de desarrollo */
if (((getenv('environment') == 'production') || (getenv('environment') == 'alpha')) == false) {
$plugins = array(
'w3-total-cache/w3-total-cache.php'
);
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
deactivate_plugins($plugins);
}
Sube esto a producción, actívalo, y luego lleva la base de datos a tu máquina de desarrollo local.

Si deseas desactivar temporalmente un plugin basado en una condición sin desactivarlo de forma persistente para todos los clientes (como lo hace deactivate_plugins()
), debes usar el filtro option_active_plugins
en un plugin dentro de la carpeta mu-plugins
como en el ejemplo a continuación:
# archivo: wp-content/mu-plugins/disable-plugins.php
add_filter( 'option_active_plugins', function( $plugins ){
if ( $my_condition ) {
$plugins= array_diff($plugins, array('plugin_to_rm_1.php', 'plugin_to_rm_2.php'));
}
return $plugins;
});
