Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🚫 Cómo desactivar selectivamente plugins de WordPress en páginas y entradas específicas

🚫 Cómo desactivar selectivamente plugins de WordPress en páginas y entradas específicas

Cada plugin de WordPress añade código PHP que se ejecuta al cargar la página, carga scripts y estilos y, a veces, realiza consultas adicionales a la base de datos. Cuantos más plugins tenga, más pesadas se vuelven sus páginas. Pero el problema no es solo la cantidad: incluso un solo plugin «conversador» como Contact Form 7 carga sus archivos .css y .js en todas las páginas por defecto, incluidas aquellas donde no existe ningún formulario.

Los desarrolladores de CF7 reconocen abiertamente que el plugin carga recursos en todas partes porque el shortcode puede aparecer en cualquier lugar. Esta lógica no es exclusiva de CF7; la mayoría de los plugins funcionan igual. El resultado: la página de inicio de su blog carga scripts para un slider de galería que nunca estuvo allí en primer lugar.

La buena noticia: WordPress le permite desactivar selectivamente la carga de plugins solo en las páginas donde realmente se necesitan. Cubriremos ambos enfoques: el programático (usando un mu-plugin con el filtro option_active_plugins) y el basado en plugins (Plugin Organizer, Perfmatters, Plugin Load Filter). Al final, mediremos los resultados usando el monitor de red del navegador.

💡 Resumen rápido:

  • Elija plugins según tres criterios: reputación del desarrollador, rendimiento bajo carga y necesidad real
  • Enfoque programático: escriba un fragmento PHP que use get_option('active_plugins') para obtener la lista de plugins activos y los filtre por la URL de la página
  • Mu-plugin: coloque el filtro en /wp-content/mu-plugins/ para que se ejecute ANTES que todos los plugins regulares, desactivando los innecesarios sobre la marcha
  • Enfoque con plugins: Plugin Organizer y Perfmatters ofrecen una interfaz visual para las mismas tareas sin escribir una sola línea de código
  • Mida el efecto usando Chrome/Firefox DevTools: después del filtrado, las solicitudes HTTP disminuyen y el tiempo de carga se reduce notablemente

Tres reglas para elegir plugins

Antes de filtrar la carga de plugins, asegúrese de que los plugins de su sitio realmente merecen un lugar en wp_options. Tres reglas que le ahorran dolores de cabeza y recursos del servidor.

Instale solo plugins verificados de desarrolladores con trayectoria. Abra la página del plugin en WordPress.org y verifique: número de instalaciones activas, calificación, fecha de la última actualización y cantidad de tickets de soporte resueltos. Un plugin con más de 100 000 instalaciones, una calificación superior a 4.5 y una actualización en los últimos 3 meses es una opción segura.

Página del plugin en el directorio de WordPress

Prefiera plugins escalables. Dos plugins con funcionalidad idéntica pueden afectar la velocidad de manera diferente. Compare candidatos usando el inspector del navegador (pestaña Red) o servicios en línea como Google PageSpeed Insights, Pingdom y GTmetrix; mida el tiempo de carga y el número de solicitudes HTTP antes y después de la instalación.

No conserve peso muerto. Cada plugin no utilizado implica código PHP adicional en cada solicitud. Audite periódicamente su lista de plugins activos y elimine aquellos sin los que su sitio pueda funcionar. Si un plugin «podría ser útil dentro de seis meses», desactívelo y elimínelo, luego instale una versión nueva dentro de seis meses.

Ejemplo del mundo real: Contact Form 7

Contact Form 7 es el sujeto de prueba perfecto. Añade a cada página:

  • style.css para los estilos del formulario
  • scripts.js para la lógica de validación y envío

Incluso si una página no tiene el shortcode [contact-form-7], ambos archivos se cargan fielmente. La captura de pantalla a continuación muestra el panel Red de Chrome DevTools, que no miente:

Panel de red mostrando recursos del plugin Contact Form 7

La solución: modificar la lógica de carga dentro del plugin (lo cual se romperá al actualizar) o desactivar selectivamente el plugin para todas las páginas excepto la que necesita. El segundo enfoque es más fiable, así que centrémonos en él.

Paso 1. Obtener la lista de plugins activos mediante PHP

Antes de filtrar, necesita entender dónde almacena WordPress la lista de plugins activos. Todos están en la tabla wp_options, en la fila con la clave active_plugins. Puede recuperar el array con una sola función get_option.

Añada este código al plugin Code Snippets o a su propio archivo de plugin (no olvide el encabezado del plugin al principio):

