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
- Crear archivo público en wp-content/mu-plugins que actúe como bootstrap/entry-point.
- Registrar un autoloader (manual o Composer) desde el bootstrap.
- Estructurar src/ con namespaces y seguir PSR-4 si usas Composer.
- Proteger archivos con comprobación de constante WP (WPINC o ABSPATH).
- Registrar inicialización en hooks adecuados (muplugins_loaded, init, etc.).
- 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 🙂 |
