Şununla Çalışmak
Şununla ÇalışmakCustom Posts

Custom Posts

CPT verilerini almak için customPost ve customPosts alanlarını kullanırız; hem şemaya eşlenmiş CPT'ler (örneğin Post ve Page) hem de eşlenmemiş olanlar (örneğin bir eklentideki CPT) için. Sonuçlar farklı türlerdeki varlıkları içerebildiğinden, bu alanlar CustomPostUnion türünü döndürür.

CustomPostUnion türü

Şemadaki Custom Post alanları

Gato GraphQL, bir custom post'un "custom post" mu yoksa doğrudan "post" mu olduğunu net bir şekilde ayırt eder.

Örneğin, bir yorum bir post'a, bir sayfaya ve bir CPT'ye eklenebilir; bu nedenle Comment türü, yorumun eklendiği varlığı almak için post: Post! alanı yerine customPost: CustomPostUnion! alanını içerir.

Comment türü

Bu yüzden customPosts alanı, postTypes yerine customPostTypes argümanını alır.

Şemaya eşlenmiş CPT'ler

Şemaya eşlenmiş CPT'ler vardır (örneğin "post" ve "page" CPT'lerini temsil eden Post ve Page). Bu durumda, query o CPT için karşılık gelen GraphQL türü kullanılarak çözümlenir.

Bir union türünden sonuçlar alırken, fragment'lar aracılığıyla alınacak alanları belirtmemiz gerekir. Bunlar, tüm CPT türleri tarafından uygulanan CustomPost arayüzü üzerinde veya Post ya da Page gibi her bir bireysel tür üzerinde değerlendirilebilir.

Aşağıdaki query'de, "post" ve "page" CPT'leriyle custom post'ları alıyoruz. Alanlarını 3 fragment aracılığıyla görüntülüyoruz; bu fragment'lar varlığın CustomPost uygulayıp uygulamadığını veya Post ya da Page türünde olup olmadığını değerlendirir:

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

Şemaya eşlenmemiş CPT'ler

Bir CPT henüz şemaya eşlenmemişse (örneğin "attachment", "revision" veya "nav_menu_item", ya da herhangi bir eklenti tarafından yüklenen CPT), yine de customPost ve customPosts alanlarını kullanırız ve karşılık gelen CPT adını filter.customPostTypes alan argümanına geçirmemiz gerekir.

Bu türlerin şemada bulunmaması nedeniyle, verileri tüm CPT'lere ortak özellikleri (title, content, excerpt, date vb.) içeren GenericCustomPost türü aracılığıyla alınacaktır.

Genel Custom Post

Aşağıdaki query'de, çeşitli CPT'ler için custom post'ları alıyoruz:

query {
  customPosts(
    filter:{
      customPostTypes: [
        "page",
        "nav_menu_item",
        "wp_block",
        "wp_global_styles"
      ]
    }
  ) {
    ... on CustomPost {
      id
      title
      customPostType
      status
    }
    __typename
  }
}

Custom Post Type'lara erişime izin verme

CPT'lerin sorgulanabilir olması için açıkça izin verilmesi gerekir; bu konu Custom Post Type'lara erişime izin verme kılavuzunda açıklanmaktadır.

Custom post'ları sorgulama

Şemaya eşlenmiş CPT'ler için GraphQL türleri (örneğin "post" => Post ve "page" => Page) doğrudan CustomPostUnion'a dahil edilir.

Şemada modellenmeyen herhangi bir CPT için (örneğin "attachment", "revision" veya "nav_menu_item", ya da herhangi bir eklenti tarafından yüklenen CPT), verileri GenericCustomPost türü aracılığıyla erişilebilir olacaktır.

Alınacak CPT'leri filter.customPostTypes alan argümanı aracılığıyla belirtiyoruz; bu argüman, WordPress'te tanımlanan CPT adlarını (örneğin "post", "page" vb.) içeren bir string listesi alır. Örneğin:

query {
  customPosts(
    filter: { customPostTypes: ["some-custom-cpt"] }
  ) {
    ... on CustomPost {
      id
      title
    }
  }
}

Bu query birden fazla CPT'den girişleri alır:

