Como consultar conteúdo multilíngue com o WPGraphQL – filtragem de idiomas e traduções
Aprenda a consultar conteúdo específico de um idioma, buscar traduções e expor menus multilíngues por meio do WPGraphQL em um site WordPress headless. O WPML GraphQL adiciona um argumento de idioma e um campo de traduções ao esquema do WPGraphQL, para que o Next.js, Nuxt, Astro, Gatsby ou qualquer outro front-end possa obter o conteúdo do idioma certo em uma única solicitação.
Antes de começar
Instale e ative estes plugins:
- WPGraphQL (o plugin de código aberto do projeto WPGraphQL).
- WPML e WPML Tradução de Strings.
- WPML GraphQL (o complemento que esta página aborda).
Se você também usa o Advanced Custom Fields:
- Advanced Custom Fields Multilingual (ACFML).
- WPGraphQL for Advanced Custom Fields (do projeto WPGraphQL).
Seu conteúdo de origem precisa ser traduzido no WPML antes que as consultas abaixo tenham algo a retornar. Com o Traduzir tudo automaticamente ativado (o padrão do WPML 5), as traduções são produzidas em segundo plano à medida que você publica o conteúdo. Para uma configuração manual, envie o conteúdo para tradução em WPMLTraduçõesPainel. Os posts e termos traduzidos são o que as consultas GraphQL abaixo filtram e retornam.
O IDE do GraphQL – onde testar as consultas
O WPGraphQL adiciona uma tela GraphQLGraphQL IDE ao painel de administração do WordPress. O Query Composer do IDE lista todos os campos disponíveis, incluindo o argumento language e o campo translations do WPML, e executa consultas em seu site de produção. Teste as consultas lá antes de integrá-las ao seu framework de front-end.
O endpoint do GraphQL para cada idioma
O WPGraphQL responde em /graphql. Uma consulta sem um argumento language retorna o conteúdo no seu idioma padrão. Para obter o conteúdo em outro idioma, adicione where: { language: "es" } à consulta.
Consulte o conteúdo por idioma
Adicione where: { language: "<code>" } a qualquer consulta de lista: posts, tipos de post personalizados, termos de taxonomia, menus, itens de menu, comentários. O código do idioma é o mesmo que o WPML usa em todos os lugares (en, es, fr, pt-pt, e assim por diante). Passe language: "all" para retornar o conteúdo de todos os idiomas de uma só vez.
query PostsES {
posts(where: { language: "es" }) {
nodes {
slug
uri
categories {
nodes { name }
}
}
}
}
Quando um nó de nível superior é filtrado por idioma, os itens conectados (categorias, tags, taxonomias personalizadas) seguem automaticamente o mesmo idioma. A consulta acima retorna posts em espanhol com categorias em espanhol, sem a necessidade de argumentos extras.
Busque todas as traduções de um nó em uma única consulta
Adicione o campo translations a qualquer consulta de post ou taxonomia para retornar as versões em outros idiomas do nó no mesmo payload:
query PostsWithTranslations {
posts(where: { language: "en" }) {
nodes {
slug
uri
language { code }
translations {
slug
uri
language { code }
}
}
}
}
Cada post retorna com seus campos em inglês, além de um array de seus slugs e URIs em outros idiomas. Esse é o formato que um seletor de idiomas renderizado ao lado do conteúdo da página usa: uma solicitação, todas as alternativas para as quais o visitante pode alternar.
Consulte um post específico por ID ou slug em qualquer idioma
Para buscar diretamente um único post traduzido (por seu slug traduzido ou por ID do banco de dados), use a consulta post singular com 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 as consultas retornam o post traduzido (título, slug, URI) sem filtragem adicional no front-end.
Menus multilíngues
Consulte menus e itens de menu por idioma com o mesmo argumento where: { language }. Para obter os itens de um local de menu do tema, adicione também o local:
query NavES {
menuItems(where: { language: "es", location: PRIMARY }) {
nodes {
label
url
path
}
}
}
Para listar os menus de um idioma, use a consulta menus:
query MenusES {
menus(where: { language: "es" }) {
nodes {
name
locations
}
}
}
O label e o url de cada item de menu retornam no idioma consultado. Os itens de menu que apontam para posts traduzidos são resolvidos automaticamente para o URI traduzido. A consulta menu singular não tem o argumento language, portanto, use menus ou menuItems para escolher o idioma.
Idiomas instalados – para um seletor de idiomas
Para um seletor de idiomas global (independente de qualquer post individual), use as consultas languages e defaultLanguage para listar todos os idiomas do site:
query SiteLanguages {
languages {
code
country_flag_url
default_locale
native_name
translated_name
url
}
defaultLanguage {
code
native_name
}
}
Retorna um nó por idioma ativo com a URL da bandeira, nome nativo, nome traduzido e a URL inicial do idioma. Isso é dado suficiente para renderizar um seletor de bandeira e rótulo sem fixar a lista de idiomas no código.
Consulte campos personalizados do ACF por idioma
Quando o ACFML e o WPGraphQL for ACF estão ativos, os campos do ACF em um post ou tipo de post personalizado retornam os valores salvos nesse post. Cada tradução tem seus próprios valores, portanto, consulte o post no idioma que você precisa. Nenhum argumento extra é necessário.
Para as páginas de opções do ACF, que não estão vinculadas a um único post, adicione o argumento language à consulta da página de opções:
query Settings {
myOptionPage(language: "de") {
addressFieldGroup {
addressTitle
repeaterAddressDetails { addressDetails }
}
}
}
O argumento espera um código de idioma que corresponda a um dos idiomas ativos do seu site.
Desde o WPGraphQL for ACF 3.0.0, uma página de opções está no esquema do GraphQL apenas quando você ativa o show_in_graphql para ela. Sem isso, a consulta da página de opções e seu argumento language não existem. Se você registrar a página de opções no código, adicione a configuração lá:
acf_add_options_page( array(
'page_title' => 'Site Settings',
'menu_slug' => 'site-settings',
'show_in_graphql' => true,
'graphql_field_name' => 'siteSettings',
) );
Detalhes do autor traduzidos
O WPML GraphQL retorna os campos firstName, lastName, nickname e description traduzidos dos usuários. Para traduzi-los:
- Vá para a página WPMLTradução de Strings.
- Na opção Traduzir propriedades do usuário, selecione as funções de usuário e salve.
- Traduza as strings no domínio Authors.
Limitações conhecidas e soluções alternativas
- URIs traduzidos em alguns formatos de consulta. Ao buscar um post traduzido por URI (
contentNode(id: "/de/some-slug/", idType: URI)), verifique se o URI retornado corresponde ao que está publicado no idioma – alguns formatos de consulta retornam caminhos inconsistentes. Teste no IDE do GraphQL antes de integrar ao roteamento. - Páginas de opções do ACF sem o argumento
languagerecorrem ao idioma padrão. Sempre passelanguagepara consultas de página de opções em sites multilíngues.
Se você encontrar um problema de integração não listado aqui, a equipe de suporte do WPML cobre o lado WPML da stack do WPGraphQL 24 horas por dia, 7 dias por semana.