fix(css): centrar verticalmente contenido del hero section
Agrega propiedades flexbox al contenedor .hero-section para que el contenido (título y badges) se muestre centrado verticalmente cuando no hay badges de categorías. Cambios: - display: flex - align-items: center - justify-content: center También incluye specs OpenSpec para arquitectura del tema. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
255
openspec/specs/patrones-wordpress/spec.md
Normal file
255
openspec/specs/patrones-wordpress/spec.md
Normal file
@@ -0,0 +1,255 @@
|
||||
# Especificacion de Patrones WordPress
|
||||
|
||||
## Purpose
|
||||
|
||||
Define como integrar WordPress con Clean Architecture en ROITheme. WordPress tiene caracteristicas propias que requieren patrones especificos para mantener la arquitectura limpia.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Ubicacion de Hooks de WordPress
|
||||
|
||||
WordPress hooks (add_action, add_filter) MUST be located ONLY in Infrastructure.
|
||||
|
||||
#### Scenario: Hooks prohibidos en Domain
|
||||
- **WHEN** el codigo esta en la capa Domain
|
||||
- **THEN** NO DEBE contener add_action
|
||||
- **AND** NO DEBE contener add_filter
|
||||
- **AND** NO DEBE registrar callbacks de WordPress
|
||||
|
||||
#### Scenario: Hooks prohibidos en Application
|
||||
- **WHEN** el codigo esta en la capa Application
|
||||
- **THEN** NO DEBE contener add_action
|
||||
- **AND** NO DEBE contener add_filter
|
||||
|
||||
#### Scenario: Ubicacion correcta de hooks
|
||||
- **WHEN** se necesitan hooks de WordPress
|
||||
- **THEN** DEBEN colocarse en Infrastructure/Wordpress/[Componente]HooksRegistrar.php
|
||||
- **AND** los hooks DEBEN delegar a Use Cases
|
||||
- **AND** los hooks NO DEBEN contener logica de negocio
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Encapsulacion de wpdb
|
||||
|
||||
Access to global $wpdb MUST be encapsulated in Infrastructure repositories.
|
||||
|
||||
#### Scenario: wpdb prohibido en Domain
|
||||
- **WHEN** el codigo esta en la capa Domain
|
||||
- **THEN** NO DEBE contener global $wpdb
|
||||
- **AND** NO DEBE hacer consultas directas a base de datos
|
||||
|
||||
#### Scenario: wpdb prohibido en Application
|
||||
- **WHEN** el codigo esta en la capa Application
|
||||
- **THEN** NO DEBE contener global $wpdb
|
||||
- **AND** DEBE usar interfaces de repository
|
||||
|
||||
#### Scenario: Ubicacion correcta de wpdb
|
||||
- **WHEN** se necesita acceso a base de datos
|
||||
- **THEN** DEBE usarse en Infrastructure/Persistence/WordPress[Componente]Repository.php
|
||||
- **AND** el repository DEBE implementar una interface definida en Domain
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Ubicacion de wp_enqueue_scripts
|
||||
|
||||
Functions wp_enqueue_style and wp_enqueue_script MUST be located ONLY in Infrastructure.
|
||||
|
||||
#### Scenario: Enqueue prohibido en Domain
|
||||
- **WHEN** el codigo esta en la capa Domain
|
||||
- **THEN** NO DEBE contener wp_enqueue_style
|
||||
- **AND** NO DEBE contener wp_enqueue_script
|
||||
|
||||
#### Scenario: Enqueue prohibido en Application
|
||||
- **WHEN** el codigo esta en la capa Application
|
||||
- **THEN** NO DEBE contener funciones de enqueue
|
||||
- **AND** NO DEBE conocer detalles de assets
|
||||
|
||||
#### Scenario: Ubicacion correcta de enqueue
|
||||
- **WHEN** se necesita cargar assets
|
||||
- **THEN** DEBE colocarse en Infrastructure/Services/[Componente]AssetEnqueuer.php
|
||||
- **AND** DEBE registrarse via hooks en Infrastructure
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Ubicacion de register_post_type
|
||||
|
||||
CPT and taxonomy registration MUST be located ONLY in Infrastructure.
|
||||
|
||||
#### Scenario: CPT no es concepto de Domain
|
||||
- **WHEN** se considera donde registrar un Custom Post Type
|
||||
- **THEN** NO DEBE ir en Domain porque no es concepto de negocio
|
||||
- **AND** NO DEBE ir en Application
|
||||
- **AND** ES un detalle de implementacion de WordPress
|
||||
|
||||
#### Scenario: Ubicacion correcta de CPT
|
||||
- **WHEN** se necesita registrar un Custom Post Type
|
||||
- **THEN** DEBE colocarse en Infrastructure/Wordpress/[Componente]CPTRegistrar.php
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Ubicacion de add_shortcode
|
||||
|
||||
Shortcodes MUST be located ONLY in Infrastructure and delegate to Use Cases.
|
||||
|
||||
#### Scenario: Shortcode prohibido en Domain y Application
|
||||
- **WHEN** el codigo esta en Domain o Application
|
||||
- **THEN** NO DEBE contener add_shortcode
|
||||
|
||||
#### Scenario: Ubicacion correcta de shortcode
|
||||
- **WHEN** se necesita un shortcode
|
||||
- **THEN** DEBE colocarse en Infrastructure/Wordpress/[Componente]ShortcodeRegistrar.php
|
||||
- **AND** DEBE delegar la logica a un Use Case
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Ubicacion de Options API
|
||||
|
||||
WordPress Options API MUST be encapsulated in Infrastructure repositories.
|
||||
|
||||
#### Scenario: Options prohibidas en Domain y Application
|
||||
- **WHEN** el codigo esta en Domain o Application
|
||||
- **THEN** NO DEBE contener get_option
|
||||
- **AND** NO DEBE contener update_option
|
||||
- **AND** NO DEBE contener delete_option
|
||||
|
||||
#### Scenario: Ubicacion correcta de Options
|
||||
- **WHEN** se necesita acceso a opciones de WordPress
|
||||
- **THEN** DEBE colocarse en Infrastructure/Persistence/WordPressSettingsRepository.php
|
||||
- **AND** DEBE implementar una interface de Application
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Evitar functions.php Gigante
|
||||
|
||||
The functions.php file MUST contain only bootstrap, not logic.
|
||||
|
||||
#### Scenario: functions.php correcto
|
||||
- **WHEN** se implementa functions.php
|
||||
- **THEN** DEBE contener solo Autoloader, Container DI y Bootstrap
|
||||
- **AND** NO DEBE contener logica de negocio
|
||||
- **AND** NO DEBE contener definiciones de funciones de negocio
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Evitar Logica en Templates
|
||||
|
||||
Templates MUST contain only rendering, not business logic.
|
||||
|
||||
#### Scenario: Template prohibido con logica
|
||||
- **WHEN** un template de WordPress existe
|
||||
- **THEN** NO DEBE contener global $wpdb
|
||||
- **AND** NO DEBE contener validaciones de negocio
|
||||
- **AND** NO DEBE contener consultas a base de datos
|
||||
- **AND** NO DEBE contener cadenas if/elseif complejas
|
||||
|
||||
#### Scenario: Template correcto
|
||||
- **WHEN** se crea un template
|
||||
- **THEN** DEBE recibir un ViewModel preparado
|
||||
- **AND** DEBE contener solo HTML con escaping
|
||||
- **AND** DEBE usar esc_html(), esc_attr(), esc_url()
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Evitar wpdb Disperso
|
||||
|
||||
Usage of wpdb MUST NOT be scattered throughout the code.
|
||||
|
||||
#### Scenario: wpdb centralizado
|
||||
- **WHEN** se necesita acceso a base de datos
|
||||
- **THEN** DEBE usarse SOLO en repositories
|
||||
- **AND** los repositories DEBEN estar en Infrastructure/Persistence/
|
||||
- **AND** multiples archivos NO DEBEN tener global $wpdb
|
||||
|
||||
#### Scenario: Beneficios de centralizacion
|
||||
- **WHEN** wpdb esta centralizado en repositories
|
||||
- **THEN** cambiar la base de datos requiere modificar solo repositories
|
||||
- **AND** el testing es posible via mocks de interface
|
||||
- **AND** la logica de negocio permanece pura
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Evitar Variables Globales Masivas
|
||||
|
||||
Code MUST NOT use massive global variables.
|
||||
|
||||
#### Scenario: Globales prohibidas
|
||||
- **WHEN** se escribe codigo
|
||||
- **THEN** NO DEBE usar global $roi_config
|
||||
- **AND** NO DEBE usar singletons dispersos
|
||||
- **AND** NO DEBE crear estado global
|
||||
|
||||
#### Scenario: Solucion con Dependency Injection
|
||||
- **WHEN** se necesitan dependencias compartidas
|
||||
- **THEN** DEBE usarse un Container de Inyeccion de Dependencias
|
||||
- **AND** las dependencias se inyectan via constructor
|
||||
- **AND** no hay estado global
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Codigo Testeable
|
||||
|
||||
Code MUST be testable without WordPress installed.
|
||||
|
||||
#### Scenario: Domain testeable
|
||||
- **WHEN** se escribe codigo de Domain
|
||||
- **THEN** DEBE ser testeable sin base de datos
|
||||
- **AND** DEBE ser testeable sin WordPress
|
||||
- **AND** DEBE ser testeable sin UI
|
||||
|
||||
#### Scenario: Mocks via interfaces
|
||||
- **WHEN** se escriben tests
|
||||
- **THEN** las dependencias se mockean via interfaces
|
||||
- **AND** los tests unitarios NO requieren setup complejo
|
||||
- **AND** Domain puede probarse de forma aislada
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Arbol de Decisiones WordPress
|
||||
|
||||
WordPress code MUST be located according to code type.
|
||||
|
||||
#### Scenario: Determinar ubicacion de hooks
|
||||
- **WHEN** el codigo es add_action o add_filter
|
||||
- **THEN** va en Infrastructure/Wordpress/[Componente]HooksRegistrar.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de wpdb
|
||||
- **WHEN** el codigo usa global $wpdb
|
||||
- **THEN** va en Infrastructure/Persistence/WordPress[Componente]Repository.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de enqueue
|
||||
- **WHEN** el codigo usa wp_enqueue_style o wp_enqueue_script
|
||||
- **THEN** va en Infrastructure/Services/[Componente]AssetEnqueuer.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de CPT
|
||||
- **WHEN** el codigo usa register_post_type o register_taxonomy
|
||||
- **THEN** va en Infrastructure/Wordpress/[Componente]CPTRegistrar.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de shortcode
|
||||
- **WHEN** el codigo usa add_shortcode
|
||||
- **THEN** va en Infrastructure/Wordpress/[Componente]ShortcodeRegistrar.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de options
|
||||
- **WHEN** el codigo usa get_option o update_option
|
||||
- **THEN** va en Infrastructure/Persistence/WordPressSettingsRepository.php
|
||||
|
||||
#### Scenario: Determinar ubicacion de nonces
|
||||
- **WHEN** el codigo usa wp_nonce_field o check_admin_referer
|
||||
- **THEN** va en Infrastructure/Api/Wordpress/[Componente]Controller.php
|
||||
|
||||
---
|
||||
|
||||
### Requirement: Comandos de Validacion WordPress
|
||||
|
||||
Code MUST be validated with specific commands.
|
||||
|
||||
#### Scenario: Validar Domain sin WordPress
|
||||
- **WHEN** se valida la capa Domain
|
||||
- **THEN** grep por global $wpdb DEBE retornar vacio
|
||||
- **AND** grep por add_action DEBE retornar vacio
|
||||
- **AND** grep por $_POST DEBE retornar vacio
|
||||
|
||||
#### Scenario: Validar Application sin WordPress
|
||||
- **WHEN** se valida la capa Application
|
||||
- **THEN** grep por global $wpdb DEBE retornar vacio
|
||||
- **AND** grep por add_action DEBE retornar vacio
|
||||
- **AND** grep por wp_enqueue DEBE retornar vacio
|
||||
Reference in New Issue
Block a user