Polylang
PolylangPolylang

Polylang

Integration mit dem Plugin Polylang (und auch Polylang PRO).

Das GraphQL-Schema wird um Felder erweitert, um mehrsprachige Daten abzurufen.

Typen Root/QueryRoot

Frage die in Polylang konfigurierten Website-Metadaten ab.

FeldBeschreibung
polylangDefaultLanguageStandardsprache in Polylang, oder null wenn keine Sprachen aktiviert sind.
polylangLanguagesListe der Sprachen in Polylang.

Wenn du diese query ausführst:

{
  polylangDefaultLanguage {
    code
  }
  polylangLanguages {
    code
  }
}

...könnte das Ergebnis so aussehen:

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

Typen Post, Page, PostTag, PostCategory und Media

Frage die Sprache der Entität und die IDs der Übersetzungen dieser Entität ab.

Diese Typen implementieren das Interface PolylangTranslatable. (Typ Media tut dies nur, wenn die Medienunterstützung aktiviert ist, über die Polylang-Einstellungen.)

FeldBeschreibung
polylangLanguageSprache des Beitrags oder der Seite, oder null wenn keine Sprache zugewiesen wurde (z. B.: Polylang wurde nachträglich installiert).
polylangTranslationLanguageIDsKnoten für alle Übersetzungssprachen der Entität als JSON-Objekt mit dem Sprachcode als Schlüssel und der Entitäts-ID als Wert, oder null wenn keine Sprache zugewiesen wurde (z. B.: Polylang wurde nachträglich installiert).

Das Feld polylangTranslationLanguageIDs liefert die Entitäts-IDs für alle Übersetzungen (d. h. post/page/category/tag/media). Es akzeptiert den Input includeSelf, um anzugeben, ob die ID der abgefragten Entität in den Ergebnissen enthalten sein soll (standardmäßig false), sowie die Inputs includeLanguages und excludeLanguages, um die einbezogenen Sprachen in den Ergebnissen zu filtern.

Wenn du diese query ausführst:

{
  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 })
  }
}

...könnte das Ergebnis so aussehen:

{
  "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
        }
      }
    ]
  }
}

Typen GenericCustomPost, GenericTag und GenericCategory

Diese Typen implementieren das Interface PolylangMaybeTranslatable.

GenericCustomPost ist ein Typ, der verwendet wird, um beliebige auf der Website installierte Custom Posts darzustellen, wie Portfolio, Event, Product oder andere. Ebenso werden GenericTag und GenericCategory verwendet, um ihre jeweiligen Taxonomien darzustellen.

Jeder dieser CPTs und Taxonomien kann in den Polylang-Einstellungen als übersetzbar definiert werden. Die Felder polylangLanguage und polylangTranslationLanguageIDs verhalten sich dann genauso wie für Post und die anderen (oben beschrieben), und geben ebenfalls null zurück, wenn der CPT oder die Taxonomie der Entität nicht für die Übersetzung konfiguriert ist.

Zusätzlich gibt das Feld polylangIsTranslatable an, ob der CPT oder die Taxonomie als übersetzbar konfiguriert ist.

FeldBeschreibung
polylangLanguageSprache des Beitrags oder der Seite, oder null wenn keine Sprache zugewiesen wurde (z. B.: Polylang wurde nachträglich installiert), oder wenn die Entität nicht für die Übersetzung konfiguriert ist (über die Polylang-Einstellungen).
polylangTranslationLanguageIDsKnoten für alle Übersetzungssprachen der Entität als JSON-Objekt mit dem Sprachcode als Schlüssel und der Entitäts-ID als Wert, oder null wenn keine Sprache zugewiesen wurde (z. B.: Polylang wurde nachträglich installiert), oder wenn die Entität nicht für die Übersetzung konfiguriert ist (über die Polylang-Einstellungen).
polylangIsTranslatableGibt an, ob die Entität übersetzt werden kann.

Wenn du diese query ausführst:

{
  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 })
        }
      }
    }
  }
}

...könnte das Ergebnis so aussehen:

{
  "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
          }
        ]
      }
    ]
  }
}

Mutationen

Das GraphQL-Schema wird um Mutationen erweitert, um:

  • Die Sprache für Custom Posts, Tags, Kategorien und Medienelemente festzulegen, und
  • Verknüpfungen zwischen ihnen zu definieren (d. h. anzugeben, dass eine Gruppe von Custom Posts, Tags, Kategorien oder Medienelementen eine Übersetzung voneinander ist).
MutationBeschreibung
polylangSetCustomPostLanguageSetzt die Sprache des Custom Posts.
polylangSetTaxonomyTermLanguageSetzt die Sprache des Taxonomiebegriffs.
polylangSetMediaItemLanguageSetzt die Sprache des Medienelements.
polylangSaveCustomPostTranslationAssociationSetzt die Übersetzungsverknüpfung für den Custom Post.
polylangSaveTaxonomyTermTranslationAssociationSetzt die Übersetzungsverknüpfung für den Taxonomiebegriff.
polylangSaveMediaItemTranslationAssociationSetzt die Übersetzungsverknüpfung für das Medienelement.

Die folgende query definiert beispielsweise die Sprache für 3 Beiträge (Englisch, Spanisch und Französisch) und legt dann fest, dass diese 3 Beiträge eine Übersetzung voneinander sind:

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
      }
    }
  }
}

Daten nach Sprache filtern

Wir können die Sprache angeben, nach der beim Abrufen von Daten gefiltert werden soll, für:

  • Posts
  • Seiten
  • Custom Posts
  • Kategorien
  • Tags
  • Medienelemente

Die entsprechenden Felder erhalten den Input polylangLanguageBy, und wir können nach Code oder Locale sowie nach einer oder mehreren Sprachen filtern.

Wenn du beispielsweise $languageCodes: ["es"] übergibst, werden Daten auf Spanisch abgerufen:

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
  }
}