query {
  customPosts(
    filter: {
      customPostTypes: [
        "post",
        "page",
        "attachment",
        "nav_menu_item",
        "custom_css",
        "revision"
      ],
      status: [
        publish,
        inherit,
        auto_draft
      ]
    }
  ) {
    id
    title
    content
    status
    customPostType
    __typename
  }
}

Tüm Custom Post'lar CustomPost arayüzünü uyguladığından, CustomPostUnion'dan bir fragment referansı veya satır içi fragment kullanarak veri alabiliriz:

query {
  comments {
    id
    date
    content
    customPost {
      __typename
      ...on CustomPost {
        id
        title
        url
      }
    }
  }
}

Yorumun bir post'a eklendiğini biliyorsak, Post'a özgü alanları da sorgulayabiliriz:

query {
  comments {
    id
    date
    content
    customPost {
      __typename
      ...on CustomPost {
        id
        title
        url
      }
      ...on Post {
        categoryNames
      }
    }
  }
}

CPT'leri özel bir taksonomiye göre filtreleme

Bir custom post type'ın kendisine bağlı özel taksonomileri (etiketler ve kategoriler) olabilir. Örneğin, bir "product" CPT'sinin "product-cat" kategori taksonomisi ve "product-tag" etiket taksonomisi ilişkili olabilir.

Sonuçları bu ilişkili taksonomilere göre filter girdisindeki tags ve categories girdileri aracılığıyla filtreleyebiliriz.

Aşağıdaki query'de, kategoriye göre filtreleyerek custom post'ları alıyoruz:

query {
  customPosts(
    filter: {
      categories: {
        includeBy: {
          ids: [26, 28]
        }
        taxonomy: "product-cat"
      }
    }
  ) {
    ... on CustomPost {
      id
      title
    }
    ... on GenericCustomPost {
      categories(taxonomy: "product-cat") {
        id
      }
    }
  }
}

Özel CPT verilerini alma

GenericCustomPost kullanarak yalnızca tüm CPT'lere ortak olan alanları isteyebiliriz; özel bir CPT'den özel veri almak desteklenmez (örneğin "product" özel CPT'si için fiyat verisi almak).

Bunun yerine özel CPT verilerini almak için CPT'yi şemaya eşleyen PHP kodunda karşılık gelen çözümleyicileri oluşturmamız gerekir:

  • Bir Product türü oluşturun
  • Buna bir price alanı ekleyin

Artık CustomPostUnion türü (Root.customPosts tarafından döndürülen) bu CPT'den gelen tüm girişleri bir Product türüne çözümleyecektir.

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

Ayrıca Root.products: [Product!] alanını oluşturabilir ve doğrudan kullanabiliriz:

query {
  products {
    __typename # Product
    id
    title
    status
    price # custom field
  }
}

Özel CPT verilerini mutation ile değiştirme

Post türündeki alanların ötesinde herhangi bir ek alan gerektirmeyen CPT'ler söz konusu olduğunda, createCustomPost ve updateCustomPost mutation'larını çekinmeden kullanabilirsiniz.

Örneğin, standart title ve content alanlarını kullanan ve ekstra alanları olmayan bir MyPortfolio CPT'si bu mutation'lar aracılığıyla tamamen yönetilebilir.

Bu query, "my-portfolio" CPT'si için bir giriş oluşturur:

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

Bu query aynı CPT için başlık ve içeriği günceller:

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

Üçüncü taraf eklentiler tarafından sağlanan custom post type'ların yalnızca ilgili eklenti tarafından oluşturulması (ve muhtemelen güncellenmesi) gerekebilir.

Bunun nedeni, eklentinin ek olarak eklenmesi gereken özel verilere (wp_postmeta'da veya özel bir tabloda) sahip olabilmesi ve Gato GraphQL'in bunlardan haberdar olmamasıdır.

Bu CPT'leri uygun şekilde yönetmek için, CPT'nin tüm alanları için eşlemeyi sağlayan o eklenti ile Gato GraphQL arasında karşılık gelen bir entegrasyon oluşturulmalıdır.

Örneğin, bir WooCommerce ürününün (yani Product CPT'sinden) başlığını ve içeriğini çevirmek ve güncellemek için Root.updateCustomPost alanını kullanabiliriz. Ancak bir WooCommerce ürünü oluşturamayız; bunun için ilgili "WooCommerce for Gato GraphQL" uzantısını kullanmamız gerekir.