Deshabilitar plugin / acción de plugin mediante tema

15 mar 2011, 23:36:26
Vistas: 42.5K
Votos: 27

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.

9
Comentarios

Para mí esto debería funcionar técnicamente, así que hay algo en el momento en que ejecutas este código que está fallando (demasiado temprano o demasiado tarde). Por favor, proporciona más información.

Rarst Rarst
15 mar 2011 23:49:36

Sí, yo también pensé que funcionaría. No tengo mucha experiencia con add/remove actions así que no estaba seguro de cómo depurarlo más. Aunque la respuesta de EAMann funcionó, ¿qué tipo de información adicional estabas buscando?

PNMG PNMG
16 mar 2011 00:29:23

Estoy un poco confundido - ¿no sería más fácil simplemente desactivar el plugin por los medios normales si se necesita eliminarlo permanentemente? Lo que la respuesta de EAMann hace solo mediante código. Asumí que querías desactivarlo dinámicamente bajo alguna condición...

Rarst Rarst
16 mar 2011 00:33:02

Tengo un tema regular configurado en WordPress para navegadores de escritorio normales. Para este tema, quiero usar el plugin GA. El plugin MobilePress usa PHP para obtener la cadena de agente de usuario y sirve un tema diferente para teléfonos inteligentes o no inteligentes. Quería usar el archivo functions.php del tema para no-teléfonos-inteligentes para deshabilitar el plugin GA y evitar que inserte el JS en el <head> solo para ese tema. Todavía necesita estar habilitado para los otros dos temas (escritorio y teléfonos inteligentes). ¿Eso ayuda a aclarar?

PNMG PNMG
16 mar 2011 01:42:32

Sí, eso es lo que pensé. Pero desactivarlo simplemente deshabilitará el plugin persistentemente y permanecerá apagado hasta que se active explícitamente. No veo que se ajuste a tu caso de uso.

Rarst Rarst
16 mar 2011 02:09:05

¡Ahhhh! Tienes razón. Era el final del día y vi que lo eliminaba del tema que quería, pero no me molesté en revisar los otros. Simplemente desactivó el plugin para todo. Así que supongo que la respuesta de abajo no era lo que buscaba. ¡Gracias por ayudarme a darme cuenta! ¿Crees que seguir con el código remove_action es la forma de proceder? No parece posible desactivar un plugin solo para un tema.

PNMG PNMG
16 mar 2011 03:15:38

Sí, las eliminaciones deberían funcionar. ¿En qué momento y cómo ejecutas las funciones remove?

Rarst Rarst
16 mar 2011 10:31:24

He colocado los remove_action al final del archivo functions.php del tema. Los he puesto por sí mismos como mencioné en la pregunta y también he intentado ponerlos en un add_action: add_action('wp_head','my_remove_ga'); function my_remove_ga() { remove_action('wp_head','add_google_analytics'); remove_action('init', 'ga_outgoing_links'); } También he intentado usar var_dump() en el remove_action con var_dump(remove_action('wp_head','add_google_analytics')); y devuelve bool(false), lo que según el codex significa "La función no pudo ser eliminada."

PNMG PNMG
16 mar 2011 14:21:31

También he intentado comentar los add_actions iniciales del plugin y añadirlos al functions.php de mi tema, luego usando los remove_actions justo debajo. Eso tampoco parece funcionar.

PNMG PNMG
16 mar 2011 14:29:01
Mostrar los 4 comentarios restantes
Todas las respuestas a la pregunta 4
3
35

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.

15 mar 2011 23:53:35
Comentarios

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

editor editor
15 mar 2011 23:59:06

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.

PNMG PNMG
16 mar 2011 03:19:21

Solo usas un tema a la vez en un sitio dado... pero si deseas reactivar el plugin después de desactivar el tema, eso también es posible.

EAMann EAMann
21 mar 2011 16:35:40
1
14

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.

20 mar 2012 14:24:27
Comentarios

Solo para señalar que estoy bastante seguro de que is_plugin_active ya se verifica en el hook deactivate_plugins, por lo que no debería ser necesario hacerlo nuevamente

Bryan Willis Bryan Willis
11 sept 2014 07:24:37
0

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.

Fuente

26 sept 2017 12:48:06
0

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;
});
20 dic 2023 15:35:01