Commit Graph

19 Commits

Author SHA1 Message Date
rafa 4f91d68996 legacy-redirect: dejar en paz /.well-known/
fea-legacy-redirect manda al archivo cualquier 404, y eso incluia /.well-known/,
que nunca fue contenido de Joomla: son rutas de protocolo (retos de Let's
Encrypt, security.txt, change-password). Lo encontro el Claude de Inma mirando
por que no se emitian los certificados.

No es lo que bloquea los certificados. El reto de LE va por el puerto 80 y ahi
lo atiende Traefik, que lo intercepta antes de llegar a WordPress y no lo
redirige a HTTPS: se ve en que el 404 del puerto 80 viene vacio y sin cabecera
server, mientras cualquier otra ruta da 302. La configuracion lo confirma,
httpchallenge.entrypoint=http. Los certificados no salen porque Traefik no ha
reintentado desde las 10:44, cuando el DNS aun apuntaba a CDMON.

Pero el redirect estaba mal igualmente, y es una trampa para mas adelante: si
algun dia el reto llegara por el 443 (DNS-01 no, pero un cambio de entrypoint o
un renovador distinto si), este 301 lo tumbaria y el certificado no se
renovaria sin que nadie entendiera por que.

Comprobado que lo demas sigue igual: las URLs viejas de Joomla y los 404
genuinos siguen yendo al archivo, y /es sigue llevando a la home.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 07:34:23 -04:00
rafa 91a212250d mu-plugins: versionar los dos que solo vivian en produccion
Preparando el cutover a Hetzner (#180), el criterio de migracion limpia
(#180 comment-516) dice recrear los mu-plugins desde el repo. Comparados por
MD5 los 26 comunes coinciden byte a byte, pero estos dos estaban vivos en
produccion y en ninguna rama del repo:

- fea-security-blocked-users.php: es la contencion del incidente #183
  (comment-437). Bloquea wp_authenticate_user y allow_password_reset para
  los IDs 1047 (pabloarias), 1049 (josek) y 1087 (andrey). Sin este fichero,
  recrear "los fea-* desde el repo" habria revivido las tres cuentas en el
  servidor nuevo, porque sus hashes viajan dentro del dump.
- fea-subir-avatar-api.php: endpoint REST del #175.

Copiados por HTTP-less cat sobre SSH y verificados por sha256 contra el
origen; php -l limpio en ambos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:56:49 -04:00
rafa 69e849d38e Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco
Este repo local tenia origin apuntando al Gitea local (localhost:3000), que Rafa
declaro archivado el 2026-06-28 (commit 962f33a, desarrollo movido a
gitea.feadulta.com). Ese memo nunca llego a este checkout: main quedo congelado
y todo el trabajo real de las ultimas 3+ semanas se fue commiteando solo en la
rama fix/multiidioma-portada-132 (ya fusionada a main sin perdida, commit
2504666), mientras que ademas se acumulaban 78 cambios sin commitear en el
working tree que nunca llegaron a NINGUN historial de git.

Este commit consolida esos cambios sueltos: TTS multi-voz (tts_*.py), scripts
de traduccion (translate_haiku.py, pretranslate_en_haiku.py, sync_translations_to_prod.py),
mu-plugins nuevos desplegados a prod (fea-beta-feedback, fea-cloudflare-realip,
fea-legacy-redirect, fea-gsc-verification, fea-support-campaign, fea-ui, etc.),
scripts de mantenimiento de enlaces/cartas, capturas E2E (tools/e2e/shot_*.cjs)
y documentacion de sesiones recientes.

Excluido deliberadamente (no es codigo versionable): tts-voices/ (3.3GB de
muestras de audio para clonacion de voz, anadido a .gitignore), logs/ (logs de
ejecucion, anadido a .gitignore), y 2 ficheros vacios accidentales + 2 copias
duplicadas sueltas en la raiz que ya existen en su ubicacion correcta.
2026-07-15 20:03:21 -04:00
rafa 250466696b Buscador: AND obligatorio en FULLTEXT, excluir paginas-indice K2 y soportar frase exacta entre comillas
Tres bugs corregidos (issue gitea.feadulta.com#178):
- OR implicito en Boolean Mode devolvia casi todo el sitio (~24.700/24.780 posts)
  para cualquier busqueda de varias palabras; ahora cada palabra es AND obligatorio (+).
- Paginas-indice residuales K2 (categorias 37/38, listados por autor) puntuaban
  altisimo en relevancia por su tamano y tapaban el articulo real; excluidas de
  resultados de busqueda.
- Palabras <3 caracteres forzadas como termino obligatorio rompian el calculo de
  relevancia (score 0 en filas que si coincidian); se descartan antes de construir
  la query.
- Anadido soporte real de frase exacta: termino entre comillas dobles se envia a
  MySQL Boolean Mode como frase, en vez de descartarse silenciosamente.
2026-07-15 19:14:43 -04:00
rafa f059ed17be feat(api): endpoint fea/v1/crear-autor para alta de autores (#166)
POST /wp-json/fea/v1/crear-autor — permite a Mixbot/Inma dar de alta
autores nuevos sin depender de intervención manual, sin necesitar el
permiso sensible create_users de WP. Rol 'author' fijo en el código
(no lo decide quien llama). Auth: is_user_logged_in() + edit_others_posts
(nivel Editor+, ya lo cumple su cuenta actual). Idempotente por slug:
si ya existe, devuelve el usuario existente en vez de duplicar/errorar.

Ver gitea.feadulta.com#166 (protocolo entre Claudes, opción B elegida
sobre A porque WP no permite nativamente restringir create_users a un
solo rol, y sobre C porque evita el salto humano/agente en el bucle).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 21:52:41 -04:00
rafa 7188adf0d7 feat(analytics): eventos GA4 audio_play y share_click
fea-audio-player.php: el <audio> lleva data-post-id/data-voice; listener
en wp_footer dispara gtag('event','audio_play', {post_id, voice}) en el
primer play (no en cada resume).

fea-share.php: se sube también al repo (nunca se había comiteado). El
botón de Facebook lleva data-fea-share-track="facebook" + listener que
dispara gtag('event','share_click', {method, post_id}).

Ambos reusan el dataLayer/gtag que ya inicializa fea-analytics.php, sin
añadir JS de terceros. Verificado en local con Playwright (evento se
dispara correctamente en ambos casos).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 21:34:32 -04:00
rafa e2f23ace9f feat(#8): buscador avanzado nativo (FULLTEXT + filtros)
Replica el «Buscador avanzado» del Joomla viejo sin servicios externos:
- fea-search-fulltext.php: motor MySQL FULLTEXT (MATCH AGAINST, Boolean Mode,
  orden por relevancia); comprueba que existe el índice fea_ft y degrada al
  buscador nativo si no, sin romper.
- fea-search-advanced.php: formulario con filtros por autor, categoría
  (lista curada de secciones), cita bíblica (meta _cita_evangelio por prefijo)
  y rango de fechas; pre_get_posts, chips de filtros, byline en tarjetas,
  i18n es/en/fr/it/pt. Excluye pseudo-autores «Testamento».
- create_buscar_page.php: crea la página /buscar + traducciones (idempotente).
- tools/e2e: suite Playwright de verificación.

Desplegado y verificado en prod (índice fea_ft + página /buscar + traducciones).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:24:53 -04:00
rafa 8ea4d51fd2 feat(#8): buscador visible (MVP nativo)
- fea-search.php: barra de búsqueda visible en móvil (donde el menú
  colapsa y oculta el buscador del menú); multiidioma por Polylang.
- set_search_template.php: template FSE 'search' con resultados en
  rejilla de tarjetas (reutiliza el layout de archive #63) en vez del
  patrón del tema que los mostraba 'todos seguidos'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:18:50 -04:00
rafa 6d9afaaf60 fix(#142): player de audio visible en móvil vertical
El reproductor se inyecta en el grupo flex del autor (wp-block-group FSE).
El flex-wrap apuntaba a .fea-byline (solo existe en Astra), por lo que en
móvil vertical el <audio> se comprimía y no mostraba controles. Se dirige
el wrap también al grupo FSE del byline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:18:50 -04:00
rafa e26b279e63 fix(avatares): traducciones de lecturas heredan el símbolo del ES (#135/#66)
fea_avatar_url: para posts no-ES resuelve el título del original ES (Polylang),
donde sí se reconoce el libro/evangelista. Así Matteo/Geremia/Romani heredan el
mismo icono que Mateo(ángel)/Jeremías/Romanos(biblia) en vez de identicon random.
También incluye el guard de Multimedia solo-ES (#135 #1).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 17:08:15 -04:00
rafa 9ac857b027 fix(portada): artículos por idioma y enlace evangelio del día (#132)
Bug 2: fea_carta_section_posts parsea SIEMPRE la carta ES (el parser solo
reconoce cabeceras en español) y mapea cada artículo a su traducción
Polylang del idioma de la portada. Antes EN/FR/IT/PT caían al fallback
'últimos por categoría' y mostraban artículos incorrectos.

Bug 1: el enlace 'evangelio del día' resuelve la traducción del idioma
actual con pll_get_post (get_posts usa suppress_filters=true y devolvía
siempre la página ES).

Desplegado y verificado en prod (wp-nuevo) 2026-06-22.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 08:30:18 -04:00
rafa 863a3c6677 feat(analytics): GA4 (gtag) + banner de consentimiento de cookies (#93)
- fea-analytics.php: GA4 G-6RT9ZRS4LW vía gtag en mu-plugin (Consent Mode v2,
  default denied). Measurement ID portable: cutover wp-nuevo -> www indoloro.
- fea-cookie-consent.php: banner RGPD discreto, multiidioma ES/EN/FR/IT/PT,
  enlace a la politica resuelto por idioma (Polylang). Aceptar -> consent update.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 11:49:59 -04:00
rafa 378ff6510f Update tracked WordPress core files 2026-06-14 19:30:16 -04:00
rafa e2ea90dd1e chore(wp): registrar borrado de scripts de raíz WP
Los ficheros archivados/borrados ya están descritos en archive/README.md
y el commit anterior. Este solo registra los deletes en git.
2026-05-26 08:54:49 -04:00
rafa 382a6a6e87 feat(portada): modelo carta→portada + slider sync desde filesystem
- fea-carta-portada.php (nuevo, 1.0): parser de la carta semanal.
  Extrae secciones (Evangelio, Artículos, Eucaristía, Multimedia, EFFA)
  por encabezados y resuelve los href (WP slug o K2 legacy id) a
  wp_posts.ID. Cache en transient 15 min, invalidación en save_post.
  Cierra issue #38.

- fea-homepage.php: 4 shortcodes reescritos para usar
  fea_carta_section_posts() como fuente primaria, manteniendo el
  fallback existente (ACF + últimos por categoría).
  Afecta: [fea_articulos_semana], [fea_evangelio], [fea_eucaristia],
  [fea_multimedia]. El hero y noticia_centro sin cambios.

- fea-slider-sync.php (nuevo, 1.0): sincroniza Smart Slider 3 id 2
  con uploads/home/. Editor sube/borra imágenes en esa carpeta y el
  slider se actualiza automáticamente al primer pageview (modelo
  paridad con Joomla mod_ariimageslider). Cierra issue #43.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 12:26:01 -04:00
rafa 7965928906 fix: bloque central footer — noticias_2025.jpg dinámico (corrige duplicación)
El footer template (ID 42370) ya tenía las 3 columnas de banners. El bloque
central usaba publi_2-1.gif (antiguo placeholder). Se reemplaza por el
shortcode [fea_noticia_centro] que muestra noticias_2025.jpg + título del
último artículo de Noticias de alcance de forma dinámica.

Se elimina el shortcode [fea_prefooter] (causaba duplicación al añadirse
sobre el footer template preexistente).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 22:37:20 -04:00
rafa c6f16ba739 fix: sección pre-footer portada + scripts importación delta marzo-mayo 2026
- fea-homepage.php: nuevo shortcode [fea_prefooter] — 3 columnas (Ediciones |
  Noticias de alcance | Publicidad) sobre el footer. Imagen noticias_2025.jpg
  apunta a wp-content/uploads/recursos/ (fix ruta Joomla rota). Columna central
  y vídeo de la semana son dinámicos (último post de las categorías respectivas).
- scripts/import_new_k2_items.py: importa 169 K2 items nuevos (id > 17873)
- scripts/fix_imported_k2_metas.py: asigna metas/cats/Polylang a esos 169 posts
- scripts/import_new_cartas.py: importa 8 cartas nuevas (ew4r_content id > 9043,
  catid 27/40/41) y asigna _carta_id a los artículos K2 por fecha
- scripts/import_new_content.py: importa 58 ítems ew4r_content no-carta
  (multimedia, noticias, tablón, etc.) con mapping catid→WP term

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 22:27:33 -04:00
rafa 18522a01ee fix: portada WP — slider, h2 Portada, separadores y tipografía secciones
- Ocultar .n2-ss-slide--focus (nombres de fichero SS3 visibles)
- Ocultar .wp-block-post-title en todas las portadas (antes solo FR/IT/PT/EN)
- Aumentar separación entre secciones: 3rem→4.5rem + padding-top
- Rediseñar .fea-section-title: más grande (0.72→0.85rem), más oscuro,
  borde izquierdo carmesí para jerarquía visual

Closes #10 #11 #15 #16

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 18:48:59 -04:00
rafa 668d973889 Initial commit — migración Joomla→WordPress feadulta.org
Incluye: mu-plugins custom (fea-homepage, carta-semana), scripts de
migración/traducción/deploy, documentación de auditoría, análisis de
cartas y HTML de evangelios exportados desde Joomla.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 08:33:12 -04:00