1<?php
2/**
3 * Plugin Name: Active Plugins Lister
4 */
5
6add_shortcode( 'activeplugins', function() {
7 $active_plugins = get_option( 'active_plugins' );
8 $plugins = "";
9 if ( count( $active_plugins ) > 0 ) {
10 $plugins = "<ul>";
11 foreach ( $active_plugins as $plugin ) {
12 $plugins .= "<li>" . $plugin . "</li>";
13 }
14 $plugins .= "</ul>";
15 }
16 return $plugins;
17} );

Guarde el archivo como active-plugins.php y súbalo a /wp-content/plugins/. Cree una página de prueba, inserte el shortcode [activeplugins] y obtendrá una lista numerada de todos los plugins activos en formato folder/file.php.

Tabla wp_options con plugins activos

Así se ve el resultado tras insertar el shortcode en una página:

Lista de plugins activos mediante shortcode

Paso 2. El filtro option_active_plugins: su herramienta principal

Ahora la herramienta principal: el filtro option_active_plugins. Pertenece a la familia de filtros option_$option_name y se ejecuta cada vez que WordPress recupera un valor de opción de la base de datos. Dado que los plugins activos se almacenan como la opción active_plugins, este filtro le permite modificar el array sobre la marcha: eliminar plugins no deseados o añadir otros nuevos.

Aquí tiene un ejemplo mínimo que activa mediante programación Advanced Custom Fields (asumiendo que el plugin ya está instalado):

1add_filter( 'option_active_plugins', function( $plugins ) {
2 $myplugin = "advanced-custom-fields/acf.php";
3 if ( ! in_array( $myplugin, $plugins ) ) {
4 $plugins[] = $myplugin;
5 }
6 return $plugins;
7} );

Este código añade ACF a la lista de plugins activos en cada página. No es particularmente práctico, pero el principio es claro: usted puede modificar el array $plugins como desee.

Nota importante: el filtro debe ejecutarse antes que los plugins regulares, de lo contrario WordPress leerá primero la lista sin filtrar. Para eso sirven los mu-plugins.

Paso 3. Crear un mu-plugin para la desactivación selectiva

Los plugins must-use residen en /wp-content/mu-plugins/ y se ejecutan antes que todos los plugins regulares. Eso es exactamente lo que necesitamos: que nuestro filtro tome el control primero.

Hay una trampa: las etiquetas condicionales de WordPress (is_page(), is_single() y otras) no funcionan en los mu-plugins porque la solicitud aún no se ha analizado, por lo que todas devuelven false. Usted debe analizar la URL manualmente mediante $_SERVER['REQUEST_URI'].

Aquí tiene un mu-plugin listo para usar que desactiva Contact Form 7 en todas las páginas excepto en /contact/:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugin = "contact-form-7/wp-contact-form-7.php";
10 $k = array_search( $myplugin, $plugins );
11
12 if ( false !== $k && false === $is_contact_page ) {
13 unset( $plugins[ $k ] );
14 }
15
16 return $plugins;
17 } );
18}

Analicémoslo línea por línea:

  • parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) extrae la ruta de la solicitud (por ejemplo, /blog/kak-otkljuchit-plaginy/)
  • strpos( $request_uri, '/wp-admin/' ) verifica si estamos en el área de administración; si es así, el filtro no se aplica, manteniendo accesibles las páginas de configuración del plugin
  • array_search( $myplugin, $plugins ) encuentra CF7 en el array de plugins activos
  • unset( $plugins[ $k ] ) elimina el plugin de la lista si NO estamos en la página de contacto

Guarde el archivo, súbalo a /wp-content/mu-plugins/ y limpie la caché. Ahora el shortcode [activeplugins] debería mostrar Contact Form 7 solo en la página /contact/.

Así se ve el mismo principio para varios plugins a la vez. En lugar de array_search con un solo plugin, use un array y array_diff:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugins = array(
10 "contact-form-7/wp-contact-form-7.php",
11 "code-snippets/code-snippets.php",
12 "query-monitor/query-monitor.php",
13 "autoptimize/autoptimize.php"
14 );
15
16 if ( false === $is_contact_page ) {
17 $plugins = array_diff( $plugins, $myplugins );
18 }
19
20 return $plugins;
21 } );
22}

La función array_diff devuelve los valores del primer array que no están en el segundo, justo lo que necesita para la desactivación masiva.

El resultado es inmediatamente visible en el panel Red: el archivo script.js de Contact Form 7 desaparece de la lista de recursos en todas las páginas excepto en la de contacto.

