Polylang
Интеграция с плагином Polylang (а также Polylang PRO).
Схема GraphQL расширяется полями для получения многоязычных данных.
Типы Root/QueryRoot
Запрашивает метаданные сайта, настроенные в Polylang.
| Поле | Описание |
|---|---|
polylangDefaultLanguage | Язык по умолчанию в Polylang, или null, если языки не включены. |
polylangLanguages | Список языков в Polylang. |
При выполнении этого запроса:
{
polylangDefaultLanguage {
code
}
polylangLanguages {
code
}
}...может вернуть:
{
"data": {
"polylangDefaultLanguage": {
"code": "en"
},
"polylangLanguages": [
{
"code": "en"
},
{
"code": "es"
},
{
"code": "fr"
}
]
}
}Типы Post, Page, PostTag, PostCategory и Media
Запрашивает язык сущности и идентификаторы переводов этой сущности.
Эти типы реализуют интерфейс PolylangTranslatable. (Тип Media — только когда поддержка медиафайлов включена в настройках Polylang.)
| Поле | Описание |
|---|---|
polylangLanguage | Язык записи или страницы, или null, если язык не назначен (например, Polylang был установлен позже). |
polylangTranslationLanguageIDs | Узлы для всех языков перевода сущности в виде объекта JSON с кодом языка в качестве ключа и идентификатором сущности в качестве значения, или null, если язык не назначен (например, Polylang был установлен позже). |
Поле polylangTranslationLanguageIDs возвращает идентификаторы сущностей для всех переводов (то есть записей/страниц/категорий/тегов/медиафайлов). Оно принимает аргумент includeSelf — включать ли идентификатор самой запрашиваемой сущности в результаты (по умолчанию false), а также аргументы includeLanguages и excludeLanguages для фильтрации языков в результатах.
При выполнении этого запроса:
{
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 })
}
}...может вернуть:
{
"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
}
}
]
}
}Типы GenericCustomPost, GenericTag и GenericCategory
Эти типы реализуют интерфейс PolylangMaybeTranslatable.
GenericCustomPost — тип для представления любого произвольного типа записей, установленного на сайте: Portfolio, Event, Product и других. Аналогично, GenericTag и GenericCategory используются для представления их таксономий.
Каждый из этих CPT и таксономий можно настроить как переводимый в настройках Polylang. Поля polylangLanguage и polylangTranslationLanguageIDs будут иметь то же поведение, что и для Post и остальных типов (описано выше), а также возвращать null, если CPT или таксономия сущности не настроены для перевода.
Кроме того, поле polylangIsTranslatable указывает, настроен ли CPT или таксономия как переводимые.
| Поле | Описание |
|---|---|
polylangLanguage | Язык записи или страницы, или null, если язык не назначен (например, Polylang был установлен позже), либо если сущность не настроена для перевода (в настройках Polylang). |
polylangTranslationLanguageIDs | Узлы для всех языков перевода сущности в виде объекта JSON с кодом языка в качестве ключа и идентификатором сущности в качестве значения, или null, если язык не назначен (например, Polylang был установлен позже), либо если сущность не настроена для перевода (в настройках Polylang). |
polylangIsTranslatable | Указывает, может ли сущность быть переведена. |
При выполнении этого запроса:
{
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 })
}
}
}
}
}...может вернуть:
{
"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
}
]
}
]
}
}Мутации
Схема GraphQL дополнена мутациями для:
- Установки языка для произвольных записей, тегов, категорий и медиафайлов, и
- Определения связей между ними (то есть указания, что набор произвольных записей, тегов, категорий или медиафайлов является переводами друг друга).
| Мутация | Описание |
|---|---|
polylangSetCustomPostLanguage | Устанавливает язык произвольной записи. |
polylangSetTaxonomyTermLanguage | Устанавливает язык элемента таксономии. |
polylangSetMediaItemLanguage | Устанавливает язык медиафайла. |
polylangSaveCustomPostTranslationAssociation | Устанавливает связь перевода для произвольной записи. |
polylangSaveTaxonomyTermTranslationAssociation | Устанавливает связь перевода для элемента таксономии. |
polylangSaveMediaItemTranslationAssociation | Устанавливает связь перевода для медиафайла. |
Например, следующий запрос задаёт язык для 3 записей (английский, испанский и французский), а затем определяет, что эти 3 записи являются переводами друг друга:
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
}
}
}
}Фильтрация данных по языку
При получении данных можно указать язык для фильтрации:
- Записей
- Страниц
- Произвольных записей
- Категорий
- Тегов
- Медиафайлов
Соответствующие поля принимают аргумент polylangLanguageBy, и можно фильтровать по коду или локали, а также по одному или нескольким языкам.
Например, передача $languageCodes: ["es"] вернёт данные на испанском языке:
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
}
}