Cómo hacer un mu-plugin de WordPress

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 .php con una cabecera de plugin en wp-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 No Hooks de ejecución obligatoria, constantes, reglas de seguridad
Plugin normal Solo cuando está activo Funciones opcionales que controla el propietario del sitio
wp-config.php No Solo constantes PHP con define()
.htaccess / php.ini Sí (a nivel de servidor) 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
<?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
<?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.

Artículos relacionados

Rene Hermenau

Autor: Rene Hermenau

Sobre el autor: René Hermenau es el fundador de WP STAGING. Trabaja en copias de seguridad de WordPress, entornos de staging, migraciones, gestión de bases de datos y flujos de despliegue seguros.