Polylang
PolylangPolylang

Polylang

Intégration avec le plugin Polylang (et aussi Polylang PRO).

Le schéma GraphQL est enrichi des champs pour récupérer des données multilingues.

Types Root/QueryRoot

Interrogez les métadonnées du site configurées dans Polylang.

ChampDescription
polylangDefaultLanguageLangue par défaut dans Polylang, ou null si aucune langue n'est activée.
polylangLanguagesListe des langues dans Polylang.

En exécutant cette requête :

{
  polylangDefaultLanguage {
    code
  }
  polylangLanguages {
    code
  }
}

...pourrait produire :

{
  "data": {
    "polylangDefaultLanguage": {
      "code": "en"
    },
    "polylangLanguages": [
      {
        "code": "en"
      },
      {
        "code": "es"
      },
      {
        "code": "fr"
      }
    ]
  }
}

Types Post, Page, PostTag, PostCategory et Media

Interrogez la langue de l'entité, et les IDs des traductions de cette entité.

Ces types implémentent l'interface PolylangTranslatable. (Le type Media ne le fait que lorsque le support des médias est activé, via les paramètres Polylang.)

ChampDescription
polylangLanguageLangue de l'article ou de la page, ou null si aucune langue n'a été assignée (p. ex. : Polylang a été installé plus tard).
polylangTranslationLanguageIDsNœuds pour toutes les langues de traduction de l'entité, sous forme d'objet JSON avec le code de langue comme clé et l'ID de l'entité comme valeur, ou null si aucune langue n'a été assignée (p. ex. : Polylang a été installé plus tard).

Le champ polylangTranslationLanguageIDs fournit les IDs d'entité pour toutes les traductions (c'est-à-dire post/page/category/tag/media). Il accepte l'entrée includeSelf, pour indiquer si l'ID de l'entité interrogée doit être inclus dans les résultats (il est false par défaut), et les entrées includeLanguages et excludeLanguages, pour filtrer les langues incluses dans les résultats.

En exécutant cette requête :

{
  posts {
    __typename
    id
    title
    polylangLanguage {
      code
    }
    polylangTranslationLanguageIDs
    polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
 
    categories {
      __typename
      id
      name
      polylangLanguage {
        code
      }
      polylangTranslationLanguageIDs
      polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
    }
    
    tags {
      __typename
      id
      name
      polylangLanguage {
        code
      }
      polylangTranslationLanguageIDs
      polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
    }
  }
 
  pages {
    __typename
    id
    title
    polylangLanguage {
      code
    }
    polylangTranslationLanguageIDs
    polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
  }
 
  mediaItems {
    __typename
    id
    title
    polylangLanguage {
      code
    }
    polylangTranslationLanguageIDs
    polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
  }
}

...pourrait produire :

{
  "data": {
    "posts": [
      {
        "__typename": "Post",
        "id": 1668,
        "title": "Some post translated using Polylang",
        "polylangLanguage": {
          "code": "en"
        },
        "polylangTranslationLanguageIDs": {
          "fr": 1670,
          "es": 1672
        },
        "polylangTranslationLanguageIDsWithSelf": {
          "en": 1668,
          "fr": 1670,
          "es": 1672
        },
        "categories": [
          {
            "__typename": "PostCategory",
            "id": 61,
            "name": "Category for Polylang",
            "polylangLanguage": {
              "code": "en"
            },
            "polylangTranslationLanguageIDs": {
              "fr": 63,
              "es": 65
            },
            "polylangTranslationLanguageIDsWithSelf": {
              "en": 61,
              "fr": 63,
              "es": 65
            }
          }
        ],
        "tags": [
          {
            "__typename": "PostTag",
            "id": 67,
            "name": "Tag for Polylang",
            "polylangLanguage": {
              "code": "en"
            },
            "polylangTranslationLanguageIDs": {
              "fr": 69,
              "es": 71
            },
            "polylangTranslationLanguageIDsWithSelf": {
              "en": 67,
              "fr": 69,
              "es": 71
            }
          }
        ]
      }
    ],
    "pages": [
      {
        "__typename": "Page",
        "id": 1674,
        "title": "Some page translated using Polylang",
        "polylangLanguage": {
          "code": "en"
        },
        "polylangTranslationLanguageIDs": {
          "fr": 1676,
          "es": 1678
        },
        "polylangTranslationLanguageIDsWithSelf": {
          "en": 1674,
          "fr": 1676,
          "es": 1678
        }
      }
    ],
    "mediaItems": [
      {
        "__typename": "Media",
        "id": 40,
        "title": "Media-for-Polylang",
        "polylangLanguage": {
          "code": "en"
        },
        "polylangTranslationLanguageIDs": {
          "fr": 42,
          "es": 44
        },
        "polylangTranslationLanguageIDsWithSelf": {
          "en": 40,
          "fr": 42,
          "es": 44
        }
      }
    ]
  }
}

