feat: implement is_critical CSS injection via CriticalCSSService

- Created CriticalCSSService (singleton) that queries BD directly in wp_head
- Service generates CSS BEFORE components render (priority 1)
- Renderers check is_critical flag and skip inline CSS if true
- Made generateCSS() public in Renderers for CriticalCSSService to use
- Removed CriticalCSSCollector pattern (timing issue with WordPress)

Flow:
1. wp_head (priority 1) → CriticalCSSService::render()
2. Service queries BD for components with visibility.is_critical=true
3. Generates CSS using Renderer->generateCSS() methods
4. Outputs: <style id="roi-critical-css">...</style>
5. When Renderers execute, they detect is_critical and omit CSS inline

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-11-29 10:06:38 -06:00
parent 38d7099bcd
commit ce0179a134
8 changed files with 366 additions and 179 deletions

View File

@@ -3,27 +3,32 @@ declare(strict_types=1);
namespace ROITheme\Shared\Infrastructure\Wordpress;
use ROITheme\Shared\Domain\Contracts\CriticalCSSCollectorInterface;
use ROITheme\Shared\Infrastructure\Services\CriticalCSSService;
/**
* Registra hook wp_head para inyectar CSS crítico
*
* RESPONSABILIDAD:
* - Registrar hook wp_head
* - Delegar renderizado a CriticalCSSCollector
* - Registrar hook wp_head (priority 1)
* - Delegar renderizado a CriticalCSSService
*
* FLUJO:
* 1. wp_head (priority 1) → renderCriticalCSS()
* 2. CriticalCSSService consulta BD por componentes is_critical=true
* 3. Genera CSS usando Renderers y lo inyecta en <head>
* 4. Los Renderers detectan is_critical y omiten CSS inline
*
* PATRÓN:
* - DIP: Recibe interface, no clase concreta
* - SRP: Solo registra hook, no contiene lógica de CSS
* - SRP: Solo registra hook, delega lógica a CriticalCSSService
*
* UBICACIÓN: Infrastructure/Wordpress (según 00.02 líneas 307-311)
* UBICACIÓN: Infrastructure/Wordpress
*
* @package ROITheme\Shared\Infrastructure\Wordpress
*/
final class CriticalCSSHooksRegistrar
{
public function __construct(
private readonly CriticalCSSCollectorInterface $collector
private readonly CriticalCSSService $criticalCSSService
) {}
/**
@@ -37,10 +42,14 @@ final class CriticalCSSHooksRegistrar
/**
* Callback para wp_head
*
* Ejecuta CriticalCSSService que:
* - Consulta BD por componentes con is_critical=true
* - Genera CSS usando los Renderers
* - Output: <style id="roi-critical-css">...</style>
*/
public function renderCriticalCSS(): void
{
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo $this->collector->render();
$this->criticalCSSService->render();
}
}