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

@@ -25,6 +25,8 @@ if (!defined('ABSPATH')) {
exit;
}
use ROITheme\Shared\Infrastructure\Services\PageVisibilityHelper;
/**
* Renderiza un slot de anuncio en una ubicacion
*
@@ -52,11 +54,16 @@ function roi_render_ad_slot(string $location): string
return '';
}
// Verificar exclusiones
// Verificar exclusiones legacy (forms group)
if (roi_is_ad_excluded($settings)) {
return '';
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return '';
}
// Obtener renderer desde DIContainer (DIP compliant)
$renderer = $container->getAdsensePlacementRenderer();
@@ -143,11 +150,16 @@ function roi_render_rail_ads(): string
return '';
}
// Verificar exclusiones
// Verificar exclusiones legacy (forms group)
if (roi_is_ad_excluded($settings)) {
return '';
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return '';
}
// Obtener renderer desde DIContainer (DIP compliant)
$renderer = $container->getAdsensePlacementRenderer();
@@ -193,6 +205,11 @@ function roi_enqueue_adsense_script(): void
return;
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return;
}
$publisherId = $settings['content']['publisher_id'] ?? '';
if (empty($publisherId)) {
return;
@@ -246,11 +263,16 @@ function roi_inject_content_ads(string $content): string
return $content;
}
// Verificar exclusiones
// Verificar exclusiones legacy (forms group)
if (roi_is_ad_excluded($settings)) {
return $content;
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return $content;
}
$renderer = $container->getAdsensePlacementRenderer();
// Inyectar anuncio al inicio (post-top)
@@ -446,11 +468,16 @@ function roi_render_anchor_ads(): string
return '';
}
// Verificar exclusiones
// Verificar exclusiones legacy (forms group)
if (roi_is_ad_excluded($settings)) {
return '';
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return '';
}
// Obtener renderer desde DIContainer (DIP compliant)
$renderer = $container->getAdsensePlacementRenderer();
@@ -490,11 +517,16 @@ function roi_render_vignette_ad(): string
return '';
}
// Verificar exclusiones
// Verificar exclusiones legacy (forms group)
if (roi_is_ad_excluded($settings)) {
return '';
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return '';
}
// Obtener renderer desde DIContainer (DIP compliant)
$renderer = $container->getAdsensePlacementRenderer();
@@ -556,6 +588,11 @@ function roi_enqueue_anchor_vignette_scripts(): void
return;
}
// Verificar exclusiones modernas (Plan 99.11: _exclusions, _page_visibility)
if (!PageVisibilityHelper::shouldShow('adsense-placement')) {
return;
}
// Encolar script
wp_enqueue_script(
'roi-anchor-vignette',