# Changelog — Tema esadeecpol

Todos los cambios relevantes en el tema se documentan en este archivo.
El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/)
y el versionado usa [Semantic Versioning](https://semver.org/lang/es/).

Para volver a una versión anterior: `git checkout v<versión> -- wp-content/themes/esadeecpol/`

---

## [1.4.3] - 2026-02-26

### Corregido
- Actualizar parámetro `postid` → `post_id` en `ecpol_get_related_posts()` para compatibilidad con Contextual Related Posts 4.2.0 — el parámetro antiguo está deprecado y genera notices en debug.log (`inc/utils.php`)

## [1.4.2] - 2026-02-24

### Corregido
- Eliminar plugin jQuery Sticky que generaba un espacio blanco de ~76px entre la barra de navegación y el contenido en WP 6.9 — el plugin creaba un `sticky-wrapper` con altura incorrecta que entraba en conflicto con CSS `position: sticky` nativo (`ecpol.js`, `inc/load-scripts.php`)

## [1.4.1] - 2026-02-19

### Corregido
- Corregir sección "Contenidos Relacionados" que no aparecía en publicaciones tras actualización de Contextual Related Posts a v4.x — la función `get_crp_posts_id()` fue eliminada en CRP 4.0.0; migrado a `get_crp_posts()` y eliminada traducción WPML manual (CRP 4.x la gestiona internamente)

## [1.4.0] - 2026-02-11

### Accesibilidad
- Añadir skip-to-content link para navegación con teclado
- Reemplazar `outline: none` por `focus-visible` con outline visible en botones y links
- Añadir `aria-hidden="true"` a SVGs decorativos en `ecpol_the_icon()` e iconos Font Awesome
- Convertir trigger de búsqueda de `<a href="#">` a `<button>` semántico con `aria-label`
- Añadir `role="search"` y `aria-label` al formulario de búsqueda
- Añadir `aria-label` a navegación principal, navegación del footer y botón toggler del menú
- Eliminar `role="main"` redundante del elemento `<main>`
- Añadir `alt=""` a imágenes decorativas de YouTube en thumbnails
- Añadir `title="Video"` a iframes de vídeo generados por JS
- Añadir `aria-live="polite"` al contenedor de archivo para anunciar contenido cargado dinámicamente
- Añadir `rel="noopener"` a links con `target="_blank"`

## [1.3.0] - 2026-02-11

### Rendimiento
- Eliminar jQuery Sticky (plugin de 2013) y usar CSS `position: sticky` nativo
- Consolidar CDNs: de 4 dominios (jsDelivr, cdnjs, unpkg, fontawesome.com) a solo jsDelivr
- Actualizar Swiper de 6.8.4 a 11 (clases `.swiper-container` → `.swiper`)
- Actualizar Font Awesome de 5.3.1 a 5.15.4 (vía jsDelivr)
- Eliminar código comentado muerto en `load-scripts.php`

## [1.2.0] - 2026-02-11

### Seguridad
- Añadir verificación de nonce en AJAX `loadmore` (público) y `ecpoladminposts` (admin)
- Sanitizar `$_POST['query']`, `$_POST['page']` y `$_GET['q']` en handlers AJAX
- Añadir `wp_nonce_field` / `check_admin_referer` en formulario de opciones del tema
- Añadir `current_user_can('edit_pages')` antes de guardar opciones
- Proteger output de `belowHead` / `belowBody` con verificación de existencia

### Cambiado
- Reemplazar `query_posts()` por `WP_Query` en `ajax.php` y `shortcodes.php`
- Reemplazar `stripslashes_deep()` por `wp_unslash()` en `ecpol-options.php`
- Reemplazar `echo json_encode() + die` por `wp_send_json()` en `admin.php`
- Reemplazar `die` por `wp_die()` en `ajax.php`

## [1.1.0] - Original

Versión original del tema desarrollada por [Vänster](https://vanster.design).
Estado de referencia antes del inicio del mantenimiento.
