Como estructurar un mu-plugin con autoload en PHP en WordPress

Contents

Introducción

Este artículo explica en detalle cómo estructurar un mu-plugin (must-use plugin) en WordPress que utilice un autoload en PHP. Verás buenas prácticas, opciones (autoloader manual o Composer), ejemplos de código listos para usar y recomendaciones de despliegue y seguridad. No incluiré el título principal, ya que se añadirá por el sistema donde se publicará el artículo.

¿Qué es un mu-plugin y por qué usar autoload?

Un mu-plugin es un plugin que WordPress carga automáticamente desde la carpeta wp-content/mu-plugins. Se usan para funcionalidades que deben estar siempre activas, por ejemplo integraciones críticas, configuraciones de red multisite o funcionalidades de seguridad.

Usar un autoload permite organizar el código en múltiples clases y archivos sin necesidad de requires manuales por cada archivo. Facilita la modularidad, las pruebas y la carga bajo demanda de clases cuando se instancian.

Ventajas de estructurar un mu-plugin con autoload

  • Organización: separas responsabilidades por clases y namespaces.
  • Escalabilidad: puedes añadir módulos sin tocar un archivo bootstrap grande.
  • Mantenimiento: integración más sencilla con herramientas como Composer y PSR-4.
  • Compatibilidad: reduce conflictos al encapsular código en espacios de nombres (namespaces).

Requisitos y consideraciones previas

  • Acceso a wp-content/mu-plugins para subir el mu-plugin.
  • Conocimiento básico de namespaces y autoloading en PHP.
  • Si usas Composer, debes desplegar también la carpeta vendor o ejecutar composer install en el servidor.
  • Ten en cuenta que mu-plugins se cargan muy temprano: utiliza hooks apropiados (por ejemplo muplugins_loaded o init) para ejecutar código que dependa de recursos cargados posteriormente.

Estructura recomendada del mu-plugin

Una estructura recomendada, simple y organizada, es:

  • wp-content/mu-plugins/mi-mu-plugin.php (archivo bootstrap visible en la raíz de mu-plugins)
  • wp-content/mu-plugins/mi-mu-plugin/
    • composer.json (opcional, si usas Composer)
    • vendor/ (si usas Composer puede incluirse en despliegue)
    • src/
      • Bootstrap.php (o similar)
      • Namespace/
        • SomeClass.php
        • Controllers/…
    • readme.txt (opcional)

Reglas importantes

  • WordPress solo incluye ficheros ubicados directamente en la carpeta mu-plugins. Si necesitas carga desde subcarpetas, usa un archivo bootstrap en mu-plugins que incluya o registre el autoloader y cargue la estructura.
  • Protege el acceso directo a los archivos PHP con una comprobación como if (!defined(WPINC)) die o if (!defined(ABSPATH)) exit.
  • Prefiere namespaces para reducir el riesgo de colisiones con otros plugins o con el core.
  • Usa hooks de WordPress apropiados: muplugins_loaded se dispara justo después de cargar los mu-plugins.

Ejemplo 1 — Bootstrap sencillo autoloader SPL (manual)

Este enfoque registra un autoloader básico y carga clases por namespace prefijal. Coloca un archivo bootstrap en la raíz del mu-plugin y referencia el src/.

Archivo mu-plugins/mi-mu-plugin.php (bootstrap público):

lt?php
// Evitar acceso directo
if ( ! defined( WPINC ) ) {
    die
}

/
  Punto de entrada público del mu-plugin.
  Incluimos el bootstrap de la carpeta del plugin.
 /
require_once __DIR__ . /mi-mu-plugin/bootstrap.php

Archivo mu-plugins/mi-mu-plugin/bootstrap.php (registro del autoloader y arranque):

lt?php
if ( ! defined( WPINC ) ) {
    exit
}

// Definir base path constante
if ( ! defined( MM_PLUGIN_DIR ) ) {
    define( MM_PLUGIN_DIR, __DIR__ )
}

// Registrar autoloader simple PSR-4-like
spl_autoload_register( function ( class ) {
    // Namespace raíz esperado
    prefix = MiMuPlugin
    base_dir = MM_PLUGIN_DIR . /src/

    // ¿la clase usa el prefijo?
    len = strlen( prefix )
    if ( strncmp( prefix, class, len ) !== 0 ) {
        return
    }

    // Obtener la parte relativa
    relative_class = substr( class, len )
    // Reemplazar namespace por directorios y añadir .php
    file = base_dir . str_replace( , /, relative_class ) . .php

    if ( file_exists( file ) ) {
        require file
    }
} )

