Polylang
PolylangPolylang

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