De todos los sistemas que existen para poder ofrecer contenido multiidioma en WordPress, WPML es una solución más completa y sencilla, especialmente en proyectos de tamaño pequeño o mediano. Su integración con prácticamente cualquier tema o plugin popular lo convierte en una herramienta extremadamente versátil, que no requiere conocimientos técnicos avanzados para empezar a funcionar. Permite traducir entradas, páginas, menús, taxonomías, custom post types que hayas creado o cadenas de texto del tema o plugins, todo desde una interfaz intuitiva dentro del propio panel de WordPress.
Además, WPML ofrece un excelente equilibrio entre funcionalidades y facilidad de uso. A diferencia de otras opciones más complejas o enfocadas a proyectos empresariales, WPML (que por cierto viene de WordPress MultiLingual) no abruma al usuario con configuraciones innecesarias, pero sigue permitiendo una traducción profesional, ya sea manual o mediante servicios automáticos o de traductores externos. Su instalación es sencilla y directa y no depende de servicios externos o de arquitecturas algo más complejas como pueda ser una red WordPress.
Por eso mismo es una solución muy popular y me encuentro con bastantes proyectos que lo usan, así que eso unido a su potente API en PHP (que por cierto tiene algunas rarezas en comparación con las API de otros plugins similares), trabajo mucho con sus funciones y aquí os traigo un pequeño código que he estado usando muy a menudo últimamente.
Obtener el ID de las traducciones de un contenido en WordPress
Imaginemos que tenemos un contenido en WordPress, de cualquier tipo, y tenemos su ID y su post_type, y queremos saber las traducciones de ese contenido para hacer cualquier operación sobre ellas: mostrar accesos directos a las mismas, actualizar algún dato en todos a la vez o la operación que necesitéis.
Pues os dejo el código y ahora os lo explico:
$element_type = apply_filters( 'wpml_element_type', 'post_' . get_post_type($post_id) );
$trid = apply_filters( 'wpml_element_trid', null, $post_id, $element_type );
$translations = wpml_get_element_translations( $trid );
foreach ( $translations as $lang_code => $translation ) {
echo 'Idioma: ' . $lang_code . ' → Post ID: ' . $translation->element_id . '<br>';
}- Se supone que tenemos ya el post_id
- Obtenemos primero el tipo de elemento, que no es el post_type directamente sino una combinación que usa WPML para poder distinguir entre datos de tipo post, taxonomías o cualquier otro tipo
- Con ese tipo de elemento, podemos pedir el trid del post, si os fijáis en vez de llamar a una función con parámetros se llama a un hook wpml_element_trid, le pasamos un nulo como primer elemento, el que devolvería, el post_id y el tipo de elemento
- Con este trid, ya obtenemos las traducciones y las recorremos
Y os preguntaréis qué es el trid (que viene de translation identifier). El trid identifica que varios posts (o páginas, o términos…) son traducciones entre sí. Todos los idiomas que son versiones del mismo contenido comparten el mismo trid.
Si queréis verlo gráficamente, sería algo así:
| Idioma | Post ID | Título | trid |
|---|---|---|---|
| es | 101 | «Nosotros» | 50 |
| en | 205 | «About Us» | 50 |
| fr | 309 | «À propos de nous» | 50 |
Esta información realmente se guarda en la base de datos en la tabla wp_icl_translations (o con el prefijo cambiado si está cambiado en vuestra instalación) que tiene esta forma:
| ID | element_type | element_id | trid | language_code | source_language_code |
|---|---|---|---|---|---|
| 1 | post_post | 101 | 50 | es | NULL |
| 2 | post_post | 205 | 50 | en | es |
| 3 | post_post | 309 | 50 | fr | es |
Así a través de esta tabla se relaciona esta información y WPML sabe qué datos mostrar al usuario cuando está visitando la web.