// Registrar inicialización en hook apropiado
add_action( muplugins_loaded, function() {
    // Instanciar el cargador principal o ejecutar bootstrap de la app
    if ( class_exists( MiMuPluginBootstrap ) ) {
        MiMuPluginBootstrap::init()
    }
} )

Ejemplo de clase en src/Bootstrap.php:

lt?php
namespace MiMuPlugin

class Bootstrap {
    public static function init() {
        // Código de inicialización: registrar hooks, cargar dependencias, etc.
        add_action( init, [ __CLASS__, on_init ] )
    }

    public static function on_init() {
        // Código que necesita WP más cargado (taxonomías, CPTs, etc.)
    }
}

Notas sobre este enfoque

  • Simple de implementar, no depende de Composer.
  • Admite PSR-4 básico si respetas el namespace y la estructura de carpetas.
  • Si necesitas características avanzadas (autocarga de vendor, polyfills), mejor usar Composer.

Ejemplo 2 — Usando Composer (recomendado para proyectos complejos)

Composer facilita la autogestión de dependencias y el autoload PSR-4. La idea es tener el composer.json dentro de la carpeta del mu-plugin (o en el proyecto y ajustar rutas) y exponer un único archivo en la raíz de mu-plugins que incluya vendor/autoload.php.

Ejemplo de composer.json:

{
  name: mi/mi-mu-plugin,
  description: Mi mu-plugin con autoload PSR-4,
  type: library,
  autoload: {
    psr-4: {
      MiMuPlugin: src/
    }
  },
  require: {}
}

Comandos para instalar dependencias en desarrollo (terminal):

composer install

Archivo público mu-plugins/mi-mu-plugin.php:

lt?php
if ( ! defined( WPINC ) ) {
    die
}

plugin_dir = __DIR__ . /mi-mu-plugin

// Incluir autoload de Composer (asegúrate de que vendor exista o lo despliegues)
autoload = plugin_dir . /vendor/autoload.php
if ( file_exists( autoload ) ) {
    require_once autoload
}

// Iniciar la aplicación
if ( class_exists( MiMuPluginBootstrap ) ) {
    add_action( muplugins_loaded, function() {
        MiMuPluginBootstrap::init()
    } )
}

Bootstrap y clases quedan en src/ y se autoload con PSR-4. Con Composer puedes añadir dependencias externas de forma controlada.

Consejos de despliegue con Composer

  • Opción A: Ejecutar composer install en el servidor (requiere composer en servidor).
  • Opción B: Ejecutar composer install en tu entorno local y subir la carpeta vendor dentro de mi-mu-plugin al servidor.
  • Evita incluir archivos innecesarios en producción puedes usar composer install –no-dev –optimize-autoloader.

Buenas prácticas y seguridad

  • Comprobar definidos como WPINC o ABSPATH para evitar ejecución fuera de WP.
  • Encapsular funcionalidad en namespaces y clases en lugar de declarar funciones globales.
  • Evitar side-effects en tiempo de carga: preferir registrar hooks en lugar de ejecutar lógica intensa en el include.
  • Si tu mu-plugin expone endpoints o callbacks, sanitiza y valida siempre entradas (escapar salidas con esc_html, esc_attr, etc.).
  • Controla la compatibilidad con versiones de PHP: declara la versión mínima requerida en composer.json o documenta la compatibilidad.

Tests, debugging y mantenimiento

  • Usa autoload para facilitar pruebas unitarias: separa lógica de presentación para poder testear clases mediante PHPUnit.
  • Para debugging local, activa WP_DEBUG y logs. No publiques archivos de debug en producción.
  • Mantén actualizado composer.lock y documenta el proceso de despliegue para que el equipo sepa cómo reinstalar dependencias.

Consideraciones finales y checklist de implementación

  1. Crear archivo público en wp-content/mu-plugins que actúe como bootstrap/entry-point.
  2. Registrar un autoloader (manual o Composer) desde el bootstrap.
  3. Estructurar src/ con namespaces y seguir PSR-4 si usas Composer.
  4. Proteger archivos con comprobación de constante WP (WPINC o ABSPATH).
  5. Registrar inicialización en hooks adecuados (muplugins_loaded, init, etc.).
  6. Empaquetar vendor o ejecutar composer install en despliegue.

Recursos útiles

Con la estructura descrita y los ejemplos provistos puedes construir un mu-plugin modular y mantenible que aproveche autoloading para facilitar escalabilidad y compatibilidad con prácticas modernas de PHP. Implementa nombres de espacio claros, protege tus archivos y elige Composer cuando tu proyecto lo requiera.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *