Commit Graph

41 Commits

Author SHA1 Message Date
rafa db0d0a03f8 feat: TTS multi-voz por autor (MiniMax voice cloning, gitea.feadulta.com #152)
Voz clonada por autor (Fray Marcos, Pagola, Sicre, Arregi) en vez de una
única voz genérica para todo el TTS. minimax_tts.py resuelve la voz por
post_author (AUTHOR_VOICES) y cae a Nico si no hay clon; fea_post_io.php
propaga autor/voz; tts_produce.py y sync_audio_to_prod.py (local→prod,
workaround glibc rota del servidor) usan la voz correcta en vez de forzar
Nico.

Incluye fix de trim_after_author_signature: la heurística de "firma final
del autor" confundía encabezados litúrgicos iniciales (p.ej. "CORPUS (A)")
con la firma, truncando el texto a sintetizar a un par de palabras. Ahora
solo cuenta como firma un párrafo con >200 caracteres de contenido real
por delante.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 21:34:20 -04:00
rafa 82ca122a4e Add verify_carta_lang_links.php QA script for multilingual carta links
Reports internal links whose language prefix/slug doesn't match the target
post's actual language (SIN_TRADUCIR / MISMATCH), so link bugs like the
silence/silence-2 cross-language mixup on carta 734 get caught before they
reach prod.
2026-07-08 09:28:53 -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 d959331ed0 docs(#8): plan del buscador avanzado nativo (sin Typesense)
Plan ejecutado por Sonnet: replica el «Buscador avanzado» K2 con WP nativo
+ MySQL FULLTEXT (palabra, autor, categoría, cita bíblica, fecha).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:24:53 -04:00
rafa 493fd4d835 docs(#8): plan de implementación del buscador Typesense (fase 2)
Plan ejecutable (para Sonnet) de la fase 2: arquitectura, schema, indexador,
UI InstantSearch con faceta de autor, seguridad de claves y verificación.
La decisión de dónde corre Typesense en producción queda pendiente; todo lo
demás se puede construir y validar en local.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:30:34 -04:00
rafa 63e0057fd5 chore(#143): avisar en el importer cuando un autor K2 cae a 'Fe Adulta'
Cuando created_by de Joomla no está en user_map, post_author cae a 1
('Fe Adulta'). Se añade un aviso por consola apuntando a fix_k2_authors.php
para corregirlo tras el delta. (El resto de cambios del fichero, de sesiones
previas, quedan sin commitear.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:21:51 -04:00
rafa 6c0e366b03 docs: guía de publicación de la carta semanal para Inma (REST API)
Guía para el asistente de Inma: conexión por REST API, modelo
carta->portada, categorías, flujo de publicación y qué es automático.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:18:50 -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 84ec9163b2 fix(#143): corregir autoría 'Fe Adulta' y avatares de iniciales
Artículos K2 cuyo created_by de Joomla no tenía usuario WP caían a
post_author=1 ('Fe Adulta'). Herramientas:
- fix_k2_authors.php: crea el usuario (nombre real de ew4r_users) y
  reasigna post_author (idempotente, dry-run/APPLY).
- gen_avatars_initials.py: recrea el generador de avatares de iniciales
  del #62 (paleta determinista + DejaVuSans-Bold).
- import_avatars_143.php: alta de attachment + foto_perfil con backup.

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 3d3ca037f3 feat(i18n): traducir nombre del libro en títulos de lecturas EN/FR/IT/PT (#140)
Mapa de 73 libros bíblicos ES->{en,fr,it,pt} y reemplazo determinista del
token de libro en cada cita biblica del post_title (inicio, compuestos '/',
ordinales '2 Timoteo', prefijos de fiesta). Idempotente, title-only,
cotejo insensible a acentos. Aplicado: local 2103, prod wp-nuevo 1605.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:41:09 -04:00
rafa a2aefd8e0b scripts(homenajes): migración Mardones/Galarreta + sync prod #130/#131/#133/#137/#138
Pipeline de los 23 posts de Mardones (anterior/*.htm → posts), repunte de
presentaciones de Galarreta, y scripts de sync a prod de las 5 issues del día.
Incluye retoques de fecha (2012-10-10) y eliminación de target=_blank en el
homenaje 17990.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 09:06:39 -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 d5475ede8f chore(sync): scripts ajustados para deploy a prod (staging wp-nuevo)
- autores_biblicos.php: 2ª pasada directa de reasignación de autor.
- quitar_multimedia.php: #4 como fichero reutilizable.
- trad_cats.php: quitado require_once con ruta local (wp eval-file ya carga WP).

Sync a prod ejecutado y verificado: código + 440 lecturas + grupo D + 8 usuarios
bíblicos + reasignación de autores y categorías. 0 fatales en las 5 portadas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:45:59 -04:00
rafa 70831f13f0 feat(i18n): #136 reasignación de categorías traducidas + autores bíblicos por idioma
- trad_cats.php: traduce categorías estructurales (Nuevo/Antiguo Testamento, etc.)
- fix_catnames.php: corrige nombres de términos traducidos
- autores_biblicos.php: crea usuarios NT/AT por idioma y reasigna autor de lecturas
- reasign_cats.php: reasigna a cada post no-ES las categorías del ES traducidas a
  su idioma (crea término espejo si falta). Idempotente/resumible (_cats_reasignadas).
  7977 posts procesados, 0 con categoría en idioma incorrecto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:10:27 -04:00
rafa 0bc58bfa96 feat(lecturas): lote masivo de lecturas bíblicas vía índice del leccionario
build_lectionary_index.py construye un índice por referencia bíblica
descargando un ciclo litúrgico de evangelizo.ws (combina idiomas por
reading_code, robusto a fiestas trasladadas por país). lecturas_apply.py
casa las lecturas ES por referencia y apply_lecturas_wp.php crea+asocia
las traducciones en Polylang. 440/501 lecturas cubiertas y publicadas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 11:38:45 -04:00
rafa 0da0c0eb59 feat(lecturas): descargador de lecturas bíblicas litúrgicas (evangelizo.org)
Descarga el texto litúrgico católico oficial en es/en/fr/it/pt por fecha
litúrgica (leccionario), para traducir las lecturas bíblicas de las cartas
sin LLM. Parsea las secciones (1ª lectura, salmo, 2ª lectura, evangelio).
Grupo C de #132.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 08:43:30 -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 66ee943da4 chore(verify): recuperar enum_urls.php y commitear tooling de verificación #121
El enumerador de URLs no se había commiteado y se perdió. Recuperado
reproduciendo la composición de la corrida previa (menús×5 idiomas +
categorías con contenido + contenido no-ES). Se añade también
classify_gaps.py (clasifica huecos: traducir vs descargar) y run_all.sh.
Outputs y .venv quedan en .gitignore.

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 6791afdb42 Handoff carta 46956: traducciones Haiku + evangelios descargados + scripts; despliegue prod pendiente (issue #88, #87) 2026-06-17 21:40:56 -04:00
rafa 27aad22cd5 Merge remote-tracking branch 'origin/main' 2026-06-14 19:32:40 -04:00
rafa 378ff6510f Update tracked WordPress core files 2026-06-14 19:30:16 -04:00
rafa 3ddfd8d665 Add Joomla PHP 8.3 local service 2026-06-14 19:29:28 -04:00
rafa efff1b9350 Document Joomla production delta import 2026-06-14 19:28:58 -04:00
OpenClaw Agent fb7eec883c docs: add Gemma 4 benchmark plan for Feadulta 2026-06-04 09:19:27 -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 587d718fde chore(wp): limpieza wordpress/ — backdoor reset.php, scripts migración, updraft
- Borrar reset.php (utilidad de reset password admin que dejamos suelta — backdoor)
- Archivar 25 scripts de migración K2→WP a archive/wp-migration-scripts/
- Borrar wp-config-docker.php (plantilla original Docker, sin uso) y
  clasificacion_articulos.csv (duplicado del que ya está en archive/logs-migracion/)
- updraft/: retención (5 ficheros backup completo Feb-02 + Feb-28 + Mar-15 +
  Abr-30 + 7 últimos días May) — borrados 47 backups + 32 logs (2.1 GB)
- Borrar 4 themes no usados (generatepress, kadence, twentytwentythree,
  twentytwentyfour) — solo astra + twentytwentyfive en uso
- Borrar wp-content/plugins/hello.php (Hello Dolly demo) y
  delete-duplicate-posts.zip (instalador antiguo, 1.9 MB)
- Borrar dirs vacíos wp-content/{plugins-old,upgrade,upgrade-temp-backup}

WP local: 7.8 GB → 5.7 GB (-2.1 GB)
2026-05-26 08:54:32 -04:00
rafa 39431c98e3 chore: reorganizar carpetas de backups y archivar scripts/logs
- Unificar backup/ + backups/ + Akeeba sueltos en backups/ etiquetados por fecha
  (pre-incidente Enero, Marzo, INFECTED 25-mayo, clean 25-mayo, wp-local-dumps)
- Mover scripts de setup-inicial (Feb 2026) y logs de migración a archive/
- Mover kickstart.* a tools/akeeba-kickstart/
- Borrar joomla-php83-old-local-20260525/ (6.3 GB) y google-chrome.deb
- Conservar solo 2 de 8 dumps WP del 25-mayo (los hotfixes ya están consolidados)
- README de inventario con MD5 en backups/README.md y archive/README.md
- .gitignore: trackear los README dentro de carpetas gitignored
2026-05-26 08:38:22 -04:00
rafa 08d203249d script(cats): aplicar clasificacion_articulos.csv a wp_term_relationships
Toma el output de regenerar_clasificacion_csv.py y añade en BD las cats
1645-1650 que el CSV indique y no estén ya. Modo 'add' (default, conservador)
solo añade; modo 'replace' (opt-in) también borra cats sobrantes.

Recalcula wp_term_taxonomy.count tras los cambios.

Aplicado en local 2026-05-25 modo 'add': +183 atribuciones (1645 +1,
1646 +17, 1647 +29, 1648 +11, 1649 +93, 1650 +32). Cubre delta marzo-mayo
2026 + sub-clasificación posicional en evangelio.

Refs #42.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 15:49:55 -04:00
rafa 64672857fd script(cats): sub-clasifica evangelio por posición (lectura/editorial/comentario)
Regla del editor confirmada contra CSV histórico: dentro de "Evangelio y
comentarios al Evangelio" el orden es siempre:
  pos 1 → lectura del evangelio
  pos 2 → comentario editorial
  pos 3+ → comentarios

Mejora diff contra CSV marzo 2026: 8.655 → 9.286 mismas cats
(de 1.599 a 968 divergencias, -631 resueltas).

Residual mayoritario son posts que ya no aparecen en las cartas
actuales (links eliminados, k2 ids sin mapping) o granularidad fina
no implementada (lectura dentro de eucaristía, secciones especiales).

Refs #42.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 15:43:28 -04:00
rafa 89fcd10a5d script: regenerar clasificacion_articulos.csv desde las cartas
Reproduce el CSV histórico (marzo 2026) recorriendo todas las cartas
(cat 6+21+22) y extrayendo los links agrupados por encabezado. Paridad
con mu-plugins/fea-carta-portada.php (#38).

Cobertura: 5 secciones core (comentario, articulo, eucaristia,
multimedia, effa). NO cubre granularidad fina del CSV histórico
(lectura, comentario_editorial, otro, noticia) ni encabezados de
fiestas especiales — esos quedan agrupados en la cat más cercana.

Usa pymysql para no depender del CLI mysql (que rompe el parsing
cuando post_content tiene tabs/newlines). Modo --diff compara contra
un CSV de referencia y reporta divergencias.

Resuelve #42.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 15:39:08 -04:00
rafa d21e7f1e12 script(avatars): face-crop con OpenCV + regen thumbnails
Re-procesa los 724 avatares col_*.png (imágenes horizontales con foto+texto)
recortándolos cuadrados centrados en la cara antes de mostrarlos como avatar
circular. Resuelve la queja del #39 sobre las fotos "stretcheadas".

- face_crop_avatar.py: Haar cascade frontal+profile, padding 0.6×, fallback
  inteligente para imágenes horizontales (recorta lado izquierdo), reduce
  side cuando padding no cabe (no invade lado del texto)
- regen_avatars.php: borra thumbnails viejos + regenera con la nueva imagen
  para todos los attachments de uploads/autores/joomla/

Resultado: 100 caras detectadas + 624 fallbacks (mayoría placeholders sin
foto real) + 0 fail. Attachment IDs preservados.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 15:09:01 -04:00
rafa 54132b772a script(avatars): import bulk col_*.png de Joomla → user_meta foto_perfil
Usado para resolver issue #39 — 736 avatares de autor importados desde
joomla-php83/images/quienes_somos/col_*.png. Crea attachments WP con
wp_insert_attachment + wp_generate_attachment_metadata y asigna foto_perfil
a cada user_id según matching exacto (login==slug) o strong (login es token).

Preserva foto_perfil ya asignado. TSV de entrada esperado en
/tmp/avatar_assignments.tsv con columnas: aid, login, posts, source, filename.
Ficheros pre-copiados a uploads/autores/joomla/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 14:57:40 -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 56ee1580b0 fix(content) + tools(e2e): rutas de imagen Joomla + suite E2E
- scripts/fix_image_paths.php: reescribe src/href "images/..." en wp_posts
  a "/fea/wp-content/uploads/..." cuando el fichero existe en uploads.
  Cubre comillas dobles/simples, urldecode antes de chequear filesystem.
  Resuelto contra issue #34 (458 posts, 465 refs) y completado con #36
  (124 posts, 128 refs tras recuperar 127 assets del backup producción).

- tools/e2e/: pipeline 3-tier para validar WP local con coste mínimo en
  tokens de Claude — Playwright (Tier 1, deterministas) + Gemma 4 vision
  en LM Studio (Tier 2, bajo demanda) + Claude solo lee report.md.
  Issue de diseño #37, suite inicial en sites/feadulta.json (13 URLs).

- .gitignore: excluir tools/e2e/node_modules y out/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 10:26:04 -04:00
rafa f857734130 docs: migrar documentación a la wiki del repo
Borrados:
- AUDITORIA_MIGRACION.md
- PLAN_MIGRACION.md
- WORDPRESS_CONFIG.md
- CARTAS_PARA_MIGRAR.md

README.md reducido a puntero a la wiki, que ahora contiene toda la
documentación operativa: credenciales, infraestructura, arquitectura WP,
áreas funcionales (cartas, evangelios, EFFA, autores, Brevo), scripts,
sincronización local→prod y roadmap.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 09:12:17 -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