Lista de recursos de página sin script de Contact Form 7

El enfoque programático es flexible, pero requiere cambios de código para cada nuevo plugin. Para quienes prefieren una interfaz visual, existen plugins de filtro ya preparados.

Enfoque basado en plugins: filtrar sin programar

Plugin Load Filter

Plugin Load Filter es una herramienta gratuita para filtrar plugins según varias condiciones. Permite:

  • filtrar por tipo de contenido (entradas, páginas, tipos de contenido personalizados)
  • filtrar por formato de entrada
  • excepciones para módulos de Jetpack
  • filtrado de URL para solicitudes de la API REST, Heartbeat, AJAX y AMP
Interfaz de Plugin Load Filter

Ajustes para activar el filtro por tipo de página:

Ajustes de página para Plugin Load Filter

Tras la activación, el administrador configura a qué páginas se aplica el filtro mediante la pestaña «Filter Activation by Page Type». Minimalista y directo.

Plugin Organizer

Plugin Organizer es un veterano entre los plugins de filtrado con una valoración de 5 estrellas. Le da control total sobre la carga:

  • desactivación selectiva de plugins por URL de página
  • desactivación por rol de usuario
  • grupos de plugins (activar o desactivar varios a la vez)
  • modificación del orden de carga de los plugins
Página de ajustes globales de Plugin Organizer

En la página «Global Plugins», puede arrastrar y soltar para desactivar globalmente un plugin en todo el sitio y reactivarlo selectivamente en páginas específicas mediante un metabox en el editor de entradas. En la captura de pantalla siguiente, Contact Form 7 está desactivado globalmente:

Contact Form 7 desactivado globalmente en Plugin Organizer

Y aquí aparece ese mismo metabox en la pantalla de edición de la página de contacto, que anula los ajustes globales:

Metabox de Plugin Organizer en la página de contacto

Plugin Organizer también muestra información de depuración: qué plugins se cargaron realmente en cada página y por qué. La documentación está disponible en el sitio web del desarrollador.

Perfmatters

Perfmatters es una herramienta premium del equipo de desarrollo de Kinsta. Su función principal, el Administrador de scripts, agrupa todos los scripts y estilos por nombre de plugin o tema.

Perfmatters Script Manager

Usted puede desactivar un plugin por completo o eliminar selectivamente archivos CSS/JS individuales dentro de él. Para sitios con estructuras de URL complejas, existe la desactivación de scripts mediante expresiones regulares.

Tres escenarios donde Perfmatters ofrece ganancias inmediatas:

  • Plugins de redes sociales (botones de compartir): desactivados en todas partes excepto en las entradas del blog
  • Contact Form 7: desactivado en todas partes excepto en la página del formulario
  • Estilos del editor de bloques Gutenberg (block-library/style.min.css y theme.min.css): eliminados para sitios que usan el editor clásico

En una prueba independiente en woorkup.com, desactivar scripts innecesarios mediante Perfmatters redujo el tiempo de carga total en un 20,2%, las solicitudes HTTP en la página de inicio de 46 a 30 y el tamaño de página de 506,3 KB a 451,6 KB.

Resultados de test de velocidad con Perfmatters

Perfmatters es un plugin de pago, y se justifica para sitios donde la velocidad impacta directamente en la conversión. Para un blog pequeño, Plugin Organizer o un mu-plugin programático serán suficientes.

Medir resultados con el monitor de red del navegador

Optimizar sin medir es adivinar. Las DevTools del navegador le ofrecen una imagen precisa del antes y el después sin servicios de terceros. Cualquier navegador moderno funciona:

En una instalación de WordPress de prueba con 18 plugins activos, medimos la velocidad de página antes del filtrado (caché vacía, Monitor de red de Firefox):

Análisis de rendimiento en Firefox antes de la optimización

Resultado: 255,19 KB, tiempo de carga 1,24 segundos, 12 solicitudes.

Después de instalar Plugin Organizer y desactivar globalmente Contact Form 7, el gráfico circular cambió:

Análisis de rendimiento en Firefox tras desactivar CF7

Métricas: 104,21 KB, tiempo de carga 0,80 segundos, 8 solicitudes.

Finalmente, desactivamos todos los plugins no utilizados:

Análisis de rendimiento en Firefox tras optimización completa

Resultado final: 101,98 KB, tiempo de carga 0,46 segundos, 8 solicitudes.

