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>
This commit is contained in:
2026-06-27 18:24:53 -04:00
parent 493fd4d835
commit d959331ed0
+99
View File
@@ -0,0 +1,99 @@
# Plan — Buscador avanzado NATIVO (feadulta #8, sin Typesense)
> **Para el agente ejecutor (Sonnet).** Replica el «Buscador avanzado» del Joomla viejo
> con WordPress nativo + MySQL FULLTEXT. Corre en el hosting actual (sin Docker/servicios).
> Typesense queda como mejora futura opcional (`docs/plan-buscador-typesense.md`).
## ⛔ Restricciones DURAS
- **Trabaja SOLO en LOCAL** (contenedor Docker `wordpress-web`, navegable en `http://localhost:8081/`;
equivalente Tailscale `https://farmer.taild3aaf6.ts.net/fea/`).
- **NO toques producción.** No abras SSH a `feadulta@134.0.10.170`. No despliegues nada.
- **NO commitees.** Deja el working tree listo; Rafa verifica antes de subir.
- wp-cli: usa `docker exec wordpress-web wp eval '<php>' --allow-root` y `wp eval-file`.
**`wp db query` NO funciona** en este contenedor (sin binario mysql) → para SQL usa
`global $wpdb; $wpdb->query(...)` dentro de `wp eval`.
- No metas bloques Gutenberg (`<!-- wp:... -->`) en `post_content` vía CLI (se guardan literales).
- Sigue el estilo de los mu-plugins existentes (`wordpress/wp-content/mu-plugins/fea-*.php`).
## Contexto ya hecho (fase 1, MVP nativo, en prod y local)
- `mu-plugins/fea-search.php`: barra de búsqueda visible en móvil; action a la raíz del
idioma (Polylang). En desktop se usa el buscador del menú.
- Template FSE `search` (creado con `scripts/set_search_template.php`) que muestra los
resultados en **rejilla de tarjetas** reutilizando las clases `fea-archive-grid` /
`fea-archive-card` (las del `archive`, #63). En local es el wp_template post 53826.
- La búsqueda nativa `/?s=` funciona.
## Qué tenía el «Buscador avanzado» K2 (a replicar)
Cinco modos: **palabra**, **autor**, **tema (categoría)**, **cita bíblica**, **fecha**.
## Implementación
### 1. Motor: MySQL FULLTEXT
- Verifica engine/versión: `SELECT VERSION()`, engine de `wp_posts` (esperado InnoDB, MySQL ≥5.6).
- Añade índice (idempotente; comprueba antes con `SHOW INDEX ... WHERE Index_type='FULLTEXT'`):
`ALTER TABLE wp_posts ADD FULLTEXT fea_ft (post_title, post_content);`
- mu-plugin **`fea-search-fulltext.php`**: en `is_search() && is_main_query() && !is_admin()`
y con términos, sustituye el `LIKE` por
`MATCH(wp_posts.post_title, wp_posts.post_content) AGAINST ('<term>*' IN BOOLEAN MODE)`
(filtros `posts_search` + `posts_search_orderby`/`posts_clauses`), ordenando por relevancia
cuando no se pida otro orden. Sanitiza el término. Si falla/no aplica, deja el comportamiento
nativo (degradación elegante). Debe **convivir** con los filtros del punto 3 (autor, cat,
date, meta) sin romper el WHERE.
### 2. Formulario de búsqueda avanzada
- mu-plugin **`fea-search-advanced.php`** que renderiza un formulario (method=get, action a la
raíz del idioma como en `fea-search.php`) con:
- texto `s` (palabra/frase),
- `<select name="fea_author">` (autores con ≥30 posts, excluyendo `FEA_AUTORES_EXCLUIR`
= [1,890,1049,1540], orden por `display_name`),
- `<select name="fea_cat">` (categorías TEMA: 1650 Artículos, 1647 Comentarios al evangelio,
1648 Eucaristía, 1649 Multimedia, 1645 Lecturas, 1646 Comentario editorial, 63 EFFA — usa
slugs/ids reales; excluye las de carta 6/21/22),
- texto `fea_cita` (cita bíblica, ej. «Jn 3» o «Mt»),
- fechas `fea_date_from` / `fea_date_to` (o año desde/hasta).
- Muéstralo en la página de resultados (template search) arriba, con los valores seleccionados
persistentes. Añade un enlace «Búsqueda avanzada» desde la barra `fea-search`.
- Considera una página dedicada `/buscar` (page slug `buscar`) que muestre el formulario aunque
no haya consulta aún (opcional pero recomendable como destino del enlace).
### 3. Aplicar filtros — `pre_get_posts`
En el mismo mu-plugin, registra las query vars (`query_vars` filter) y en `pre_get_posts`
(`is_search`, main query, !admin):
- `fea_author``$q->set('author', (int))`.
- `fea_cat``$q->set('cat', (int))`.
- `fea_cita``meta_query` `[['key'=>'_cita_evangelio','value'=>$cita,'compare'=>'LIKE']]`
(el sitio ya tiene 4.290 metas `_cita_evangelio`).
- `fea_date_from`/`fea_date_to``date_query`.
Combinables entre sí y con la palabra (FULLTEXT). Si solo se pasan filtros sin `s`, debe
funcionar igual (listado filtrado).
### 4. UI de resultados
- Reutiliza el template `search` (rejilla `fea-archive-card`). Añade el **autor** en cada
tarjeta (byline corto) y, arriba, el formulario del punto 2 + un «N resultados» + chips de
filtros activos. Mantén la estética del sitio (carmesí #8b1a2e).
### 5. Multiidioma
- Polylang filtra por idioma (no fuerces `lang`). Action del form a la raíz del idioma actual.
- Categorías: usa las traducidas vía Polylang cuando el idioma ≠ es. Autores: los mismos.
- Textos de la UI (labels, placeholder) por idioma (array es/en/fr/it/pt; al menos es/en).
## Verificación (en local, OBLIGATORIA antes de entregar)
Usa la suite Playwright (`tools/e2e`, scripts `shot_*.cjs`; ejecuta con
`NODE_PATH=tools/e2e/node_modules node tools/e2e/<script>.cjs`, apuntando a `http://localhost:8081`).
Comprueba y captura:
1. FULLTEXT activo: una consulta (`/?s=oración`) ordena por relevancia y responde rápido.
2. Filtro **autor**: `/?s=&fea_author=<ID>` devuelve solo de ese autor.
3. Filtro **tema**: `/?fea_cat=1650`.
4. Filtro **cita bíblica**: `/?fea_cita=Jn` devuelve posts con `_cita_evangelio` que empieza por «Jn».
5. Filtro **fecha**: rango acota por fechas.
6. **Combinado**: palabra + autor.
7. **Multiidioma**: en `/en/?s=love` la UI y resultados salen en inglés.
8. Formulario visible y usable en **desktop y móvil** (capturas).
## Entregable (reporta al terminar)
- Lista de ficheros creados/modificados (mu-plugins/ y scripts/).
- Capturas de la verificación (ruta).
- Resumen de qué funciona y limitaciones.
- **Checklist de despliegue a prod** (para que lo haga Rafa después): subir los mu-plugins a
`/web/wp-nuevo/wp-content/mu-plugins/`, aplicar el `ALTER TABLE ... ADD FULLTEXT` en la BD de
prod, recrear el template/página si aplica. NO lo ejecutes tú.