활용 가이드
활용 가이드Custom Posts

Custom Posts

customPost 필드와 customPosts 필드를 사용하여 CPT 데이터를 가져옵니다. 스키마에 매핑된 CPT(PostPage 등)든, 매핑되지 않은 CPT(특정 플러그인의 CPT 등)든 동일하게 사용할 수 있습니다. 결과에는 다양한 타입의 엔티티가 포함될 수 있으므로, 이 필드들은 CustomPostUnion 타입을 반환합니다.

CustomPostUnion 타입

스키마의 Custom Post 필드

Gato GraphQL은 커스텀 포스트가 "커스텀 포스트"인 경우와 직접적으로 "포스트"인 경우를 명확하게 구분합니다.

예를 들어, 댓글은 포스트뿐만 아니라 페이지나 CPT에도 추가할 수 있습니다. 그러므로 Comment 타입은 post: Post! 필드 대신, 댓글이 추가된 엔티티를 가져오기 위한 customPost: CustomPostUnion! 필드를 갖고 있습니다.

Comment 타입

또한, 이것이 customPosts 필드가 postTypes 대신 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의 경우, createCustomPostupdateCustomPost 뮤테이션을 자유롭게 사용할 수 있습니다.

예를 들어, 표준 필드 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" 익스텐션을 사용해야 합니다.