fix(wrappers): eliminar wrappers vacíos y corregir exclusiones AdSense (Plan 99.15)

## Problema
- Componentes deshabilitados/excluidos dejaban wrappers HTML vacíos
  (navbar 32px, sidebar col-lg-3 294px)
- AdSense ignoraba exclusiones por URL pattern en grupo _exclusions

## Solución Plan 99.15 (Clean Architecture)

### Domain Layer
- WrapperVisibilityCheckerInterface: contrato para verificar visibilidad

### Application Layer
- CheckWrapperVisibilityUseCase: orquesta verificaciones de visibilidad

### Infrastructure Layer
- WordPressComponentVisibilityRepository: consulta BD + PageVisibilityHelper
- WrapperVisibilityService: facade estático para templates
- BodyClassHooksRegistrar: agrega clases CSS failsafe al body

### Templates modificados
- header.php: renderizado condicional de <nav> wrapper
- page.php/single.php: lógica dinámica col-lg-9/col-lg-12 según sidebar

### CSS Failsafe
- css-global-utilities.css: reglas body.roi-hide-* como respaldo

## Fix AdSense (Inc/adsense-placement.php)
- Agregado PageVisibilityHelper::shouldShow() a todas las funciones:
  roi_render_ad_slot, roi_render_rail_ads, roi_enqueue_adsense_script,
  roi_inject_content_ads, roi_render_anchor_ads, roi_render_vignette_ad,
  roi_enqueue_anchor_vignette_scripts

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-12-04 11:46:21 -06:00
parent 23339e3349
commit 36d5cf56de
12 changed files with 617 additions and 12 deletions

View File

@@ -370,6 +370,11 @@ add_action('after_setup_theme', function() {
$criticalCSSService = roi_get_critical_css_service();
$hooksRegistrar = new \ROITheme\Shared\Infrastructure\Wordpress\CriticalCSSHooksRegistrar($criticalCSSService);
$hooksRegistrar->register();
// 3. Body Class Hooks (Plan 99.15) - CSS failsafe para componentes ocultos
$container = \ROITheme\Shared\Infrastructure\Di\DIContainer::getInstance();
$bodyClassHooksRegistrar = $container->getBodyClassHooksRegistrar();
$bodyClassHooksRegistrar->register();
});
// =============================================================================
@@ -378,6 +383,47 @@ add_action('after_setup_theme', function() {
// NO hardcodear CSS aquí - viola la arquitectura Clean Architecture.
// =============================================================================
// =============================================================================
// HELPER FUNCTION: roi_should_render_wrapper() - Plan 99.15
// =============================================================================
/**
* Verifica si el wrapper de un componente debe renderizarse
*
* Evalúa:
* - is_enabled
* - show_on_mobile / show_on_desktop
* - Exclusiones (categoría, post ID, URL pattern, page visibility)
*
* USO EN TEMPLATES:
* ```php
* if (roi_should_render_wrapper('navbar')) {
* echo '<nav class="navbar">';
* echo roi_render_component('navbar');
* echo '</nav>';
* }
* ```
*
* @param string $componentName Nombre del componente (kebab-case)
* @return bool True si el wrapper debe renderizarse
* @see Plan 99.15 - Fix Empty Layout Wrappers
*/
function roi_should_render_wrapper(string $componentName): bool {
return \ROITheme\Shared\Infrastructure\Services\WrapperVisibilityService::shouldRenderWrapper($componentName);
}
/**
* Verifica si AL MENOS UN componente de una lista debe renderizarse
*
* Útil para determinar si mostrar columna sidebar
*
* @param array<string> $componentNames Lista de nombres de componentes
* @return bool True si al menos uno debe mostrarse
*/
function roi_should_render_any_wrapper(array $componentNames): bool {
return \ROITheme\Shared\Infrastructure\Services\WrapperVisibilityService::shouldRenderAnyWrapper($componentNames);
}
// =============================================================================
// HELPER FUNCTION: roi_get_adsense_search_config()
// =============================================================================