Un mu-plugin de WordPress (must-use plugin, o plugin de uso obligatorio) es un archivo PHP ubicado en wp-content/mu-plugins/ que WordPress carga automáticamente en cada petición. No se puede desactivar desde el panel de administración y se ejecuta antes que cualquier plugin normal. Úsalo para código que siempre debe estar presente: hooks personalizados, reglas de seguridad, ajustes de rendimiento o constantes de carga temprana.
Otro caso de uso de un mu-plugin es añadir funciones adicionales a un plugin o al núcleo de WP. Por ejemplo, WP STAGING cuenta con numerosos filtros y hooks que pueden aportar más posibilidades a la función de staging o copia de seguridad de WP STAGING. Todos estos filtros documentados pueden añadirse a un mu-plugin personalizado.
Respuesta rápida: Coloca un archivo
.phpcon una cabecera de plugin enwp-content/mu-plugins/. WordPress lo detecta en la siguiente carga de página, sin necesidad de activarlo. Comprueba en Plugins → Plugins de uso obligatorio que se ha cargado.
Introducción a los plugins de uso obligatorio
Los mu-plugins viven en wp-content/mu-plugins/ (la ruta se controla mediante la constante WPMU_PLUGIN_DIR) y WordPress los carga antes que cualquier plugin de wp-content/plugins/. No aparecen en la lista estándar de plugins y no se pueden desactivar desde la interfaz de administración.
El escenario más habitual en el que los desarrolladores recurren a un mu-plugin: tienen una función o un filtro que se rompe una y otra vez porque otro administrador desactiva el plugin que lo contenía, o porque una actualización de un plugin sobrescribe una personalización. Un mu-plugin elimina ambos riesgos de una sola vez.
La documentación oficial de WordPress cubre los plugins de uso obligatorio en wordpress.org/documentation/article/must-use-plugins/.
¿Cómo se compara un mu-plugin con otros lugares donde podrías poner el mismo código?
| Opción | Se carga automáticamente | Sobrevive a las actualizaciones de plugins | El admin puede desactivarlo | Ideal para |
|---|---|---|---|---|
| mu-plugin | Sí | Sí | No | Hooks de ejecución obligatoria, constantes, reglas de seguridad |
| Plugin normal | Solo cuando está activo | Sí | Sí | Funciones opcionales que controla el propietario del sitio |
wp-config.php |
Sí | Sí | No | Solo constantes PHP con define() |
.htaccess / php.ini |
Sí (a nivel de servidor) | Sí | No | Reglas de reescritura del servidor y ajustes de ini de PHP |
Ventajas de los mu-plugins
La principal ventaja frente a un plugin normal es la resistencia a manipulaciones. Cualquier usuario con permisos de administrador puede desactivar un plugin normal, o eliminarlo si se compromete una credencial. Un mu-plugin no.
Usa un mu-plugin cuando:
- El código debe ejecutarse incluso si todos los plugins normales están desactivados (una redirección de mantenimiento, una cabecera de seguridad, una regla de HTTPS forzado)
- Estás registrando acciones y filtros de WP STAGING que deben cargarse antes de que el propio plugin se inicialice
- Gestionas varios sitios WordPress y quieres un comportamiento específico del sitio fuera de plugins con control de versiones
- Quieres aplicar ajustes de PHP en tiempo de ejecución (como
memory_limit) al principio del ciclo de vida de la petición
Usa un plugin normal cuando:
- La función debe poder activarse y desactivarse por el propietario del sitio o un desarrollador
- La funcionalidad se distribuye como un producto instalable con actualizaciones automáticas
- Estás creando algo que otros plugins detectan mediante
is_plugin_active()
Cómo crear un mu-plugin de WordPress
Paso 1: Accede a los archivos de tu sitio
Conéctate a tu sitio mediante FTP, SFTP o el administrador de archivos de tu proveedor de hosting.
Paso 2: Localiza o crea el directorio mu-plugins
Navega hasta wp-content/. Busca la carpeta mu-plugins/. Si no existe, créala. WordPress empezará a cargar los archivos PHP de ese directorio de inmediato, sin más configuración.
Paso 3: Crea el archivo de tu plugin
Crea un nuevo archivo PHP, por ejemplo my-mu-plugin.php. Usa letras minúsculas y guiones (sin espacios) en el nombre del archivo. El nombre aparece en Plugins → Plugins de uso obligatorio del panel de WordPress, así que elige un nombre descriptivo.
Paso 4: Añade la cabecera del plugin y tu código
Todo mu-plugin necesita un comentario de cabecera de plugin al principio, igual que un plugin normal. A continuación se muestra la estructura mínima:
<?php
/*
Plugin Name: My Custom Mu-Plugin
Description: A custom must-use plugin to enhance my WordPress site.
Version: 1.0
Author: Mickey Mouse
*/
// Your custom code goes here
Paso 5: Sube tu mu-plugin
Sube el archivo .php a wp-content/mu-plugins/ en tu servidor.
Paso 6: Verifica la activación
No hay ningún paso de activación. Visita Plugins → Plugins de uso obligatorio en el panel de WordPress para confirmar que el archivo se ha cargado. Si no aparece, comprueba que el archivo está directamente en mu-plugins/ (y no dentro de un subdirectorio).
Ejemplo de mu-plugin: texto personalizado del pie del admin
Aquí tienes un ejemplo completo y funcional que cambia el texto del pie de página que se muestra en la parte inferior de cada pantalla de administración de WordPress:
<?php
/*
Plugin Name: Custom Admin Footer
Description: Changes the footer text in the WordPress admin area.
Version: 1.0
Author: Your Name
*/
add_filter('admin_footer_text', function () {
echo 'Customized by Tony Stark - Powered by WordPress';
});
Casos de uso habituales de los mu-plugins
Estos son los patrones que aparecen con más frecuencia en los tickets de soporte de WP STAGING y en los foros de desarrolladores:
1. Forzar el registro de depuración sin editar wp-config.php
<?php
/*
Plugin Name: Enable Debug Log
*/
if ( ! defined( 'WP_DEBUG' ) ) {
define( 'WP_DEBUG', true );
}
if ( ! defined( 'WP_DEBUG_LOG' ) ) {
define( 'WP_DEBUG_LOG', true );
}
if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) {
define( 'WP_DEBUG_DISPLAY', false );
}
Esto resulta útil en entornos de staging o de desarrollo donde quieres tener el registro activo sin tocar el wp-config.php de producción. Consulta Enable WordPress Debug Log Mode para ver el flujo de depuración completo.
2. Aumentar el límite de memoria de PHP
La directiva ini memory_limit se puede cambiar en tiempo de ejecución mediante ini_set(), lo que convierte a un mu-plugin en un lugar limpio para aplicarla antes de que se carguen los plugins normales:
<?php
/*
Plugin Name: Increase Memory Limit
*/
@ini_set( 'memory_limit', '256M' );
Nota: algunos ajustes de PHP están fijados a nivel de servidor y no se pueden cambiar con ini_set() en tiempo de ejecución. Encontrarás una referencia completa de qué directivas admiten cambios en tiempo de ejecución en php.net/manual/en/ini.list.php.
3. Código de filtros de WP STAGING
WP STAGING expone acciones y filtros documentados para controlar el comportamiento de copia de seguridad y staging. Como deben cargarse antes de que el propio WP STAGING se inicialice, un mu-plugin es el lugar adecuado para registrarlos. Coloca cualquier llamada a add_filter() o add_action() en un archivo mu-plugin y siempre estarán presentes independientemente del orden de activación de los plugins. Explora todos los hooks disponibles en la documentación de acciones y filtros de WP STAGING enlazada más abajo en Artículos relacionados.
4. Redirección HTTPS forzada
<?php
/*
Plugin Name: Force HTTPS
*/
add_action( 'template_redirect', function () {
if ( ! is_ssl() ) {
wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
exit;
}
} );
5. Desactivar XML-RPC
<?php
/*
Plugin Name: Disable XML-RPC
*/
add_filter( 'xmlrpc_enabled', '__return_false' );
Limitaciones y detalles a tener en cuenta
Antes de decidirte por un mu-plugin, conviene conocer algunos comportamientos:
Sin hook de desactivación ni de desinstalación. WordPress nunca dispara deactivate_{plugin} ni uninstall_{plugin} para los mu-plugins. Si tu plugin crea opciones, tablas personalizadas o eventos cron programados, tendrás que limpiarlos manualmente: borra el archivo y luego elimina a mano los datos almacenados.
La carga desde subdirectorios requiere un archivo cargador. WordPress solo carga los archivos PHP situados directamente en wp-content/mu-plugins/. Si colocas código en un subdirectorio (por ejemplo, mu-plugins/my-plugin/my-plugin.php), WordPress no lo detectará. El patrón habitual consiste en crear un archivo cargador ligero en la raíz de mu-plugins/ que llame a require_once sobre el archivo del subdirectorio.
Comportamiento en multisitio. En una red multisitio de WordPress, los mu-plugins se cargan en todos los sitios en cada petición. No hay un interruptor por sitio. Usa is_main_site() o get_current_blog_id() dentro del plugin si necesitas limitar el comportamiento a un sitio concreto de la red.
Orden de carga. Los mu-plugins se cargan en orden alfabético ascendente por nombre de archivo, antes que cualquier plugin de wp-content/plugins/. Si el orden entre tus mu-plugins importa, añade un prefijo a los nombres de archivo: 00-runs-first.php, 10-runs-second.php.
Visibilidad en el panel. Los mu-plugins aparecen en Plugins → Plugins de uso obligatorio, pero no muestran ningún detalle salvo que la cabecera del plugin incluya Plugin Name, Description y Version. Incluye siempre una cabecera; facilita mucho el diagnóstico cuando algo va mal.
Sin mecanismo de actualización. WordPress no tiene ninguna forma integrada de avisarte sobre los mu-plugins ni de actualizarlos. Si estás adaptando código de terceros para un mu-plugin, eres tú quien debe hacer el seguimiento de las actualizaciones y aplicarlas manualmente. Para mu-plugins desarrollados internamente esto no es un problema, pero conviene tenerlo en cuenta si estás pensando en convertir un plugin de la comunidad en un mu-plugin.
¿Dónde debería ir este código?
| Escenario | Mejor ubicación |
|---|---|
Constante PHP o define() |
wp-config.php |
| Regla de reescritura del servidor | .htaccess |
| Límite de memoria o de ejecución de PHP | .htaccess (mediante php_value) o php.ini |
| Código que usa funciones de WordPress y debe ejecutarse siempre | mu-plugin en wp-content/mu-plugins/ |
| Función opcional que controla el propietario del sitio | Plugin normal en wp-content/plugins/ |
| Salida o cambios de estilo específicos del tema | functions.php del tema hijo |
Una regla práctica útil: si tu código llama a alguna función de WordPress (add_filter, get_option, wp_redirect, etc.), ponlo en un mu-plugin. Si es un simple define() de PHP o un ajuste que debe ejecutarse antes de que arranque WordPress, wp-config.php es el lugar adecuado.
Conclusión
Un mu-plugin es la herramienta adecuada para el código que siempre debe ejecutarse y no puede arriesgarse a que se desactive por accidente. La configuración lleva unos minutos: crea wp-content/mu-plugins/, añade un archivo .php con una cabecera de plugin y WordPress se encarga del resto.
Si estás desarrollando o probando código de un mu-plugin, te recomendamos verificarlo en un entorno de staging antes de desplegarlo en producción. WP STAGING facilita clonar tu sitio en producción y confirmar que el mu-plugin se comporta como esperas antes de que tus cambios salgan en directo.