Implementación completa del sistema de Critical CSS dinámico según plan 13.01: Domain Layer: - Crear CriticalCSSCollectorInterface para DIP compliance Infrastructure Layer: - Implementar CriticalCSSCollector (singleton via DIContainer) - Crear CriticalCSSHooksRegistrar para inyección en wp_head - Actualizar DIContainer con getCriticalCSSCollector() Schemas: - Agregar campo is_critical a navbar, top-notification-bar, hero - Sincronizar con BD (18+39+31 campos) Renderers (navbar, top-notification-bar, hero): - Inyectar CriticalCSSCollectorInterface via constructor - Lógica condicional: si is_critical=true → CSS a <head> Admin (FormBuilders + FieldMappers): - Toggle "CSS Crítico" en sección visibility - Mapeo AJAX para persistencia Beneficios: - LCP optimizado: CSS crítico inline en <head> - Above-the-fold rendering sin FOUC - Componentes configurables desde admin panel 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
47 lines
1.1 KiB
PHP
47 lines
1.1 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace ROITheme\Shared\Infrastructure\Wordpress;
|
|
|
|
use ROITheme\Shared\Domain\Contracts\CriticalCSSCollectorInterface;
|
|
|
|
/**
|
|
* Registra hook wp_head para inyectar CSS crítico
|
|
*
|
|
* RESPONSABILIDAD:
|
|
* - Registrar hook wp_head
|
|
* - Delegar renderizado a CriticalCSSCollector
|
|
*
|
|
* PATRÓN:
|
|
* - DIP: Recibe interface, no clase concreta
|
|
* - SRP: Solo registra hook, no contiene lógica de CSS
|
|
*
|
|
* UBICACIÓN: Infrastructure/Wordpress (según 00.02 líneas 307-311)
|
|
*
|
|
* @package ROITheme\Shared\Infrastructure\Wordpress
|
|
*/
|
|
final class CriticalCSSHooksRegistrar
|
|
{
|
|
public function __construct(
|
|
private readonly CriticalCSSCollectorInterface $collector
|
|
) {}
|
|
|
|
/**
|
|
* Registrar hooks de WordPress
|
|
*/
|
|
public function register(): void
|
|
{
|
|
// Priority 1 = muy temprano en <head>, antes de otros estilos
|
|
add_action('wp_head', [$this, 'renderCriticalCSS'], 1);
|
|
}
|
|
|
|
/**
|
|
* Callback para wp_head
|
|
*/
|
|
public function renderCriticalCSS(): void
|
|
{
|
|
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
echo $this->collector->render();
|
|
}
|
|
}
|