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>
This commit is contained in:
FrankZamora
2025-11-17 13:48:24 -06:00
parent b782ebceee
commit de5fff4f5c
149 changed files with 3187 additions and 9554 deletions

View File

@@ -5,7 +5,7 @@
* Opciones del panel de personalización para configurar
* las dos variantes del CTA (A y B).
*
* @package APUS_Theme
* @package ROI_Theme
* @since 1.0.0
*/
@@ -17,11 +17,11 @@ if (!defined('ABSPATH')) {
/**
* Registrar configuraciones del CTA en el Customizer
*/
function apus_customize_cta($wp_customize) {
function roi_customize_cta($wp_customize) {
// Agregar sección para CTA A/B Testing
$wp_customize->add_section('apus_cta', array(
'title' => __('CTA A/B Testing', 'apus-theme'),
'description' => __('Configura las dos variantes del Call-to-Action que se mostrarán aleatoriamente. El sistema asignará automáticamente una variante a cada usuario (50/50).', 'apus-theme'),
$wp_customize->add_section('roi_cta', array(
'title' => __('CTA A/B Testing', 'roi-theme'),
'description' => __('Configura las dos variantes del Call-to-Action que se mostrarán aleatoriamente. El sistema asignará automáticamente una variante a cada usuario (50/50).', 'roi-theme'),
'priority' => 132,
));
@@ -30,28 +30,28 @@ function apus_customize_cta($wp_customize) {
// =====================================================
// Habilitar/Deshabilitar CTA
$wp_customize->add_setting('apus_enable_cta', array(
$wp_customize->add_setting('roi_enable_cta', array(
'default' => true,
'sanitize_callback' => 'apus_sanitize_checkbox',
'sanitize_callback' => 'roi_sanitize_checkbox',
'transport' => 'refresh',
));
$wp_customize->add_control('apus_enable_cta', array(
'label' => __('Habilitar CTA con A/B Testing', 'apus-theme'),
'description' => __('Muestra un Call-to-Action en los posts individuales con dos variantes aleatorias.', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_enable_cta', array(
'label' => __('Habilitar CTA con A/B Testing', 'roi-theme'),
'description' => __('Muestra un Call-to-Action en los posts individuales con dos variantes aleatorias.', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'checkbox',
));
// Auto-insertar CTA (opcional, por defecto usar template tag)
$wp_customize->add_setting('apus_cta_auto_insert', array(
$wp_customize->add_setting('roi_cta_auto_insert', array(
'default' => false,
'sanitize_callback' => 'apus_sanitize_checkbox',
'sanitize_callback' => 'roi_sanitize_checkbox',
'transport' => 'refresh',
));
$wp_customize->add_control('apus_cta_auto_insert', array(
'label' => __('Auto-insertar CTA después del contenido', 'apus-theme'),
'description' => __('Si está desactivado, usa el template tag apus_display_cta() manualmente.', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_auto_insert', array(
'label' => __('Auto-insertar CTA después del contenido', 'roi-theme'),
'description' => __('Si está desactivado, usa el template tag roi_display_cta() manualmente.', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'checkbox',
));
@@ -60,66 +60,66 @@ function apus_customize_cta($wp_customize) {
// =====================================================
// Separador visual
$wp_customize->add_setting('apus_cta_a_separator', array(
$wp_customize->add_setting('roi_cta_a_separator', array(
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control(new WP_Customize_Control(
$wp_customize,
'apus_cta_a_separator',
'roi_cta_a_separator',
array(
'label' => __('━━━ Variante A: Catálogo ━━━', 'apus-theme'),
'description' => __('Enfoque en acceso al catálogo de 200,000+ APUs', 'apus-theme'),
'section' => 'apus_cta',
'label' => __('━━━ Variante A: Catálogo ━━━', 'roi-theme'),
'description' => __('Enfoque en acceso al catálogo de 200,000+ APUs', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'hidden',
)
));
// Título Variante A
$wp_customize->add_setting('apus_cta_a_title', array(
'default' => __('Accede a 200,000+ Análisis de Precios Unitarios', 'apus-theme'),
$wp_customize->add_setting('roi_cta_a_title', array(
'default' => __('Accede a 200,000+ Análisis de Precios Unitarios', 'roi-theme'),
'sanitize_callback' => 'sanitize_text_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_a_title', array(
'label' => __('Título', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_a_title', array(
'label' => __('Título', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'text',
));
// Texto Variante A
$wp_customize->add_setting('apus_cta_a_text', array(
'default' => __('Consulta estructuras completas, insumos y dosificaciones de los APUs más utilizados en construcción en México.', 'apus-theme'),
$wp_customize->add_setting('roi_cta_a_text', array(
'default' => __('Consulta estructuras completas, insumos y dosificaciones de los APUs más utilizados en construcción en México.', 'roi-theme'),
'sanitize_callback' => 'sanitize_textarea_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_a_text', array(
'label' => __('Texto descriptivo', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_a_text', array(
'label' => __('Texto descriptivo', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'textarea',
));
// Botón Variante A
$wp_customize->add_setting('apus_cta_a_button', array(
'default' => __('Ver Catálogo Completo', 'apus-theme'),
$wp_customize->add_setting('roi_cta_a_button', array(
'default' => __('Ver Catálogo Completo', 'roi-theme'),
'sanitize_callback' => 'sanitize_text_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_a_button', array(
'label' => __('Texto del botón', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_a_button', array(
'label' => __('Texto del botón', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'text',
));
// URL Variante A
$wp_customize->add_setting('apus_cta_a_url', array(
$wp_customize->add_setting('roi_cta_a_url', array(
'default' => '#',
'sanitize_callback' => 'esc_url_raw',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_a_url', array(
'label' => __('URL del botón', 'apus-theme'),
'description' => __('Ejemplo: /catalogo-completo/ o una URL completa', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_a_url', array(
'label' => __('URL del botón', 'roi-theme'),
'description' => __('Ejemplo: /catalogo-completo/ o una URL completa', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'url',
));
@@ -128,66 +128,66 @@ function apus_customize_cta($wp_customize) {
// =====================================================
// Separador visual
$wp_customize->add_setting('apus_cta_b_separator', array(
$wp_customize->add_setting('roi_cta_b_separator', array(
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control(new WP_Customize_Control(
$wp_customize,
'apus_cta_b_separator',
'roi_cta_b_separator',
array(
'label' => __('━━━ Variante B: Membresía ━━━', 'apus-theme'),
'description' => __('Enfoque en planes de membresía y acceso premium', 'apus-theme'),
'section' => 'apus_cta',
'label' => __('━━━ Variante B: Membresía ━━━', 'roi-theme'),
'description' => __('Enfoque en planes de membresía y acceso premium', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'hidden',
)
));
// Título Variante B
$wp_customize->add_setting('apus_cta_b_title', array(
'default' => __('¿Necesitas Consultar Más APUs?', 'apus-theme'),
$wp_customize->add_setting('roi_cta_b_title', array(
'default' => __('¿Necesitas Consultar Más APUs?', 'roi-theme'),
'sanitize_callback' => 'sanitize_text_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_b_title', array(
'label' => __('Título', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_b_title', array(
'label' => __('Título', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'text',
));
// Texto Variante B
$wp_customize->add_setting('apus_cta_b_text', array(
'default' => __('Accede a nuestra biblioteca de 200,000 análisis de precios unitarios con estructuras detalladas y listados de insumos.', 'apus-theme'),
$wp_customize->add_setting('roi_cta_b_text', array(
'default' => __('Accede a nuestra biblioteca de 200,000 análisis de precios unitarios con estructuras detalladas y listados de insumos.', 'roi-theme'),
'sanitize_callback' => 'sanitize_textarea_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_b_text', array(
'label' => __('Texto descriptivo', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_b_text', array(
'label' => __('Texto descriptivo', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'textarea',
));
// Botón Variante B
$wp_customize->add_setting('apus_cta_b_button', array(
'default' => __('Conocer Planes de Membresía', 'apus-theme'),
$wp_customize->add_setting('roi_cta_b_button', array(
'default' => __('Conocer Planes de Membresía', 'roi-theme'),
'sanitize_callback' => 'sanitize_text_field',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_b_button', array(
'label' => __('Texto del botón', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_b_button', array(
'label' => __('Texto del botón', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'text',
));
// URL Variante B
$wp_customize->add_setting('apus_cta_b_url', array(
$wp_customize->add_setting('roi_cta_b_url', array(
'default' => '#',
'sanitize_callback' => 'esc_url_raw',
'transport' => 'postMessage',
));
$wp_customize->add_control('apus_cta_b_url', array(
'label' => __('URL del botón', 'apus-theme'),
'description' => __('Ejemplo: /planes-de-membresia/ o una URL completa', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_cta_b_url', array(
'label' => __('URL del botón', 'roi-theme'),
'description' => __('Ejemplo: /planes-de-membresia/ o una URL completa', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'url',
));
@@ -196,40 +196,40 @@ function apus_customize_cta($wp_customize) {
// =====================================================
// Separador visual
$wp_customize->add_setting('apus_cta_ga_separator', array(
$wp_customize->add_setting('roi_cta_ga_separator', array(
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control(new WP_Customize_Control(
$wp_customize,
'apus_cta_ga_separator',
'roi_cta_ga_separator',
array(
'label' => __('━━━ Google Analytics ━━━', 'apus-theme'),
'description' => __('Configuración para tracking de conversiones', 'apus-theme'),
'section' => 'apus_cta',
'label' => __('━━━ Google Analytics ━━━', 'roi-theme'),
'description' => __('Configuración para tracking de conversiones', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'hidden',
)
));
// Google Analytics Tracking ID
$wp_customize->add_setting('apus_ga_tracking_id', array(
$wp_customize->add_setting('roi_ga_tracking_id', array(
'default' => '',
'sanitize_callback' => 'sanitize_text_field',
'transport' => 'refresh',
));
$wp_customize->add_control('apus_ga_tracking_id', array(
'label' => __('Google Analytics Tracking ID', 'apus-theme'),
'description' => __('Formato: G-XXXXXXXXXX (GA4) o UA-XXXXXXXXX-X (Universal Analytics). Déjalo vacío si ya tienes GA instalado mediante plugin.', 'apus-theme'),
'section' => 'apus_cta',
$wp_customize->add_control('roi_ga_tracking_id', array(
'label' => __('Google Analytics Tracking ID', 'roi-theme'),
'description' => __('Formato: G-XXXXXXXXXX (GA4) o UA-XXXXXXXXX-X (Universal Analytics). Déjalo vacío si ya tienes GA instalado mediante plugin.', 'roi-theme'),
'section' => 'roi_cta',
'type' => 'text',
));
}
add_action('customize_register', 'apus_customize_cta');
add_action('customize_register', 'roi_customize_cta');
/**
* Agregar script de Google Analytics en el header si está configurado
*/
function apus_output_google_analytics() {
$tracking_id = get_theme_mod('apus_ga_tracking_id', '');
function roi_output_google_analytics() {
$tracking_id = get_theme_mod('roi_ga_tracking_id', '');
// No mostrar si está vacío o si estamos en el admin
if (empty($tracking_id) || is_admin()) {
@@ -254,4 +254,4 @@ function apus_output_google_analytics() {
</script>
<?php
}
add_action('wp_head', 'apus_output_google_analytics', 1);
add_action('wp_head', 'roi_output_google_analytics', 1);