feat(api): endpoint para enlazar traducciones Polylang (#222) #225

Merged
rafa merged 2 commits from feat/crear-traduccion-api into main 2026-08-31 11:48:41 +00:00
Owner

Añade POST /wp-json/fea/v1/crear-traduccion, replicando scripts/fea_translate_helper.php::create para que Inma/Mixbot puedan crear y enlazar traducciones (idioma + grupo Polylang + categoría mapeada) sin acceso de shell al WordPress, cerrando el hueco que quedaba anotado en docs/guia-traduccion-autoservicio-inma-mixbot.md.

QA de Claudix contra el WordPress local (wordpress-web), con un post ES desechable (categoría 6 = cartasemana) y una contraseña de aplicación temporal, todo borrado después:

  • Los 8 casos del test de integración pasan (401, parámetros inválidos ×4, 404, creación 201, idempotencia 200).
  • Verificado directamente en WP (no solo por la respuesta JSON) que el enlace Polylang quedó correcto: pll_get_post_language da es/en en cada post, pll_get_post_translations(es_id) devuelve el grupo {es: 56426, en: 56427}, y la categoría se mapeó 6 → 3077 (cartasemana ES → EN) tal como predice el helper local.
  • Repetir la llamada con el mismo es_id/lang devuelve 200 con el mismo translation_id y created:false — no duplica.

Fix incluido en este PR (commit 3fb5a3b): el test de integración original fallaba con curl: (26) porque -F 'content=<p>...' hace que curl interprete el < inicial como "leer el valor desde este fichero" en vez de como HTML literal. Cambiado a --form-string para ese campo — no toca el endpoint, solo el test.

⚠️ Este endpoint toca la lógica central de multiidioma (Polylang) del sitio — antes de considerarlo definitivo conviene el mismo tipo de smoke test real en prod que se hizo para subir-audio (#224), con un post desechable, antes de que Inma/Mixbot lo usen contra contenido real.

Ref #222.

Añade `POST /wp-json/fea/v1/crear-traduccion`, replicando `scripts/fea_translate_helper.php::create` para que Inma/Mixbot puedan crear y enlazar traducciones (idioma + grupo Polylang + categoría mapeada) sin acceso de shell al WordPress, cerrando el hueco que quedaba anotado en `docs/guia-traduccion-autoservicio-inma-mixbot.md`. **QA de Claudix contra el WordPress local (`wordpress-web`)**, con un post ES desechable (categoría 6 = cartasemana) y una contraseña de aplicación temporal, todo borrado después: - Los 8 casos del test de integración pasan (401, parámetros inválidos ×4, 404, creación 201, idempotencia 200). - Verificado directamente en WP (no solo por la respuesta JSON) que el enlace Polylang quedó correcto: `pll_get_post_language` da `es`/`en` en cada post, `pll_get_post_translations(es_id)` devuelve el grupo `{es: 56426, en: 56427}`, y la categoría se mapeó `6 → 3077` (cartasemana ES → EN) tal como predice el helper local. - Repetir la llamada con el mismo `es_id`/`lang` devuelve 200 con el mismo `translation_id` y `created:false` — no duplica. **Fix incluido en este PR** (commit `3fb5a3b`): el test de integración original fallaba con `curl: (26)` porque `-F 'content=<p>...'` hace que curl interprete el `<` inicial como "leer el valor desde este fichero" en vez de como HTML literal. Cambiado a `--form-string` para ese campo — no toca el endpoint, solo el test. ⚠️ Este endpoint toca la lógica central de multiidioma (Polylang) del sitio — antes de considerarlo definitivo conviene el mismo tipo de smoke test real en prod que se hizo para `subir-audio` (#224), con un post desechable, antes de que Inma/Mixbot lo usen contra contenido real. Ref #222.
rafa added 2 commits 2026-08-31 11:48:14 +00:00
curl -F trata un valor que empieza por "<" como "leer desde este fichero",
no como el literal HTML que se pretendía enviar (falla con curl: (26)
Failed to open/read local data from file). --form-string evita esa lectura
especial. Verificado por Claudix (QA) contra wordpress-web local: con el
fix, los 8 casos pasan y Polylang enlaza idioma/grupo/categoría
correctamente (56426 es -> 56427 en, grupo {es:56426,en:56427}, categoria
6->3077).
rafa merged commit 75e2bf2535 into main 2026-08-31 11:48:41 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#225