🥳 Gato GraphQL v0.9 yayınlandı!
Yaklaşık 1,5 yıllık geliştirme sürecinin ve 16.000'den fazla commit'in ardından, Gato GraphQL'in yeni bir sürümü nihayet yayınlandı! 🥳
0.9 sürümü, eklentinin tarihindeki en büyük yayındır. İşte changelog ve tüm yeni özelliklerin tam açıklaması:
github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3
Bu belge oldukça uzun (40 dakikadan fazla okuma süresi!), bu yüzden aşağıda en önemli değişikliklerin TL;DR özeti yer almaktadır.
GraphQL Şeması Önemli Ölçüde Tamamlandı
WordPress veri modeli, GraphQL şemasına önemli ölçüde eşlenmiştir.

Şema, diğerlerinin yanı sıra aşağıdaki iyileştirmelere sahiptir:
- Herhangi bir tema ve eklentiden dahil olmak üzere herhangi bir CPT'den veri sorgulama
- Özel taksonomi (etiket ve kategoriler) eşlemesi yapıldı
- Daha uygun GraphQL türleri oluşturuldu ve döndürüldü (örn:
HTML,URL,DateTime) - Alan argümanları input object'ler aracılığıyla düzenlendi
- Bir varlığı farklı özelliklerle seçmek için oneof input object'leri kullanıldı (örn:
id,slug) - Mutation payload'ları döndürüldü
- Ayarlar (
wp_options'dan) ve meta değerleri sorgulandı (gönderiler, kullanıcılar, yorumlar ve taksonomiler için)
Custom Scalars
GraphQL sunucusuna özel skaler türler desteği eklendi. Custom scalar'lar, bir alan argümanı aracılığıyla girdi almak veya yanıtta özelleştirilmiş bir çıktı yazdırmak için verilerinizi daha iyi temsil etmenizi sağlar.
GraphQL şemanızda kullanıma hazır olmaları için çeşitli standart özel skaler türler uygulandı:
DateDateTimeEmailHTMLURLURLAbsolutePath
Custom Enums
Özel enum türleri artık desteklenmektedir. Enum'lar, belirli bir izin verilen değerler kümesiyle sınırlı özel bir skaler türüdür. Bu sayede şunları yapabilirsiniz:
- Bu türdeki herhangi bir argümanın izin verilen değerlerden biri olduğunu doğrulama
- Tür sistemi aracılığıyla bir alanın her zaman sonlu bir değerler kümesinden biri olacağını bildirme
Çeşitli enum türleri uygulandı ve GraphQL şemasında uygun yerlerde kullanıldı:
CommentOrderByEnumCommentStatusEnumCommentTypeEnumCustomPostOrderByEnumCustomPostStatusEnumMediaItemOrderByEnumMenuOrderByEnumTaxonomyOrderByEnumUserOrderByEnum
Input Objects
GraphQL sunucusu artık input türlerini de desteklemektedir ve GraphQL şemasına kendi input object'lerinizi ekleyebilirsiniz. Input object'ler, özellikle mutation'lar için oldukça kullanışlı olan karmaşık nesneleri alanlara girdi olarak geçirmenizi sağlar.
Şemaya uygun yerlerde çeşitli input object'ler eklendi. Örneğin, veri sorgulayan alanlar (posts, users, comments vb.) filter, sort ve pagination alan argümanları altında karmaşık input object'ler alırken, veriyi değiştiren alanlar (createPost, addCommentToCustomPost vb.) input alan argümanı altında bir input object alır.
Oneof Input Objects
"oneof" input object, input alanlarından tam olarak birinin girdi olarak sağlanması gereken özel bir input object türüdür; aksi takdirde bir doğrulama hatası döndürür. Bu davranış, girdiler için polimorfizm sağlar.
Örneğin, Root.post alanı artık by adlı bir alan argümanı almaktadır; bu, id veya slug gibi farklı özellikler aracılığıyla gönderiye erişmemizi sağlayan bir oneof input object'tir:
{
postByID: post(by: {
id: 1
}) {
id
title
}
postBySlug: post(by: {
slug: "hello-world"
}) {
id
title
}
}Bu yaklaşımın faydası, tek bir alanın farklı kullanım durumlarını karşılamak için kullanılabilmesidir; bu sayede her kullanım durumu için ayrı bir alan oluşturmaktan (postByID, postBySlug vb.) kaçınabilir ve GraphQL şemasını daha yalın ve zarif hale getirebiliriz.
Çeşitli Oneof Input Objects uygulandı:
Root.customPost(by:)Root.mediaItem(by:)Root.menu(by:)Root.page(by:)Root.postCategory(by:)Root.postTag(by:)Root.post(by:)Root.user(by:)
Operation Directives
GraphQL operasyonları (yani query ve mutation operasyonları) artık directive'ler de alabilmektedir.
Directive'leri Belirli Türlerle Kısıtlama
(Alan) directive'leri yalnızca belirli türlerdeki alanlara uygulanacak şekilde kısıtlanabilir. Örneğin, alan değerini büyük harfe dönüştüren @strUpperCase directive'i yalnızca String alanlarda mantıklıdır; Int, Float veya Boolean alanlarında değil. Bu kısıtlama artık directive resolver'da bildirilebilir.
Hata Üreten GraphQL Query Düğümüne Giden Tam Yolu Yazdırma
Yanıt artık bir hata döndüren GraphQL query düğümlerine giden tam yolu içermektedir (extensions.path alt girişi altında); bu da sorunun kaynağını bulmayı kolaylaştırır.
Örneğin, aşağıdaki queries'de @nonExisting directive'i mevcut değildir:
query {
myField @nonExisting
}Yanıt şu şekildedir:
{
"errors": [
{
"message": "There is no directive with name 'nonExisting'",
"locations": [
{
"line": 2,
"column": 7
}
],
"extensions": {
"type": "QueryRoot",
"field": "myField @nonExisting",
"path": [
"@nonExisting",
"myField @nonExisting",
"query { ... }"
],
"code": "PoP\\ComponentModel\\e20"
}
}
],
"data": {
"id": "root"
}
}Güvensiz Varsayılan Ayarları Etkinleştirme
Gato GraphQL güvenli varsayılan ayarlar sunar:
- Tek endpoint devre dışıdır
- GraphQL şemasındaki "hassas" veri öğeleri (örn:
User.rolesveya gönderileristatus'a göre filtreleme) açığa çıkarılmaz - Yalnızca birkaç ayar seçeneği ve meta anahtarı (gönderiler, kullanıcılar vb. için) sorgulanabilir
- Aynı anda sorgulanabilecek varlık sayısı sınırlıdır (gönderiler, kullanıcılar vb. için)
Bu güvenli varsayılan ayarlar, "canlı" siteleri güvenli tutmak ve kötü niyetli saldırıları önlemek için gereklidir. Ancak, WordPress sitesinin saldırılara karşı savunmasız olmadığı "statik" siteler oluşturulurken bunlara gerek yoktur (dizüstü bilgisayarda geliştirme sitesi olarak çalışan, güvenli bir güvenlik duvarının arkasındaki veya genel olarak İnternet'e açık olmayan bir site gibi).
v0.9 sürümünden itibaren, wp-config.php dosyasına aşağıdakini ekleyerek güvensiz varsayılanları etkinleştirebiliriz:
define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );Alternatif olarak, bu aynı anahtar/değer çiftini ortam değişkeni olarak da tanımlayabiliriz.
Güvensiz varsayılanlar etkinleştirildiğinde, eklentinin varsayılan ayarları şu şekilde dönüşür:
- Tek endpoint etkinleştirilir
- "Hassas" veri öğeleri GraphQL şemasında açığa çıkarılır
- Tüm ayar seçenekleri ve meta anahtarları sorgulanabilir
- Aynı anda sorgulanabilecek varlık sayısı sınırsızdır
Custom Endpoint'leri ve Persisted Queries'i Kategoriye Göre Düzenleme
Bir Custom Endpoint veya Persisted Query oluştururken, tüm endpoint'lerimizi düzenlemek için bir "GraphQL endpoint kategorisi" ekleyebiliriz:

Örneğin, endpoint'leri müşteriye, uygulamaya veya gereken herhangi bir bilgiye göre yönetmek için kategoriler oluşturabiliriz:

Custom Endpoint'ler ve Persisted Queries listesinde kategorilerini görüntüleyebilir; herhangi bir kategori bağlantısına tıklayarak veya üstteki filtreyi kullanarak yalnızca o kategorideki tüm girdileri görüntüleyebiliriz.

İntrospeksiyon Aracılığıyla Şema Uzantılarını Sorgulama
Şema öğelerine eklenen özel meta veriler artık extensions alanı aracılığıyla sorgulanabilmektedir.
Şemanın tüm introspeksiyon öğeleri yeni alanla güncellendi; her biri, o öğe için özel özellikleri ortaya koyan ilgili bir "Extensions" türünden bir nesne döndürür.
# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
# Is the schema being namespaced?
isNamespaced: Boolean!
}
extend type __Schema {
extensions: _SchemaExtensions!
}
type _NamedTypeExtensions {
# The type name
elementName: String!
# The "namespaced" type name
namespacedName: String!
# Enum-like "possible values" for EnumString type resolvers, `null` otherwise
possibleValues: [String!]
# OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
isOneOf: Boolean!
}
extend type __Type {
# Non-null for named types, null for wrapping types (Non-Null and List)
extensions: _NamedTypeExtensions
}
type _DirectiveExtensions {
# If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
needsDataToExecute: Boolean!
# Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
extend type __Directive {
extensions: _DirectiveExtensions!
}
type _FieldExtensions {
isGlobal: Boolean!
# Useful for nested mutations
isMutation: Boolean!
# `true` => Only exposed when "Expose "sensitive" data elements" is enabled
isSensitiveDataElement: Boolean!
}
extend type __Field {
extensions: _FieldExtensions!
}
type _InputValueExtensions {
isSensitiveDataElement: Boolean!
}
extend type __InputValue {
extensions: _InputValueExtensions!
}
type _EnumValueExtensions {
isSensitiveDataElement: Boolean!
}
extend type __EnumValue {
extensions: _EnumValueExtensions!
}GraphQL Sunucu Kodunun WordPress'ten Ayrıştırılması Tamamlandı
Eklentiyi destekleyen temel GraphQL sunucusu artık bağımsız bir PHP bileşeni olarak, yani WordPress'ten bağımsız olarak kurulup çalıştırılabilir.
Bu durum, Gato GraphQL'i başka framework'lerle (örn: Laravel) ve WordPress'in mevcut olup olmadığına bakılmaksızın (Sürekli Entegrasyon görevi çalıştırılırken olduğu gibi) herhangi bir PHP ortamında kullanmaya kapı aralamaktadır.
Schema Configuration, Custom Endpoint ve Persisted Query Düzenlenirken Belgelere Göz Atma
Schema Configuration, Custom Endpoint ve Persisted Query düzenlenirken gösterilen tüm bloklar artık bir "bilgi" düğmesine sahiptir; bu düğmeye tıklandığında bir modal pencerede belgeler görüntülenir.


Çok Daha Fazlası
Diğer tüm yeni özellikleri keşfetmek için yeni sürümün tam açıklamasına bakın veya changelog'u inceleyin.
Gördüklerinizi beğendiyseniz, lütfen sevgiyi yaymaya yardımcı olun ❤️