操作ガイド
操作ガイドCustom Posts

Custom Posts

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

CustomPostUnion型

スキーマにおけるCustom Postフィールド

Gato GraphQLは、カスタム投稿が「カスタム投稿」であり、直接「投稿」ではない場合を明確に区別しています。

例えば、コメントは投稿だけでなく、ページやCPTにも追加できます。そのため、Comment型はフィールドpost: Post!の代わりに、コメントが追加されたエンティティを取得するためのフィールドcustomPost: CustomPostUnion!を持っています。

Comment型

また、これが理由で、フィールドcustomPostspostTypesではなくcustomPostTypes引数を受け取ります。

スキーマにマップされたCPT

スキーマにマップされたCPT(CPT"post""page"を表すPostPageなど)があります。この場合、クエリはそのCPTに対応するGraphQL型を使用して解決されます。

ユニオン型から結果を取得する際は、フラグメントを使用して取得するフィールドを指定する必要があります。これらは、すべてのCPT型によって実装されているインターフェースCustomPostに対して評価するか、PostPageなどの個々の型に対して評価できます。

以下のクエリでは、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など)も、フィールドcustomPostcustomPostsを使用し、フィールド引数filter.customPostTypesに対応するCPT名を渡す必要があります。

それらの型はスキーマに存在しないため、データはすべてのCPTに共通するプロパティ(title、content、excerpt、dateなど)を含む型GenericCustomPostを通じて取得されます。

Generic Custom Post

以下のクエリでは、さまざまな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インプットのtagscategoriesインプットを使用して、これらの関連タクソノミーで結果をフィルタリングできます。

以下のクエリでは、カテゴリーでフィルタリングしてカスタム投稿を取得します。

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ミューテーションの両方を自由に使用できます。

例えば、標準フィールドtitlecontentを使用し、追加フィールドのない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」エクステンションを使用する必要があります。