# ROADMAP — OliverCG Website

Mejoras identificadas tras auditoría completa del codebase y la web en producción.  
Organizado por prioridad. Las tareas críticas deben ejecutarse antes de cualquier otro cambio.

---

## 🔴 CRÍTICO — Seguridad y estabilidad

### [SEC-01] Sacar las credenciales de BD del código fuente
- **Archivo:** `include/conexionBD.php`
- **Problema:** Usuario y contraseña de MySQL están hardcodeados en texto plano dentro de un archivo PHP que estaba en el repositorio.
- **Solución:** Mover las credenciales a un archivo `.env` o `config.php` excluido del repo mediante `.gitignore`. Cargarlo con `$_ENV` o una función de configuración.
- **Impacto:** Cualquier acceso no autorizado al repo o a la web expone la base de datos.

### [SEC-02] Limpiar archivos sensibles ya commiteados al repositorio
- **Problema:** Los siguientes archivos se commitearon sin querer y pueden contener información sensible:
  - `error_log` (9.5 MB de logs en el root, más en `/proyectos/`, `/blog/`, `/en/`)
  - `places_cache.json` (caché con respuestas de API de Google Places)
  - `d62d7054a5c848fe9ccef59807f4b248.txt` (archivo de verificación de propiedad)
- **Solución:** `git rm --cached` de todos estos archivos + ya están cubiertos por `.gitignore` recién creado.
- **Comando:**
  ```bash
  git rm --cached error_log places_cache.json d62d7054a5c848fe9ccef59807f4b248.txt
  git rm --cached proyectos/error_log blog/error_log en/error_log 2>/dev/null
  git commit -m "fix: remove sensitive/generated files from tracking"
  ```

### [SEC-03] Revisar y limpiar la carpeta `wp-content/`
- **Problema:** Existe un directorio `wp-content/` en el root que parece un residuo de una instalación WordPress anterior.
- **Riesgo:** Si contiene plugins o archivos desactualizados, puede ser un vector de ataque.
- **Solución:** Confirmar si es necesario. Si no, eliminar del servidor y del repositorio.

---

## 🟠 SEO — Alta prioridad

### [SEO-01] Completar Open Graph tags
- **Archivo:** `head.php` (líneas con `<!-- OLIVERCG TODO: -->`)
- **Problema:** `og:image` y `og:url` están comentados en todos los pages. Sin imagen OG, los compartidos en redes sociales no muestran preview visual.
- **Solución:** 
  - Crear una imagen OG genérica (1200×630px) con el branding de OliverCG.
  - Añadir `og:image` con URL absoluta en `head.php`.
  - El `og:url` usar `$cleanPageUrl` ya disponible en la lógica existente.

### [SEO-02] Corregir Schema.org — URL incorrecta y JSON inválido
- **Archivo:** `head.php`
- **Problema 1:** El JSON-LD de Organization usa `"url":"https:\/\/olivercg.es"` cuando el dominio correcto es `olivercg.engineer`.
- **Problema 2:** Hay una trailing comma en el array `"areaServed":["ES"],` que produce JSON inválido (aunque muchos parsers lo toleran, es incorrecto).
- **Solución:** Actualizar la URL y eliminar la coma sobrante.

### [SEO-03] Añadir Schema.org `Person` o `LocalBusiness`
- **Problema:** El schema actual es tipo `Organization` pero para una web personal/freelance, `Person` + `LocalBusiness` puede mejorar el rich snippet.
- **Solución:** Añadir un segundo bloque JSON-LD con tipo `Person` en las páginas relevantes (home, portfolio).

### [SEO-04] Revisar sitemap.xml
- **Archivo:** `sitemap.xml` y `creacion-automatica-sitemap.php`
- **Tarea:** Verificar que todas las páginas actuales están incluidas y que no hay URLs de páginas eliminadas. Comprobar que las fechas `<lastmod>` son correctas.

### [SEO-05] Añadir breadcrumbs estructurados
- **Páginas:** Blog posts, proyectos, servicios.
- **Beneficio:** Mejora el rich snippet en resultados de búsqueda y la navegación.

### [SEO-06] Revisar meta descriptions en páginas de servicios menores
- **Páginas a revisar:** `odoo-erp-partners.php`, `shopify-partners.php`, `reparar-homepod.php`, `peritaje-informatico-granada.php`
- **Problema:** Posibles descripciones genéricas o poco optimizadas.

---

## 🟡 RENDIMIENTO

### [PERF-01] Optimizar y convertir imágenes a WebP
- **Directorio:** `/images/` (~226 archivos, mezcla de JPG/PNG)
- **Solución:** Convertir todas las imágenes a WebP con fallback JPG. Usar `<picture>` en HTML o configurar Apache para servir WebP automáticamente si el navegador lo soporta.
- **Herramienta:** `cwebp`, ImageMagick, o un script PHP de conversión batch.

### [PERF-02] Consolidar y minificar CSS
- **Problema:** Se cargan 5 archivos CSS en cada página: `plugins.css`, `style.css`, `custom.css`, `fonts.css`, `theme.css`.
- **Solución:** Combinarlos en un único archivo minificado en producción, o al menos en dos (plugins + custom).
- **Nota:** `custom.css` y `custom.js` deben seguir siendo editables por separado en desarrollo.

### [PERF-03] Revisar carga de fuentes (Google Fonts comentado)
- **Archivo:** `head.php`
- **Observación:** El import de Google Fonts está comentado pero hay un `fonts.css` propio. Verificar que las fuentes se sirven localmente con `font-display: swap` y que no hay requests innecesarios.

### [PERF-04] Lazy loading en imágenes del slider principal
- **Problema:** El slider usa imágenes de fondo vía `data-bg-desktop` — el preload del LCP ya está implementado, pero revisar que las imágenes de slides 2+ no bloquean el render.

