*/ public function injectCriticalCSS(): void { $pageType = $this->getCurrentPageType(); $snippets = $this->getCriticalUseCase->execute($pageType); if (empty($snippets)) { return; } $css = $this->combineSnippets($snippets); if (!empty($css)) { printf( '' . "\n", $css ); } } /** * Inyecta CSS diferido en footer */ public function injectDeferredCSS(): void { $pageType = $this->getCurrentPageType(); $snippets = $this->getDeferredUseCase->execute($pageType); if (empty($snippets)) { return; } $css = $this->combineSnippets($snippets); if (!empty($css)) { printf( '' . "\n", $css ); } } /** * Combina múltiples snippets en un solo string CSS * * Aplica sanitización para prevenir inyección de HTML malicioso. */ private function combineSnippets(array $snippets): string { $parts = []; foreach ($snippets as $snippet) { if (!empty($snippet['css'])) { // Sanitizar CSS: eliminar tags HTML/script $cleanCSS = wp_strip_all_tags($snippet['css']); // Eliminar caracteres potencialmente peligrosos $cleanCSS = preg_replace('/<[^>]*>/', '', $cleanCSS); $cleanName = sanitize_text_field($snippet['name'] ?? $snippet['id']); $parts[] = sprintf( "/* %s */\n%s", $cleanName, $cleanCSS ); } } return implode("\n\n", $parts); } /** * Detecta tipo de página actual */ private function getCurrentPageType(): string { if (is_front_page() || is_home()) { return 'home'; } if (is_single()) { return 'posts'; } if (is_page()) { return 'pages'; } if (is_archive() || is_category() || is_tag()) { return 'archives'; } return 'all'; } }