Types GenericCustomPost, GenericTag et GenericCategory

Ces types implémentent l'interface PolylangMaybeTranslatable.

GenericCustomPost est un type utilisé pour représenter n'importe quel custom post installé sur le site, comme Portfolio, Event, Product, ou autre. De même, GenericTag et GenericCategory sont utilisés pour représenter leurs taxonomies.

Chacun de ces CPTs et taxonomies peut être défini comme traduisible dans les paramètres Polylang. Les champs polylangLanguage et polylangTranslationLanguageIDs auront alors le même comportement que pour Post et les autres (décrits ci-dessus), et retourneront également null si le CPT ou la taxonomie de l'entité n'est pas configuré(e) pour être traduit(e).

De plus, le champ polylangIsTranslatable indique si le CPT ou la taxonomie est configuré(e) comme traduisible.

ChampDescription
polylangLanguageLangue de l'article ou de la page, ou null si aucune langue n'a été assignée (p. ex. : Polylang a été installé plus tard), ou si l'entité n'est pas configurée pour être traduite (via les Paramètres Polylang).
polylangTranslationLanguageIDsNœuds pour toutes les langues de traduction de l'entité, sous forme d'objet JSON avec le code de langue comme clé et l'ID de l'entité comme valeur, ou null si aucune langue n'a été assignée (p. ex. : Polylang a été installé plus tard), ou si l'entité n'est pas configurée pour être traduite (via les Paramètres Polylang).
polylangIsTranslatableIndique si l'entité peut être traduite.

En exécutant cette requête :

{
  customPosts(filter: { customPostTypes: ["some-cpt", "another-cpt"] }) {
    __typename
    ...on GenericCustomPost {
      id
      title
      customPostType
      polylangIsTranslatable
      polylangLanguage {
        code
      }
      polylangTranslationLanguageIDs
      polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
      
      categories(taxonomy: "some-category") {
        __typename
        ...on GenericCategory {
          id
          name
          polylangIsTranslatable
          polylangLanguage {
            code
          }
          polylangTranslationLanguageIDs
          polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
        }
      }
      
      tags(taxonomy: "some-tag") {
        __typename
        ...on GenericTag {
          id
          name
          polylangIsTranslatable
          polylangLanguage {
            code
          }
          polylangTranslationLanguageIDs
          polylangTranslationLanguageIDsWithSelf: polylangTranslationLanguageIDs(filter: { includeSelf: true })
        }
      }
    }
  }
}

...pourrait produire :

