
WordPress carga todos los plugins activos en todas las páginas. El plugin de formularios se carga en entradas que no tienen formularios, el de la tienda se carga en el blog, el de los cursos en la página de contacto. Cada uno suma código PHP, consultas y, muchas veces, archivos CSS y JavaScript.
Con 10 plugins no se nota. Con 40, sí.
La idea
Antes de que WordPress cargue los plugins, un mu-plugin (que siempre se carga primero) revisa qué página se está pidiendo y quita de la lista los plugins que no hacen falta ahí. Para esa visita, es como si estuvieran desactivados. En el escritorio, todo sigue igual.
El mu-plugin
Guárdalo como wp-content/mu-plugins/cwp-plugins-por-pagina.php. El nombre de cada plugin es el que aparece en wp plugin list --field=file (carpeta/archivo principal):
<?php
/**
* Plugin Name: Plugins por página (Curso WordPress)
* Description: Carga ciertos plugins solo en las URLs donde se usan.
*/
// Plugin => rutas donde SÍ debe cargarse (prefijos de la URL).
const CWP_PLUGINS_SOLO_EN = array(
'contact-form-7/wp-contact-form-7.php' => array( '/contacto/', '/cotizacion/' ),
'mi-plugin-de-cursos/cursos.php' => array( '/cursos/', '/mi-cuenta/' ),
);
add_filter( 'option_active_plugins', function ( $plugins ) {
// Nunca en el escritorio, AJAX, cron, la API REST ni WP-CLI.
if ( is_admin() || wp_doing_ajax() || wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
return $plugins;
}
$ruta = wp_parse_url( $_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH ) ?: '/';
if ( 0 === strpos( $ruta, '/wp-json/' ) || false !== strpos( $ruta, 'wp-login.php' ) ) {
return $plugins;
}
foreach ( CWP_PLUGINS_SOLO_EN as $plugin => $rutas ) {
$se_usa = false;
foreach ( $rutas as $prefijo ) {
if ( 0 === strpos( $ruta, $prefijo ) ) {
$se_usa = true;
break;
}
}
if ( ! $se_usa ) {
$plugins = array_values( array_diff( $plugins, array( $plugin ) ) );
}
}
return $plugins;
} );
El filtro excluye la API REST y AJAX porque muchos plugins (los de formularios, por ejemplo) envían los datos por ahí. Si el plugin no estuviera cargado en esa petición, el formulario dejaría de funcionar.
Qué plugins se pueden filtrar
Buenos candidatos, porque su trabajo está en pocas páginas:
- Formularios: solo en las páginas que tienen un formulario.
- Sliders, galerías o tablas: solo donde se usan.
- Cursos, reservas o eventos: solo en su sección.
- Plugins de la tienda que no son WooCommerce (extras de producto, por ejemplo): solo en
/producto/,/tienda/,/carrito/y/finalizar-compra/.
Cuáles nunca
- Seguridad, caché, SEO y redirecciones: trabajan en todas las páginas.
- WooCommerce mismo: el mini carrito, las sesiones y los precios se usan en todas partes.
- Constructores visuales: si una página se hizo con el constructor, sin él se ve rota.
- Cualquier plugin que agregue un shortcode o un bloque que uses en muchas entradas.
- Plugins de los que dependen otros: si desactivas uno, el que depende de él puede dar error.
Si la caché de página está activa, vacíala después de cada cambio. Y prueba cada página afectada en una ventana de incógnito (sin sesión iniciada), porque es ahí donde el filtro actúa.
Mide la mejora
Con Query Monitor activado, abre una entrada antes y después del cambio. En el panel Overview compara el tiempo de generación de la página y la memoria usada. En la pestaña de Scripts y Styles verás también que ya no se cargan los archivos de los plugins filtrados.
La alternativa con plugin
Si prefieres no tocar código, hay plugins que hacen esto con una interfaz (te muestran una tabla con tus páginas y tus plugins y marcas dónde cargar cada uno). Funcionan con la misma técnica: un mu-plugin que filtra la lista. Elige uno con buenas valoraciones y actualizado.
¿Algún plugin deja de funcionar al filtrarlo? Cuéntanos cuál en el foro y vemos en qué peticiones necesita estar cargado.





