Deshabilitar el complemento / acción del complemento a través del tema

19

He instalado el complemento Google Analyticator en mi sitio. También estoy usando el complemento MobilePress para ofrecer un tema diseñado para navegadores móviles que no sean teléfonos inteligentes. He configurado Google Analytics para dispositivos móviles para su uso en este tema y me gustaría deshabilitar el complemento Analyticator ya que incluye una llamada a un archivo js más grande.

¿Alguien sabe si es posible deshabilitar un complemento usando functions.php o algún 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 todo el complemento, ¿es posible detener las acciones para la ejecución? He tratado de desactivarlos directamente sin suerte. Aquí está el código del archivo de complemento:

add_action('wp_head', 'add_google_analytics', 999999);
add_action('init', 'ga_outgoing_links');

Traté de eliminar esas acciones con:

remove_action('wp_head','add_google_analytics',9999999);
remove_action('init', 'ga_outgoing_links');

Cualquier ayuda es muy apreciada.

PNMG
fuente
En cuanto a mí, esto debería funcionar técnicamente, por lo que hay algo en su momento de ejecutar este código que sale mal (demasiado temprano o demasiado tarde). Por favor proporcione más información.
Rarst
Sí, pensé que también funcionaría. No tengo mucha experiencia con las acciones de agregar / quitar, así que no estaba seguro de cómo depurarlo más. A pesar de que la respuesta de EAMann funcionó, ¿qué tipo de información estaba buscando?
PNMG
Estoy un poco confundido: ¿no es más fácil deshabilitar el complemento a través de medios normales si es necesario que desaparezca para siempre? Qué respuesta de EAMann solo hace por código. Supuse que lo quería deshabilitado dinámicamente en alguna condición ...
Rarst
Tengo un tema regular que está configurado en WordPress para cualquier navegador de escritorio normal. Para este tema, quiero usar el complemento GA. El complemento mobilepress usa php para obtener la cadena de agente de usuario y sirve un tema diferente para un teléfono inteligente o un teléfono no inteligente. Quería usar el archivo functions.php para el tema que no sea de teléfono inteligente para deshabilitar el complemento GA de poner el JS en el <head> para ese tema solamente. Todavía debe estar habilitado para los otros dos temas (escritorio y teléfono inteligente). ¿Eso ayuda a aclarar?
PNMG
Sí, eso es lo que pensé. Pero la desactivación solo deshabilitará el complemento de forma persistente y permanecerá apagado hasta que se active explícitamente. No lo veo adecuado para su caso de uso.
Rarst

Respuestas:

25

Cuando WordPress activa un complemento, llama a la activate_plugin()función. Esta función activa el complemento en un sandbox y redirige a otro lugar en caso de éxito. Algunos autores lo han utilizado para activar mediante programación las dependencias de complementos.

Hay otra función, deactivate_plugin()que hace algo similar a la inversa ... en realidad es cómo WordPress desactiva los complementos cuando hace clic en "desactivar" o "desactivar".

Para desactivar un complemento instalado, solo llame al:

deactivate_plugins( '/plugin-folder/plugin-name.php' );

O, para desactivar múltiples complementos a la vez:

deactivate_plugins( array( '/first-plugin/first.php', '/second-plugin/second.php' ) );

Hay un segundo parámetro (el primero es una cadena o una matriz de complementos para deshabilitar) que le permite deshabilitar los complementos sin llamar a los ganchos de desactivación. Por defecto, está configurado en falso, y le recomiendo que lo deje así. A menos que por alguna razón desee evitar la desactivación, entonces haría lo siguiente:

deactivate_plugins( '/plugin-folder/plugin-name.php', true );

Esto simplemente apagaría el complemento, pero no dispararía nada que el complemento registrara para hacer en la desactivación. Entonces, si el complemento elimina opciones o tablas db cuando está desactivado, querrá hacer esta desactivación "silenciosa" para preservar esa información y usarla en otro lugar.

EAMann
fuente
Gran respuesta, y no solo en comparación con otra, digamos, una respuesta mediocre "aquí hay un sitio web" que podría estar en algún lugar cercano.
editor
Este código, ubicado en functions.php, desactivará el complemento en el administrador, deshabilitándolo de los otros dos temas. Gracias Rarst por señalarlo. Solo quería deshabilitarlo para el tema donde se encontraba el archivo functions.php.
PNMG
Solo usa un tema a la vez en un sitio determinado ... pero si desea volver a activar el complemento después de desactivar el tema, también es posible.
EAMann
11

Esto es gracias a la brillante respuesta de EAMann anterior, y pensé que podría ser útil también para el póster original ...

Necesitaba una solución para asegurarme de que los usuarios desactivaran mi complemento si cargaban la versión premium (para evitar posibles conflictos). Anteriormente detecté su estado con is_plugin_active y mostré un mensaje de error de administrador para solicitar a los usuarios que lo apaguen. Esto es MUCHO más suave ...

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 parece funcionar en register_activation_hook, pero admin_init funciona de maravilla.

Mark Jeldi
fuente
1
Solo para tener en cuenta que estoy bastante seguro de que is_plugin_active ya está marcado en el enlace deactivate_plugins, por lo que no debería tener que volver a hacerlo
Bryan Willis
1

Aquí está mi solución, crear un complemento que pueda deshabilitar otros complementos de esta manera:

/*
 * Plugin Name: Disable/Configure Plugins
 * Description: Lets you disable/configure plugins based on environment variables
 * Author:      Chris Sewell
 */

/**
 * Disable specified plugins in development environment.
 * 
 * This is a "Must-Use" plugin. Code here is loaded automatically before regular plugins load.
 * This is the only place from which regular plugins can be disabled programatically.
 * 
 * Place this code in a file in WP_CONTENT_DIR/mu-plugins or specify a custom location 

 * to "development" or "production" in each particular server/environment.
 */

/* Disable specified plugins in development environment */
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);
}

Empuje esto a producción, habilítelo, luego lleve la base de datos a su máquina de desarrollo local.

Fuente

usuario128526
fuente