{
  "data": {
    "customPosts": [
      {
        "__typename": "GenericCustomPost",
        "id": 10,
        "title": "Some CPT that has Polylang translation enabled",
        "customPostType": "some-cpt",
        "polylangIsTranslatable": true,
        "polylangLanguage": {
          "code": "en"
        },
        "polylangTranslationLanguageIDs": {
          "fr": 12,
          "es": 14
        },
        "polylangTranslationLanguageIDsWithSelf": {
          "en": 10,
          "fr": 12,
          "es": 14
        },
        "categories": [
          {
            "__typename": "GenericCategory",
            "id": 30,
            "name": "Some Category for Polylang",
            "polylangIsTranslatable": true,
            "polylangLanguage": {
              "code": "en"
            },
            "polylangTranslationLanguageIDs": {
              "fr": 32,
              "es": 34
            },
            "polylangTranslationLanguageIDsWithSelf": {
              "en": 30,
              "fr": 32,
              "es": 34
            }
          }
        ],
        "tags": [
          {
            "__typename": "GenericTag",
            "id": 50,
            "name": "Some Tag for Polylang",
            "polylangIsTranslatable": true,
            "polylangLanguage": {
              "code": "en"
            },
            "polylangTranslationLanguageIDs": {
              "fr": 52,
              "es": 54
            },
            "polylangTranslationLanguageIDsWithSelf": {
              "en": 50,
              "fr": 52,
              "es": 54
            }
          }
        ]
      },
      {
        "__typename": "GenericCustomPost",
        "id": 20,
        "title": "Another CPT that does not have Polylang translation enabled",
        "customPostType": "another-cpt",
        "polylangIsTranslatable": false,
        "polylangLanguage": null,
        "polylangTranslationLanguageIDs": null,
        "polylangTranslationLanguageIDsWithSelf": null,
        "categories": [
          {
            "__typename": "GenericCategory",
            "id": 70,
            "name": "Category without support for Polylang",
            "polylangIsTranslatable": false,
            "polylangLanguage": null,
            "polylangTranslationLanguageIDs": null,
            "polylangTranslationLanguageIDsWithSelf": null
          }
        ],
        "tags": [
          {
            "__typename": "GenericTag",
            "id": 72,
            "name": "Tag without support for Polylang",
            "polylangIsTranslatable": false,
            "polylangLanguage": null,
            "polylangTranslationLanguageIDs": null,
            "polylangTranslationLanguageIDsWithSelf": null
          }
        ]
      }
    ]
  }
}

Mutations

Le schéma GraphQL est enrichi de mutations pour :

  • Établir la langue pour les custom posts, les étiquettes, les catégories et les éléments multimédias, et
  • Définir des associations entre eux (c'est-à-dire indiquer qu'un ensemble de custom posts, d'étiquettes, de catégories ou d'éléments multimédias est une traduction les uns des autres).
MutationDescription
polylangSetCustomPostLanguageDéfinit la langue du custom post.
polylangSetTaxonomyTermLanguageDéfinit la langue du terme de taxonomie.
polylangSetMediaItemLanguageDéfinit la langue de l'élément multimédia.
polylangSaveCustomPostTranslationAssociationDéfinit l'association de traduction pour le custom post.
polylangSaveTaxonomyTermTranslationAssociationDéfinit l'association de traduction pour le terme de taxonomie.
polylangSaveMediaItemTranslationAssociationDéfinit l'association de traduction pour l'élément multimédia.

Par exemple, la requête suivante définit la langue de 3 articles (en anglais, espagnol et français), puis définit que ces 3 articles sont une traduction les uns des autres :

mutation {
  post1: polylangSetCustomPostLanguage(input: {id: 1, languageBy: { code: "en" }}) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
  }
  post2: polylangSetCustomPostLanguage(input: {id: 2, languageBy: { code: "es" }}) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
  }
  post3: polylangSetCustomPostLanguage(input: {id: 3, languageBy: { code: "fr" }}) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
  }
  polylangSaveCustomPostTranslationAssociation(input: {
    ids: [1, 2, 3]
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
  }
}

Filtrer les données par langue

Nous pouvons fournir la langue par laquelle filtrer lors de la récupération de données pour :

  • Posts
  • Pages
  • Custom posts
  • Catégories
  • Étiquettes
  • Éléments multimédias

Les champs correspondants reçoivent l'entrée polylangLanguageBy, et nous pouvons filtrer par code ou locale, et par 1 ou plusieurs langues.

Par exemple, passer $languageCodes: ["es"] récupérera les données en espagnol :

query FilterByLanguage($languageCodes: [String!])
{
  posts(filter: {
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    title
  }
 
  pages(filter: {
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    title
  }
 
  customPosts(filter: {
    customPostTypes: ["some-cpt"]
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    title
  }
 
  postCategories(filter: {
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    name
  }
 
  postTags(filter: {
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    name
  }
 
  categories(
    taxonomy: "some-category"
    filter: { polylangLanguagesBy: { codes: $languageCodes } }
  ) {
    id
    name
  }
 
  tags(
    taxonomy: "some-tag"
    filter: { polylangLanguagesBy: { codes: $languageCodes } }
  ) {
    id
    name
  }
 
  mediaItems(filter: {
    polylangLanguagesBy: { codes: $languageCodes }
  }) {
    id
    title
  }
}