Polylang
PolylangPolylang

Polylang

Polylangプラグイン(および Polylang PRO)との統合です。

GraphQLスキーマには、多言語データを取得するためのフィールドが提供されます。

タイプ Root/QueryRoot

Polylangで設定されたサイトメタデータを取得します。

フィールド説明
polylangDefaultLanguagePolylangのデフォルト言語。有効な言語がない場合は null
polylangLanguagesPolylangの言語一覧。

このクエリを実行すると:

{
  polylangDefaultLanguage {
    code
  }
  polylangLanguages {
    code
  }
}

...次のような結果が返ってきます:

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

タイプ PostPagePostTagPostCategoryMedia

エンティティの言語と、そのエンティティの翻訳IDを取得します。

これらのタイプはインターフェース PolylangTranslatable を実装しています。(タイプ Media は、Polylangの設定でメディアサポートが有効になっている場合のみ対象となります。)

フィールド説明
polylangLanguage投稿またはページの言語。言語が割り当てられていない場合は null(例:Polylangが後からインストールされた場合)。
polylangTranslationLanguageIDsエンティティのすべての翻訳言語のノード。言語コードをキー、エンティティIDを値とするJSONオブジェクト。言語が割り当てられていない場合は null(例:Polylangが後からインストールされた場合)。

フィールド polylangTranslationLanguageIDs は、すべての翻訳(投稿・ページ・カテゴリー・タグ・メディア)のエンティティIDを提供します。入力 includeSelf で、クエリ対象エンティティのIDを結果に含めるかどうかを指定でき(デフォルトは 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
        }
      }
    ]
  }
}

タイプ GenericCustomPostGenericTagGenericCategory

これらのタイプはインターフェース PolylangMaybeTranslatable を実装しています。

GenericCustomPost は、PortfolioEventProduct など、サイトにインストールされた任意のカスタム投稿を表すタイプです。同様に、GenericTag および GenericCategory はそれぞれのタクソノミーを表します。

これらのCPTおよびタクソノミーは、Polylangの設定で翻訳可能に定義できます。フィールド polylangLanguage および polylangTranslationLanguageIDs は、Post などと同じ動作をし(上記参照)、エンティティのCPTやタクソノミーが翻訳対象に設定されていない場合も null を返します。

また、フィールド polylangIsTranslatable は、CPTまたはタクソノミーが翻訳可能に設定されているかどうかを示します。

フィールド説明
polylangLanguage投稿またはページの言語。言語が割り当てられていない場合(例:Polylangが後からインストールされた場合)、またはエンティティが翻訳対象に設定されていない場合(Polylangの設定による)は null
polylangTranslationLanguageIDsエンティティのすべての翻訳言語のノード。言語コードをキー、エンティティIDを値とするJSONオブジェクト。言語が割り当てられていない場合(例:Polylangが後からインストールされた場合)、またはエンティティが翻訳対象に設定されていない場合(Polylangの設定による)は null
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つの投稿の言語(英語・スペイン語・フランス語)を設定し、それらが互いの翻訳であることを定義します:

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

言語によるデータフィルタリング

以下のデータを取得する際に、フィルタリングする言語を指定できます:

  • 投稿(Posts)
  • ページ(Pages)
  • カスタム投稿(Custom posts)
  • カテゴリー(Categories)
  • タグ(Tags)
  • メディアアイテム(Media items)

対応するフィールドは入力 polylangLanguageBy を受け取り、コードまたはロケールで、1つまたは複数の言語でフィルタリングできます。

たとえば、$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
  }
}