# Multilify: guía de configuración para agentes de IA

> Multilify es un plugin gratuito de WordPress (GPL v2 o posterior) que hace multilingüe un sitio sin duplicar entradas. Cada traducción se guarda en los metadatos de la propia entrada original, bajo su código de idioma, y cada idioma distinto del predeterminado recibe un prefijo de URL como /de/. El plugin no hace ninguna petición al exterior.

## Reglas básicas

- Muestra tu plan al usuario y espera su aprobación antes de cambiar nada.
- En un sitio en producción, trabaja primero en una copia de staging.
- Nunca edites ni borres el título, el contenido o el slug de la propia entrada. Las traducciones se guardan a su lado.
- Nunca borres el plugin para empezar de cero. Borrarlo desde el escritorio elimina todas las traducciones. Desactivarlo las conserva.
- Nunca cambies un código de idioma existente. Las traducciones se guardan bajo ese código.

## 1. Comprueba el sitio

```bash
wp core version                      # 5.8 o posterior
wp eval 'echo PHP_VERSION;'          # 7.4 o posterior
wp option get permalink_structure    # no puede estar vacío, p. ej. /%postname%/
```

## 2. Instala

```bash
wp plugin install multilify --activate
wp plugin list --name=multilify --fields=name,status,version
```

## 3. Idiomas

```bash
wp option get multilify_languages --format=json
wp option get multilify_default_language
```

La lista es un array de objetos: `{"code":"de","name":"Deutsch","flag":"🇩🇪"}`. Un código tiene de dos a cinco letras minúsculas (`^[a-z]{2,5}$`). Se convierte en el prefijo de la URL y no puede ser una palabra que WordPress ya usa en sus direcciones (feed, page, embed, wp, index, tag, date, type, order, paged, cpage, rest y las bases de autor, búsqueda, comentarios y paginación) ni el slug de una entrada o página que ya exista.

La pantalla de ajustes (Multilify en el menú del escritorio) comprueba todo esto. Desde la línea de comandos, escribe la lista completa y luego regenera las reglas de reescritura:

```bash
wp option update multilify_languages '[{"code":"en","name":"English","flag":"🇬🇧"},{"code":"de","name":"Deutsch","flag":"🇩🇪"}]' --format=json
wp rewrite flush
```

Sin ese paso, las direcciones del idioma nuevo devuelven 404.

## 4. Traducciones

Cada entrada tiene tres claves de metadatos por idioma:

```bash
wp post meta update <ID> _multilang_title_<code> "Título traducido"
wp post meta update <ID> _multilang_slug_<code> "slug-traducido"
wp post meta update <ID> _multilang_content_<code> "<p>Contenido traducido</p>"
```

- El panel del editor aplica `sanitize_title()` al slug y `wp_kses_post()` al contenido. Un script tiene que hacer lo mismo.
- Un slug tiene que ser único dentro de su idioma. El panel numera un duplicado (-2, -3); un script tiene que hacerlo por su cuenta.
- Si el slug está vacío, se usa el de la propia entrada, con el prefijo del idioma delante.
- Una entrada sin traducción muestra el texto del idioma predeterminado en la dirección del idioma, y su enlace canónico apunta a la dirección predeterminada.
- Las entradas y las páginas se pueden traducir desde el principio. Otros tipos de contenido se añaden en PHP con el filtro `multilify_post_types`.

## 5. Selector de idioma

```text
[multilify_switcher]
[multilify_switcher show_name="false"]
<?php multilify_switcher(); ?>
```

## 6. Verifica

```bash
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/<code>/<translated-slug>/   # 200
curl -s https://example.com/<code>/<translated-slug>/ | grep -o '<html lang="[^"]*"'      # el código
curl -s https://example.com/<code>/<translated-slug>/ | grep -o 'hreflang="[a-z-]*"'      # el predeterminado, el código, x-default
```

## Filtros

- `multilify_post_types`: qué tipos de contenido tienen panel de traducción.
- `multilify_translated_title`: el título traducido tal como lo muestra el tema.
- `multilify_translated_content`: el contenido traducido, antes de mostrarse.
- `multilify_flag_choices`: las banderas que ofrece la pantalla de ajustes.
- `multilify_locale`: el locale de WordPress que se carga para un idioma.
- `multilify_enable_browser_detection`: si a quien entra por primera vez en la raíz del sitio se le redirige al idioma de su navegador.
- `multilify_is_crawler`: si una petición se considera de un rastreador.

## Lo que no admite

Un dominio o subdominio por idioma, códigos con guion como pt-br, y la traducción de menús, widgets, extractos, categorías, etiquetas y campos personalizados.

## Más

- Documentación: https://multilify.com/es/docs
- Preguntas: https://multilify.com/es/faq
- Código fuente: https://github.com/kadirermantr/multilify
