Custom Posts
customPostフィールドとcustomPostsフィールドを使用して、CPTデータを取得します。スキーマにマップされているCPT(PostやPageなど)でも、マップされていないCPT(あるプラグインのCPTなど)でも同様です。結果にはさまざまな型のエンティティが含まれる可能性があるため、これらのフィールドはCustomPostUnion型を返します。

スキーマにおけるCustom Postフィールド
Gato GraphQLは、カスタム投稿が「カスタム投稿」であり、直接「投稿」ではない場合を明確に区別しています。
例えば、コメントは投稿だけでなく、ページやCPTにも追加できます。そのため、Comment型はフィールドpost: Post!の代わりに、コメントが追加されたエンティティを取得するためのフィールドcustomPost: CustomPostUnion!を持っています。

また、これが理由で、フィールドcustomPostsはpostTypesではなくcustomPostTypes引数を受け取ります。
スキーマにマップされたCPT
スキーマにマップされたCPT(CPT"post"と"page"を表すPostとPageなど)があります。この場合、クエリはそのCPTに対応するGraphQL型を使用して解決されます。
ユニオン型から結果を取得する際は、フラグメントを使用して取得するフィールドを指定する必要があります。これらは、すべてのCPT型によって実装されているインターフェースCustomPostに対して評価するか、PostやPageなどの個々の型に対して評価できます。
以下のクエリでは、CPT"post"と"page"のカスタム投稿を取得します。エンティティがCustomPostを実装しているか、Post型またはPage型であるかを評価する3つのフラグメントを通じてフィールドを表示します。
query {
customPosts(filter: { customPostTypes: ["post", "page"] }) {
...CustomPostProps
...PostProps
...PageProps
}
}
fragment CustomPostProps on CustomPost {
__typename
title
excerpt
url
dateStr(format: "d/m/Y")
}
fragment PostProps on Post {
tags {
id
name
}
}
fragment PageProps on Page {
author {
id
name
}
}スキーマにマップされていないCPT
CPTがまだスキーマにマップされていない場合("attachment"、"revision"、"nav_menu_item"、またはプラグインによってインストールされたCPTなど)も、フィールドcustomPostとcustomPostsを使用し、フィールド引数filter.customPostTypesに対応するCPT名を渡す必要があります。
それらの型はスキーマに存在しないため、データはすべてのCPTに共通するプロパティ(title、content、excerpt、dateなど)を含む型GenericCustomPostを通じて取得されます。

