Cómo consultar contenido multilingüe con WPGraphQL: filtrado de idiomas y traducciones
Aprenda a consultar contenido específico de un idioma, obtener traducciones y exponer menús multilingües a través de WPGraphQL en un sitio de WordPress headless. WPML GraphQL añade un argumento de idioma y un campo de traducciones al esquema de WPGraphQL, para que Next.js, Nuxt, Astro, Gatsby o cualquier otro front-end pueda extraer el contenido del idioma correcto en una sola petición.
Antes de empezar
Instale y active estos plugins:
- WPGraphQL (el plugin de código abierto del proyecto WPGraphQL).
- WPML y WPML Traducción de cadenas.
- WPML GraphQL (el complemento que trata esta página).
Si también utiliza Advanced Custom Fields:
- Advanced Custom Fields Multilingual (ACFML).
- WPGraphQL for Advanced Custom Fields (del proyecto WPGraphQL).
Su contenido de origen debe estar traducido en WPML antes de que las consultas siguientes puedan devolver algo. Con la opción Traducir todo automáticamente activada (el valor predeterminado en WPML 5), las traducciones se generan en segundo plano a medida que publica contenido. Para una configuración manual, envíe el contenido a traducir desde WPMLTraduccionesEscritorio. Las entradas y los términos traducidos son lo que las consultas GraphQL a continuación filtran y devuelven.
El IDE de GraphQL: dónde probar las consultas
WPGraphQL añade una pantalla GraphQLGraphQL IDE al panel de administración de WordPress. El Query Composer del IDE enumera todos los campos disponibles, incluidos el argumento language y el campo translations de WPML, y ejecuta consultas en su sitio en vivo. Pruebe las consultas allí antes de integrarlas en su framework de front-end.
El endpoint de GraphQL para cada idioma
WPGraphQL responde en /graphql. Una consulta sin un argumento language devuelve el contenido en su idioma predeterminado. Para obtener contenido en otro idioma, añada where: { language: "es" } a la consulta.
Consultar contenido por idioma
Añada where: { language: "<code>" } a cualquier consulta de lista: entradas, tipos de contenido personalizado, términos de taxonomía, menús, elementos de menú o comentarios. El código de idioma es el mismo que WPML utiliza en todas partes (en, es, fr, pt-pt, etc.). Pase language: "all" para devolver contenido de todos los idiomas a la vez.
query PostsES {
posts(where: { language: "es" }) {
nodes {
slug
uri
categories {
nodes { name }
}
}
}
}
Cuando un nodo de nivel superior se filtra por idioma, los elementos conectados (categorías, etiquetas, taxonomías personalizadas) siguen automáticamente el mismo idioma. La consulta anterior devuelve entradas en español con categorías en español, sin necesidad de argumentos adicionales.
Obtener todas las traducciones de un nodo en una sola consulta
Añada el campo translations a cualquier consulta de entrada o taxonomía para devolver las versiones en otros idiomas del nodo en la misma respuesta:
query PostsWithTranslations {
posts(where: { language: "en" }) {
nodes {
slug
uri
language { code }
translations {
slug
uri
language { code }
}
}
}
}
Cada entrada se devuelve con sus campos en inglés más un array con sus slugs y URI en otros idiomas. Esta es la estructura que utiliza un selector de idiomas mostrado junto al contenido de la página: una sola petición con todas las alternativas a las que el visitante puede cambiar.
Consultar una entrada específica por ID o slug en cualquier idioma
Para obtener una única entrada traducida directamente (por su slug traducido o por su ID de base de datos), utilice la consulta singular post con idType:
query PostBySlug {
post(id: "hola-mundo", idType: SLUG) {
title
slug
uri
language { code }
}
}
query PostById {
post(id: "2", idType: DATABASE_ID) {
title
slug
uri
language { code }
}
}
Ambas consultas devuelven la entrada traducida (título, slug, URI) sin necesidad de más filtrado en el front-end.
Menús multilingües
Consulte menús y elementos de menú por idioma con el mismo argumento where: { language }. Para obtener los elementos de una ubicación del menú del tema, añada también la ubicación:
query NavES {
menuItems(where: { language: "es", location: PRIMARY }) {
nodes {
label
url
path
}
}
}
Para listar los menús de un idioma, utilice la consulta menus:
query MenusES {
menus(where: { language: "es" }) {
nodes {
name
locations
}
}
}
El label y url de cada elemento del menú se devuelven en el idioma consultado. Los elementos del menú que enlazan a entradas traducidas se resuelven automáticamente a la URI traducida. La consulta singular menu no tiene argumento language, así que utilice menus o menuItems para elegir el idioma.
Idiomas instalados: para un selector de idiomas
Para un selector de idiomas global (independiente de cualquier entrada), utilice las consultas languages y defaultLanguage para listar todos los idiomas del sitio:
query SiteLanguages {
languages {
code
country_flag_url
default_locale
native_name
translated_name
url
}
defaultLanguage {
code
native_name
}
}
Devuelve un nodo por cada idioma activo con la URL de la bandera, el nombre nativo, el nombre traducido y la URL de inicio del idioma. Estos son datos suficientes para mostrar un selector con bandera y etiqueta sin tener que programar la lista de idiomas de forma rígida.
Consultar campos personalizados de ACF por idioma
Cuando ACFML y WPGraphQL for ACF están activos, los campos de ACF en una entrada o tipo de contenido personalizado devuelven los valores guardados en esa entrada. Cada traducción tiene sus propios valores, por lo que debe consultar la entrada en el idioma que necesite. No se necesitan argumentos adicionales.
Para las páginas de opciones de ACF, que no están vinculadas a una sola entrada, añada el argumento language a la consulta de la página de opciones:
query Settings {
myOptionPage(language: "de") {
addressFieldGroup {
addressTitle
repeaterAddressDetails { addressDetails }
}
}
}
El argumento espera un código de idioma que coincida con uno de los idiomas activos de su sitio.
Desde WPGraphQL for ACF 3.0.0, una página de opciones solo aparece en el esquema de GraphQL cuando activa show_in_graphql para ella. Si no lo hace, la consulta de la página de opciones y su argumento language no existirán. Si registra la página de opciones por código, añada la configuración allí:
acf_add_options_page( array(
'page_title' => 'Site Settings',
'menu_slug' => 'site-settings',
'show_in_graphql' => true,
'graphql_field_name' => 'siteSettings',
) );
Detalles de autor traducidos
WPML GraphQL devuelve firstName, lastName, nickname y description traducidos de los usuarios. Para traducirlos:
- Vaya a la página WPMLTraducción de cadenas.
- En la opción Translate User properties, seleccione los roles de usuario y guarde.
- Traduzca las cadenas en el dominio Authors.
Limitaciones conocidas y soluciones alternativas
- URI traducidas en algunas formas de consulta. Al obtener una entrada traducida por URI (
contentNode(id: "/de/some-slug/", idType: URI)), verifique que la URI devuelta coincida con lo publicado en el idioma: algunas formas de consulta devuelven rutas inconsistentes. Pruebe en el IDE de GraphQL antes de integrarlo en el enrutamiento. - Las páginas de opciones de ACF sin el argumento
languagerecurren al idioma predeterminado. Pase siemprelanguagepara las consultas de la página de opciones en sitios multilingües.
Si se encuentra con un problema de integración que no aparece aquí, el equipo de soporte de WPML cubre el lado de WPML del stack de WPGraphQL las 24 horas del día, los 7 días de la semana.