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.
| Field | Deskripsi |
|---|---|
polylangDefaultLanguage | Bahasa default di Polylang, atau null jika tidak ada bahasa yang diaktifkan. |
polylangLanguages | Daftar 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.)
| Field | Deskripsi |
|---|---|
polylangLanguage | Bahasa post atau halaman, atau null jika tidak ada bahasa yang ditetapkan (mis: Polylang dipasang belakangan). |
polylangTranslationLanguageIDs | Node 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.
| Field | Deskripsi |
|---|---|
polylangLanguage | Bahasa 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). |
polylangTranslationLanguageIDs | Node 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). |
polylangIsTranslatable | Menunjukkan 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).
| Mutasi | Deskripsi |
|---|---|
polylangSetCustomPostLanguage | Tetapkan bahasa untuk custom post. |
polylangSetTaxonomyTermLanguage | Tetapkan bahasa untuk term taksonomi. |
polylangSetMediaItemLanguage | Tetapkan bahasa untuk item media. |
polylangSaveCustomPostTranslationAssociation | Tetapkan asosiasi terjemahan untuk custom post. |
polylangSaveTaxonomyTermTranslationAssociation | Tetapkan asosiasi terjemahan untuk term taksonomi. |
polylangSaveMediaItemTranslationAssociation | Tetapkan 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
}
}