Comparando los extremos: el tamaño de los recursos se redujo a más de la mitad (de 255 a 102 KB), el tiempo de carga bajó de 1,24 a 0,46 segundos y las solicitudes HTTP pasaron de 12 a 8. Las cifras hablan por sí solas: la desactivación selectiva de plugins ofrece ganancias de velocidad notables incluso en un sitio pequeño, y la degradación del TTFB y el LCP afecta directamente al posicionamiento en buscadores.

⁉️🤔 Preguntas frecuentes

¿Es obligatorio un mu-plugin o puedo dejar el código en un plugin normal?

Puede usar un plugin normal, pero el orden de carga puede arruinarlo todo. Si su filtro option_active_plugins se carga después de que WordPress ya haya leído la lista de plugins activos, no funcionará. Un mu-plugin es la única forma de garantizar que su filtro tome el control antes que todos los demás plugins. En un plugin normal, usted depende del orden alfabético o de ganchos que pueden cambiar tras cualquier actualización de otro plugin.

¿Qué hago si no puedo crear la carpeta mu-plugins en mi alojamiento?

Puede crear la carpeta /wp-content/mu-plugins/ mediante FTP, el gestor de archivos de su alojamiento o WP-CLI con el comando wp scaffold mu-plugin. Si no tiene ningún acceso al sistema de archivos, use Plugin Organizer: hace lo mismo mediante su propio mecanismo de filtrado y no requiere editar archivos del servidor. La mayoría de los proveedores de alojamiento dan acceso a wp-content a través de un gestor de archivos en el panel de control. Permisos de la carpeta: 0755.

¿Desactivar un plugin mediante el filtro afecta a sus ajustes?

No, los ajustes del plugin se almacenan en la base de datos (tabla wp_options) y permanecen intactos. Usted simplemente impide que WordPress cargue el código del plugin al procesar una solicitud concreta. Todos los ajustes se conservan y, en la siguiente solicitud donde el plugin no se filtre, se carga con toda su funcionalidad. La desactivación mediante option_active_plugins bloquea específicamente la carga de código sobre la marcha, no es una desactivación real. En el área de administración, el plugin sigue activo, sus ajustes no se tocan y las tareas programadas (WP-Cron) continúan funcionando.

¿Cómo verifico que el filtro está funcionando realmente?

El método más visual es el panel Red en las herramientas de desarrollo de Chrome (F12 → Red). Ábralo en una página donde el plugin debería estar desactivado, refresque manteniendo Ctrl pulsado (para vaciar la caché) y busque el nombre del plugin o su archivo CSS/JS. Si no hay solicitudes, el filtro está funcionando. Plugins como Query Monitor también muestran la lista de componentes cargados y su tiempo de ejecución. Para Contact Form 7, escriba contact-form-7 en la búsqueda de Red; si el filtro funcionó, no verá style.css ni scripts.js de CF7 en la lista de recursos cargados.

¿Tiene sentido desactivar plugins en un sitio muy pequeño con solo 5-7 plugins?

Si los 5 plugins son realmente necesarios en cada página, no. Pero incluso en un sitio pequeño, a menudo hay un par de plugins que solo funcionan en una página: un formulario de contacto, una galería de portafolio, un slider de la página de inicio. Desactivar ese par en las demás páginas reduce notablemente las solicitudes HTTP y acelera la carga. Como vimos arriba en la instalación de prueba, incluso un solo plugin filtrado recorta decenas de milisegundos. Para un sitio con más de 1000 visitantes diarios, esos milisegundos suman una diferencia notable tanto para el usuario como para las Core Web Vitals.

Código, plugin o Perfmatters: qué elegir para su tarea

Si su sitio tiene 5 plugins y todos son realmente necesarios en cada página, esta guía no es para usted. Pero un sitio WordPress típico acumula entre 15 y 25 plugins activos, de los cuales solo 5-7 funcionan realmente en una página determinada. El resto solo consume tiempo de servidor y ralentiza la carga.

Un mu-plugin programático es un enfoque gratuito, ligero y totalmente controlable, pero requiere atención con cada plugin nuevo. Plugin Organizer es el punto ideal: interfaz visual, flexibilidad y gratuito. Perfmatters es la elección para proyectos comerciales donde cada décima de segundo en el tiempo de carga se traduce en dinero.

Si ha acumulado más plugins de los que necesita, empiece con una auditoría y una limpieza de los que no use, y luego tome el control de la carga de los que queden. Elija su enfoque según su nivel de comodidad y la carga del sitio, y verá la diferencia en su primera medición de Red. No espere a que los plugins se coman su TTFB.