Files
roi-theme/inc/adsense-delay.php
FrankZamora de5fff4f5c Fase 1: Estructura Base y DI Container - Clean Architecture
COMPLETADO: Fase 1 de la migración a Clean Architecture + POO

## Estructura de Carpetas
- ✓ Estructura completa de 4 capas (Domain, Application, Infrastructure, Presentation)
- ✓ Carpetas de Use Cases (SaveComponent, GetComponent, DeleteComponent, SyncSchema)
- ✓ Estructura de tests (Unit, Integration, E2E)
- ✓ Carpetas de schemas y templates

## Composer y Autoloading
- ✓ PSR-4 autoloading configurado para ROITheme namespace
- ✓ Autoloader optimizado regenerado

## DI Container
- ✓ DIContainer implementado con patrón Singleton
- ✓ Métodos set(), get(), has() para gestión de servicios
- ✓ Getters específicos para ComponentRepository, ValidationService, CacheService
- ✓ Placeholders que serán implementados en Fase 5
- ✓ Prevención de clonación y deserialización

## Interfaces
- ✓ ComponentRepositoryInterface (Domain)
- ✓ ValidationServiceInterface (Application)
- ✓ CacheServiceInterface (Application)
- ✓ Component entity placeholder (Domain)

## Bootstrap
- ✓ functions.php actualizado con carga de Composer autoloader
- ✓ Inicialización del DIContainer
- ✓ Helper function roi_container() disponible globalmente

## Tests
- ✓ 10 tests unitarios para DIContainer (100% cobertura)
- ✓ Total: 13 tests unitarios, 28 assertions
- ✓ Suite de tests pasando correctamente

## Validación
- ✓ Script de validación automatizado (48/48 checks pasados)
- ✓ 100% de validaciones exitosas

La arquitectura base está lista para la Fase 2.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 13:48:24 -06:00

151 lines
5.2 KiB
PHP

<?php
/**
* AdSense Delay Loading Functionality
*
* Delays the loading of AdSense scripts until user interaction or timeout
* to improve initial page load performance.
*
* @package ROI_Theme
* @since 1.0.0
*/
// Exit if accessed directly
if (!defined('ABSPATH')) {
exit;
}
/**
* Retarda la carga de scripts de AdSense interceptando el buffer de salida
*
* Esta función inicia el output buffering y reemplaza los scripts de AdSense
* con versiones retrasadas cuando se renderiza la página.
*/
function roi_delay_adsense_scripts() {
// Solo ejecutar en frontend
if (is_admin()) {
return;
}
// Verificar si el retardo de AdSense está habilitado en las opciones del tema
$delay_enabled = roi_get_option('roi_adsense_delay_enabled', '1');
if ($delay_enabled !== '1') {
return;
}
// Iniciar output buffering
ob_start('roi_replace_adsense_scripts');
}
add_action('template_redirect', 'roi_delay_adsense_scripts', 1);
/**
* Reemplaza scripts de AdSense con versiones retrasadas
*
* Esta función procesa la salida HTML y reemplaza las etiquetas de script
* estándar de AdSense con versiones de carga retrasada.
*
* @param string $html El contenido HTML a procesar
* @return string HTML modificado con scripts de AdSense retrasados
*/
function roi_replace_adsense_scripts($html) {
// Solo procesar si hay contenido real de AdSense
if (strpos($html, 'pagead2.googlesyndication.com') === false &&
strpos($html, 'adsbygoogle.js') === false) {
return $html;
}
// Patrones para encontrar etiquetas de script de AdSense
$patterns = array(
// Buscar etiquetas de script async para AdSense
'/<script\s+async\s+src=["\']https:\/\/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js[^"\']*["\']\s*(?:crossorigin=["\']anonymous["\'])?\s*><\/script>/i',
// Buscar etiquetas de script sin async
'/<script\s+src=["\']https:\/\/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js[^"\']*["\']\s*(?:crossorigin=["\']anonymous["\'])?\s*><\/script>/i',
// Buscar scripts inline de adsbygoogle.push
'/<script>\s*\(adsbygoogle\s*=\s*window\.adsbygoogle\s*\|\|\s*\[\]\)\.push\(\{[^}]*\}\);\s*<\/script>/is',
);
// Reemplazar scripts async de AdSense con versiones retrasadas
$replacements = array(
// Reemplazar etiqueta de script async con atributo data para carga retrasada
'<script type="text/plain" data-adsense-script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" crossorigin="anonymous"></script>',
// Reemplazar etiqueta de script no-async
'<script type="text/plain" data-adsense-script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" crossorigin="anonymous"></script>',
// Reemplazar scripts de push inline con versiones retrasadas
'<script type="text/plain" data-adsense-push>$0</script>',
);
// Primera pasada: reemplazar etiquetas de script
$html = preg_replace($patterns[0], $replacements[0], $html);
$html = preg_replace($patterns[1], $replacements[1], $html);
// Segunda pasada: reemplazar llamadas inline de push
$html = preg_replace_callback(
'/<script>\s*\(adsbygoogle\s*=\s*window\.adsbygoogle\s*\|\|\s*\[\]\)\.push\(\{[^}]*\}\);\s*<\/script>/is',
function($matches) {
return '<script type="text/plain" data-adsense-push>' . $matches[0] . '</script>';
},
$html
);
// Agregar comentario para indicar que se procesó (solo en modo debug)
if (defined('WP_DEBUG') && WP_DEBUG) {
$html = str_replace('</body>', '<!-- Scripts de AdSense retrasados por ROI Theme --></body>', $html);
}
return $html;
}
/**
* Agrega script inline para inicializar AdSense retrasado
*
* Esto agrega un pequeño script inline que marca AdSense como listo para cargar
* después de que adsense-loader.js ha sido enqueued.
*/
function roi_add_adsense_init_script() {
$delay_enabled = roi_get_option('roi_adsense_delay_enabled', '1');
if ($delay_enabled !== '1' || is_admin()) {
return;
}
?>
<script>
// Inicializar flag de retardo de AdSense
window.roiAdsenseDelayed = true;
</script>
<?php
}
add_action('wp_head', 'roi_add_adsense_init_script', 1);
/**
* INSTRUCCIONES DE USO:
*
* Para activar el retardo de carga de AdSense:
* 1. Ir al panel de opciones del tema (Dashboard > ROI Theme Options)
* 2. En la sección "Performance", activar la opción "Delay AdSense Loading"
* 3. Guardar cambios
*
* Comportamiento:
* - Los scripts de AdSense NO se cargarán hasta que el usuario:
* * Haga scroll en la página
* * Haga click en cualquier parte
* * Toque la pantalla (móviles)
* * Mueva el mouse
* * Presione una tecla
* - Si no hay interacción, los scripts se cargarán después de 5 segundos
*
* Beneficios:
* - Mejora significativa en Core Web Vitals (FID, TBT)
* - Reduce el tiempo de carga inicial de la página
* - No afecta la monetización (los ads se siguen mostrando)
* - Sin layout shifts al cargar los ads
*
* Para desactivar:
* - Desmarcar la opción en el panel de opciones del tema
* - Los scripts de AdSense se cargarán normalmente
*/