Polylang
PolylangPolylang

Polylang

Integrasi dengan plugin Polylang (dan juga Polylang PRO).

Skema GraphQL dilengkapi dengan field untuk mengambil data multibahasa.

Tipe Root/QueryRoot

Query metadata situs yang dikonfigurasi di Polylang.

FieldDeskripsi
polylangDefaultLanguageBahasa default di Polylang, atau null jika tidak ada bahasa yang diaktifkan.
polylangLanguagesDaftar bahasa di Polylang.

Menjalankan query ini:

{
  polylangDefaultLanguage {
    code
  }
  polylangLanguages {
    code
  }
}

...mungkin menghasilkan:

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

Tipe Post, Page, PostTag, PostCategory dan Media

Query bahasa untuk entitas tersebut, dan ID untuk terjemahan entitas tersebut.

Tipe-tipe ini mengimplementasikan antarmuka PolylangTranslatable. (Tipe Media hanya melakukannya ketika dukungan media diaktifkan, melalui pengaturan Polylang.)

FieldDeskripsi
polylangLanguageBahasa post atau halaman, atau null jika tidak ada bahasa yang ditetapkan (mis: Polylang dipasang belakangan).
polylangTranslationLanguageIDsNode untuk semua bahasa terjemahan entitas, sebagai objek JSON dengan kode bahasa sebagai kunci dan ID entitas sebagai nilai, atau null jika tidak ada bahasa yang ditetapkan (mis: Polylang dipasang belakangan).

Field polylangTranslationLanguageIDs menyediakan ID entitas untuk semua terjemahan (yaitu post/page/category/tag/media). Field ini menerima input includeSelf, untuk menunjukkan apakah akan menyertakan ID entitas yang di-query dalam hasil (defaultnya adalah false), dan input includeLanguages serta excludeLanguages, untuk memfilter bahasa yang disertakan dalam hasil.

Menjalankan query ini:

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

...mungkin menghasilkan:

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

Tipe GenericCustomPost, GenericTag dan GenericCategory

Tipe-tipe ini mengimplementasikan antarmuka PolylangMaybeTranslatable.

GenericCustomPost adalah tipe yang digunakan untuk merepresentasikan custom post apa pun yang terpasang di situs, seperti Portfolio, Event, Product, atau lainnya. Demikian pula, GenericTag dan GenericCategory digunakan untuk merepresentasikan taksonomi mereka.

Setiap CPT dan taksonomi ini dapat didefinisikan sebagai dapat diterjemahkan di pengaturan Polylang. Field polylangLanguage dan polylangTranslationLanguageIDs kemudian akan berperilaku sama seperti untuk Post dan yang lainnya (dijelaskan di atas), dan juga mengembalikan null jika CPT atau taksonomi entitas tidak dikonfigurasi untuk diterjemahkan.

Selain itu, field polylangIsTranslatable menunjukkan apakah CPT atau taksonomi dikonfigurasi sebagai dapat diterjemahkan.

FieldDeskripsi
polylangLanguageBahasa post atau halaman, atau null jika tidak ada bahasa yang ditetapkan (mis: Polylang dipasang belakangan), atau jika entitas tidak dikonfigurasi untuk diterjemahkan (melalui Pengaturan Polylang).
polylangTranslationLanguageIDsNode untuk semua bahasa terjemahan entitas, sebagai objek JSON dengan kode bahasa sebagai kunci dan ID entitas sebagai nilai, atau null jika tidak ada bahasa yang ditetapkan (mis: Polylang dipasang belakangan), atau jika entitas tidak dikonfigurasi untuk diterjemahkan (melalui Pengaturan Polylang).
polylangIsTranslatableMenunjukkan apakah entitas dapat diterjemahkan.

Menjalankan query ini:

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

...mungkin menghasilkan:

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

Mutasi

Skema GraphQL dilengkapi dengan mutasi untuk:

  • Menetapkan bahasa untuk custom post, tag, kategori, dan item media, dan
  • Mendefinisikan asosiasi di antara mereka (yaitu menunjukkan bahwa sekumpulan custom post, tag, kategori, atau item media merupakan terjemahan satu sama lain).
MutasiDeskripsi
polylangSetCustomPostLanguageTetapkan bahasa untuk custom post.
polylangSetTaxonomyTermLanguageTetapkan bahasa untuk term taksonomi.
polylangSetMediaItemLanguageTetapkan bahasa untuk item media.
polylangSaveCustomPostTranslationAssociationTetapkan asosiasi terjemahan untuk custom post.
polylangSaveTaxonomyTermTranslationAssociationTetapkan asosiasi terjemahan untuk term taksonomi.
polylangSaveMediaItemTranslationAssociationTetapkan asosiasi terjemahan untuk item media.

Misalnya, query berikut mendefinisikan bahasa untuk 3 post (ke bahasa Inggris, Spanyol, dan Prancis), kemudian mendefinisikan bahwa ketiga post tersebut merupakan terjemahan satu sama lain:

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

Filter data berdasarkan bahasa

Kita dapat menyediakan bahasa untuk difilter saat mengambil data untuk:

  • Posts
  • Pages
  • Custom posts
  • Kategori
  • Tag
  • Item media

Field yang sesuai menerima input polylangLanguageBy, dan kita dapat memfilter berdasarkan kode atau locale, serta berdasarkan 1 bahasa atau lebih dari 1 bahasa.

Misalnya, meneruskan $languageCodes: ["es"] akan mengambil data dalam bahasa Spanyol:

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