Compare commits

..

3 Commits

Author SHA1 Message Date
rafa c24e8627b1 Merge pull request 'docs: cerrar el bloqueante de traducción en la guía de autoservicio (#222)' (#226) from docs/crear-traduccion-cierre-222 into main 2026-08-31 11:51:07 +00:00
rafa d2f79ae953 docs: cerrar el bloqueante de traducción — endpoint crear-traduccion ya desplegado
Actualiza la guía de autoservicio de traducción con la llamada real a
fea/v1/crear-traduccion (#225, ya en producción), verificada de extremo a
extremo por Claudix contra prod con un post desechable.
2026-08-31 07:50:52 -04:00
rafa 75e2bf2535 Merge pull request 'feat(api): endpoint para enlazar traducciones Polylang (#222)' (#225) from feat/crear-traduccion-api into main 2026-08-31 11:48:40 +00:00
@@ -2,9 +2,9 @@
> **Para quién es este documento:** para Inma y Mixbot, a partir de la conversación del > **Para quién es este documento:** para Inma y Mixbot, a partir de la conversación del
> 2026-08-31 en Buzz: además del audio ([#222](https://gitea.feadulta.com/rafa/feadulta/issues/222), > 2026-08-31 en Buzz: además del audio ([#222](https://gitea.feadulta.com/rafa/feadulta/issues/222),
> ver `docs/guia-tts-audio-autoservicio-inma-mixbot.md`), Rafa quiere traspasar también la > ver `docs/guia-tts-audio-autoservicio-inma-mixbot.md`), Rafa confirmó que la traducción se
> traducción. A diferencia del audio, hoy **no hay un issue abierto pidiéndolo** — este > traspasa también. El endpoint para enlazar traducciones (PR #225) se hizo bajo el paraguas
> documento adelanta el trabajo para cuando se dispare. > del propio #222.
> >
> **Motores autorizados por Rafa (2026-08-31):** un agente local con Haiku desde el propio > **Motores autorizados por Rafa (2026-08-31):** un agente local con Haiku desde el propio
> Claude/Cowork de Inma (no la API de pago de Rafa — es otra cuenta, otro caso), o MiniMax > Claude/Cowork de Inma (no la API de pago de Rafa — es otra cuenta, otro caso), o MiniMax
@@ -13,28 +13,43 @@
--- ---
## 0. Antes de nada: esto también tiene un tope bloqueante ## 0. Crear y enlazar la traducción — ya resuelto
Igual que pasaba con el audio, **hoy no hay forma de decirle a WordPress "esta traducción Ya existe un endpoint que crea el post traducido **y** lo enlaza con Polylang (idioma +
va en inglés y es la versión de este post en español"** desde fuera. Ese enlace (idioma + grupo de traducción) en una sola llamada — no hace falta tocar nada de bajo nivel:
grupo de traducción) lo gestiona Polylang con dos funciones PHP internas
(`pll_set_post_language`, `pll_save_post_translations`) que **no están expuestas por REST**
ni siquiera de lectura (el único endpoint que hay, `fea/v1/lang/{id}`, solo lee el idioma, no
permite fijarlo ni enlazar grupos).
Podéis crear el post traducido por `POST /wp/v2/posts` sin problema (igual que cualquier ```
artículo), pero **quedaría suelto**: sin idioma asignado y sin enlace Polylang al original en POST https://www.feadulta.com/wp-json/fea/v1/crear-traduccion
español, así que el selector de idioma del sitio no lo encontraría y no contaría como "la Authorization: Basic <usuario:contraseña_de_aplicación>
traducción EN de este artículo". Content-Type: multipart/form-data
**Esto necesita el mismo tipo de solución que el audio**: un endpoint `fea/v1/crear-traduccion` es_id=<ID del post ES>
(o registrar la taxonomía `language` de Polylang en REST con permisos de administrador) que lang=en|fr|it|pt
haga internamente lo mismo que ya hace `scripts/fea_translate_helper.php::create` en local: title=<título traducido>
crear el post, `pll_set_post_language($id, $lang)`, y `pll_save_post_translations($grupo)` content=<HTML traducido>
enlazándolo con el ES. No lo he encargado todavía — es una pieza más grande que la del audio excerpt=<opcional>
(toca la lógica central de multiidioma del sitio) y prefiero que Rafa decida el momento y el status=draft|publish (default draft)
alcance antes de que Codix la construya. Documento aquí el resto del proceso para que, en model=<opcional, solo trazabilidad — p.ej. "minimax" o "haiku-local">
cuanto ese hueco se cierre, solo falte la llamada final. ```
Respuesta (`201` si crea, `200` si ya existía — **es idempotente**, repetir la llamada con el
mismo `es_id`/`lang` nunca duplica):
```json
{"es_id": 56786, "lang": "en", "translation_id": 56787, "created": true,
"url": "https://www.feadulta.com/en/?p=56787"}
```
Por detrás replica exactamente lo que hacía `scripts/fea_translate_helper.php::create` en
local: asigna el idioma antes de las categorías, mapea cada categoría del ES a su
equivalente traducida (o la deja en español si no existe traducción de esa categoría),
preserva el resto del grupo de traducciones si el ES ya tenía otros idiomas, y añade los
metas de trazabilidad (`traduccion_automatica`, `traduccion_origen`, `traduccion_modelo`,
`traduccion_fecha`).
Verificado por Claudix el 2026-08-31 con una prueba real de extremo a extremo en producción
(post ES desechable → traducción EN creada → confirmado con `pll_get_post_translations` que
el grupo quedó `{es: ..., en: ...}` — todo borrado después).
--- ---
@@ -153,9 +168,8 @@ ritmo), parad y reintentad más tarde, no machaquéis la API.
## 7. Qué falta para que esto sea autoservicio de verdad ## 7. Qué falta para que esto sea autoservicio de verdad
- **Bloqueante (§0):** endpoint o mecanismo para fijar idioma + enlazar grupo Polylang de Con el endpoint del §0 ya no queda ningún bloqueante de infraestructura conocido para crear
cada traducción — sin esto podéis generar el texto pero no "engancharlo" al sitio como y enlazar traducciones por REST. Lo que sigue siendo trabajo vuestro, no de infraestructura:
traducción real, igual que pasaba con el audio antes del #222. generar el texto (motores del principio del documento), aplicar el QA del §4 antes de
- Decisión pendiente de Rafa (no la resuelvo yo aquí): si vuestro agente de traducción va a llamar al endpoint, y decidir cuándo pasáis una traducción de `draft` a `publish` (mismo
tener acceso de shell/SSH al WordPress (como tenía Hermes) o va a ser puramente REST como criterio que la carta en español, ver `docs/guia-publicacion-carta-inma.md`).
el resto de vuestro trabajo — cambia bastante el diseño del endpoint que haría falta.