以下のクエリでは、さまざまなCPTのカスタム投稿を取得します。
query {
customPosts(
filter:{
customPostTypes: [
"page",
"nav_menu_item",
"wp_block",
"wp_global_styles"
]
}
) {
... on CustomPost {
id
title
customPostType
status
}
__typename
}
}Custom Post Typesへのアクセスを許可する
CPTはクエリ可能にするために明示的に許可する必要があります。詳しくはガイドCustom Post Typesへのアクセスを許可するをご覧ください。
カスタム投稿のクエリ
スキーマにマップされたCPTのGraphQL型("post" => Post、"page" => Pageなど)は、CustomPostUnionに直接組み込まれます。
スキーマでモデル化されていないCPT("attachment"、"revision"、"nav_menu_item"、またはプラグインによってインストールされたCPTなど)のデータは、GenericCustomPost型を通じてアクセスされます。
取得するCPTはフィールド引数filter.customPostTypesで指定します。これはWordPressで定義されたCPT名("post"、"page"など)の文字列リストを受け取ります。例えば:
query {
customPosts(
filter: { customPostTypes: ["some-custom-cpt"] }
) {
... on CustomPost {
id
title
}
}
}このクエリは複数のCPTからエントリを取得します。
query {
customPosts(
filter: {
customPostTypes: [
"post",
"page",
"attachment",
"nav_menu_item",
"custom_css",
"revision"
],
status: [
publish,
inherit,
auto_draft
]
}
) {
id
title
content
status
customPostType
__typename
}
}すべてのCustom PostはインターフェースCustomPostを実装しているため、フラグメント参照またはインラインフラグメントを使用してCustomPostUnionからデータを取得できます。
query {
comments {
id
date
content
customPost {
__typename
...on CustomPost {
id
title
url
}
}
}
}コメントが投稿に追加されたことがわかっている場合は、Post固有のフィールドもクエリできます。
query {
comments {
id
date
content
customPost {
__typename
...on CustomPost {
id
title
url
}
...on Post {
categoryNames
}
}
}
}カスタムタクソノミーによるCPTのフィルタリング
カスタム投稿タイプには、カスタムタクソノミー(タグとカテゴリー)を関連付けることができます。例えば、CPT"product"にはカテゴリータクソノミー"product-cat"とタグタクソノミー"product-tag"が関連付けられる場合があります。
filterインプットのtagsとcategoriesインプットを使用して、これらの関連タクソノミーで結果をフィルタリングできます。
以下のクエリでは、カテゴリーでフィルタリングしてカスタム投稿を取得します。
query {
customPosts(
filter: {
categories: {
includeBy: {
ids: [26, 28]
}
taxonomy: "product-cat"
}
}
) {
... on CustomPost {
id
title
}
... on GenericCustomPost {
categories(taxonomy: "product-cat") {
id
}
}
}
}カスタムCPTデータの取得
GenericCustomPostを使用する場合、すべてのCPTに共通するフィールドのみをリクエストできます。カスタムCPT"product"の価格データの取得など、特定のCPTのカスタムデータの取得はサポートされていません。
カスタムCPTデータを取得するには、代わりにPHPコードでCPTをスキーマにマップするための対応するリゾルバーを作成する必要があります。
Product型を作成するpriceフィールドをアタッチする
これにより、CustomPostUnion型(Root.customPostsが返す型)は、このCPTのすべてのエントリをProduct型に解決します。
query {
customPosts(
filter: {
customPostTypes: "product"
}
) {
__typename
...on CustomPost { # interface implemented by all CPT types
id
title
customPostType
status
}
...on Product { # custom CPT type
price # custom field
}
}
}さらにフィールドRoot.products: [Product!]を作成し、直接使用することもできます。
query {
products {
__typename # Product
id
title
status
price # custom field
}
}カスタムCPTデータのミューテーション
Post型のフィールド以外に追加フィールドを必要としないCPTに関しては、createCustomPostミューテーションとupdateCustomPostミューテーションの両方を自由に使用できます。
例えば、標準フィールドtitleとcontentを使用し、追加フィールドのないMyPortfolio CPTは、これらのミューテーションで完全に管理できます。
このクエリは"my-portfolio" CPTのエントリを作成します。
mutation {
createCustomPost(
input: {
customPostType: "my-portfolio"
title: "My photograph"
contentAs: { html: "This is my photo, check it out." }
}
) {
status
errors {
__typename
...on ErrorPayload {
message
}
...on GenericErrorPayload {
code
}
}
customPost {
__typename
...on CustomPost {
id
title
content
}
}
}
}このクエリは同じCPTのタイトルとコンテンツを更新します。
mutation {
updateCustomPost(input: {
id: 1
customPostType: "my-portfolio"
title: "Updated title"
contentAs: { html: "Updated content" }
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
customPost {
__typename
...on CustomPost {
id
title
content
}
}
}
}サードパーティのプラグインが提供するカスタム投稿タイプは、対応するプラグインによってのみ作成(および更新)が必要な場合があります。
これは、wp_postmetaまたは独自テーブルにカスタムデータが存在する可能性があり、それも追加する必要がありますが、Gato GraphQLはそれを認識していないためです。
これらのCPTを適切に管理するには、そのプラグインとGato GraphQLの間に対応するインテグレーションを作成し、CPTのすべてのフィールドのマッピングを提供する必要があります。
例えば、フィールドRoot.updateCustomPostを使用してWooCommerce商品(つまりProduct CPT)のタイトルとコンテンツを翻訳・更新することはできます。しかし、WooCommerce商品を作成することはできません。そのためには、対応する「WooCommerce for Gato GraphQL」エクステンションを使用する必要があります。