---

## 🔵 CÓDIGO Y MANTENIBILIDAD

### [CODE-01] Centralizar configuración sensible en un archivo de entorno
- Relacionado con SEC-01. Crear `include/config.php` (en `.gitignore`) con:
  ```php
  define('DB_HOST', 'localhost');
  define('DB_NAME', '...');
  define('DB_USER', '...');
  define('DB_PASS', '...');
  define('RECAPTCHA_SECRET', '...');
  define('MAIL_TO', 'contacto@olivercg.es');
  ```
- Actualizar `conexionBD.php` y `contact-form.php` para leer de estas constantes.

### [CODE-02] Completar el email destinatario en los formularios de contacto
- **Archivo:** `include/contact-form.php`
- **Problema:** `$to = ""` — el campo de email destinatario está vacío en la plantilla. Confirmar que está configurado en producción o moverlo a `config.php`.

### [CODE-03] Deduplicar lógica `/en/` vs `/`
- **Observación:** El directorio `/en/` es un espejo casi completo de la raíz. Los archivos PHP son casi idénticos entre versiones ES e EN — solo cambia el `require locale/`.
- **Mejora a largo plazo:** Explorar si se puede unificar con un único set de templates y que el idioma se gestione por variable/parámetro en vez de duplicar archivos.

### [CODE-04] Añadir `.htaccess` de seguridad adicional
- Bloquear acceso directo a `/include/`, `/locale/` desde el navegador (ya están en robots.txt pero no en `.htaccess`).
- Añadir headers de seguridad: `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`, `Permissions-Policy`.
- Bloquear listado de directorios (`Options -Indexes`).

### [CODE-05] Versionado de assets CSS/JS
- **Problema:** Si se actualiza `custom.css` o `custom.js`, los usuarios pueden ver la versión cacheada antigua.
- **Solución:** Añadir query string con versión o timestamp: `<link href="/css/custom.css?v=2025051001">`.

---

## 🟢 CONTENIDO Y UX

### [UX-01] Portfolio — Ampliar y actualizar proyectos
- **Archivo:** `portafolio-oliver-cg.php` / `proyectos/`
- Añadir proyectos recientes (Lynx Web, 101tv, Eden...).
- Incluir capturas de pantalla actualizadas.
- Añadir filtro por tipo (ecommerce, web corporativa, PrestaShop, etc.).

### [UX-02] Página de inicio — Actualizar el slider
- **Archivo:** `index.php`
- El slider solo muestra 2 slides (PrestaShop + Ciberseguridad). Valorar añadir uno de SEO o Peritaje Informático dado el volumen de servicios.

### [UX-03] Blog — Aumentar frecuencia de publicación
- **Directorio:** `blog/`
- Hay artículos sin versión EN o viceversa. Asegurar paridad ES/EN en los artículos más relevantes.
- Considerar añadir structured data `Article` en cada post del blog.

### [UX-04] Añadir página de testimonios o casos de éxito
- Actualmente los testimonios están dispersos dentro de páginas de servicios (si los hay).
- Valorar una sección dedicada o página propia con reseñas verificadas (Google Reviews).

### [UX-05] Integrar reseñas de Google de forma automática
- `places_cache.json` existe → ya hay integración con Google Places API.
- Asegurarse de que se muestra en la web y que el caché se renueva correctamente.
- Documentar la lógica de renovación del caché.

### [UX-06] Revisar accesibilidad (a11y)
- Comprobar que todas las imágenes tienen `alt` descriptivos.
- Verificar contraste de colores en textos sobre fondos dinámicos (slider).
- Probar navegación por teclado.

---

## 📋 BACKLOG / A VALORAR

- Migrar a HTTPS con header HSTS (`Strict-Transport-Security`) en `.htaccess`.
- Añadir página de precios o calculadora de presupuesto online.
- Integrar feed RSS del blog.
- Explorar generación de sitemap automática en cada deploy (ya existe `creacion-automatica-sitemap.php`).
- Revisar si `formador-profesional.php` sigue siendo relevante como servicio activo.
- Añadir `humans.txt`.

---

## Historial de cambios

| Fecha | Cambio |
|---|---|
| 2026-05-02 | Auditoría inicial. Creación de `.gitignore`, `CLAUDE.md` y este ROADMAP. |
| 2026-05-02 | **[SEO-01] ✅** OG tags completos (og:image, og:url, og:site_name, og:locale) en `head.php`. |
| 2026-05-02 | **[SEO-02] ✅** Schema.org corregido: URL `olivercg.engineer`, JSON válido, LinkedIn en sameAs. |
| 2026-05-02 | **[SEC-01] ✅** Credenciales DB y SMTP migradas a `.env` (directorio padre httpdocs, Plesk). `conexionBD.php` y `enviar-correo.php` leen de `getenv()`. |
| 2026-05-02 | **[SEC-02] ✅** `enviar-correo.php`: validación reCAPTCHA v3 server-side, honeypot, filtrado de URLs en mensaje, lista negra de dominios de email abusivos. |
| 2026-05-02 | Formulario convertido a AJAX (fetch). Muestra mensaje de éxito inline sin recargar página. |

## Pendiente post-deploy
- Crear `.env` en el directorio padre de `httpdocs` en Plesk con las credenciales reales (ver `.env.example`).
- Añadir la **clave SECRETA de reCAPTCHA** (`RECAPTCHA_SECRET_KEY`) al `.env`. Obtener en https://www.google.com/recaptcha/admin.
- Crear imagen OG dedicada (`/images/og-default.jpg`, 1200×630px) y subir al servidor.
- Ejecutar `git rm --cached error_log places_cache.json d62d7054a5c848fe9ccef59807f4b248.txt` en el servidor.
