🥳 Gato GraphQL v0.9 è stato rilasciato!
Dopo quasi 1,5 anni di sviluppo e oltre 16.000 commit, è stata finalmente rilasciata una nuova versione di Gato GraphQL! 🥳
La versione 0.9 è la più grande release nella storia del plugin. Ecco il changelog, ed ecco il dettaglio completo di tutte le nuove funzionalità:
github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3
Questo documento è piuttosto lungo (oltre 40 min di lettura!), quindi di seguito trovi un TL;DR con le modifiche più importanti.
Schema GraphQL notevolmente completato
Il modello di dati di WordPress è stato notevolmente mappato nello schema GraphQL.

Tra le altre cose, lo schema presenta i seguenti miglioramenti:
- Eseguire query sui dati da qualsiasi CPT, inclusi quelli di qualsiasi tema e plugin
- Tassonomie personalizzate mappate (tag e categorie)
- Tipi GraphQL più appropriati creati e restituiti (es:
HTML,URL,DateTime) - Argomenti di campo organizzati tramite input object
- Uso dei oneof input object per selezionare un'entità tramite diverse proprietà (es:
id,slug) - Restituire payload di mutation
- Eseguire query sulle impostazioni (da
wp_options) e sui valori meta (per post, utenti, commenti e tassonomie)
Custom scalars
Il supporto per i tipi scalari personalizzati è stato aggiunto al server GraphQL. I custom scalars ti permettono di rappresentare meglio i tuoi dati, sia per ottenere un input tramite un argomento di campo, sia per stampare un output personalizzato nella risposta.
Sono stati implementati diversi tipi scalari personalizzati standard, quindi sono immediatamente disponibili per essere usati nel tuo schema GraphQL:
DateDateTimeEmailHTMLURLURLAbsolutePath
Custom enums
I tipi enum personalizzati sono ora supportati. Gli enum sono un tipo speciale di scalare ristretto a un particolare insieme di valori consentiti. Questo ti permette di:
- Validare che qualsiasi argomento di questo tipo sia uno dei valori consentiti
- Comunicare tramite il sistema di tipi che un campo sarà sempre uno di un insieme finito di valori
Sono stati implementati diversi tipi enum, e usati quando appropriato nello schema GraphQL, tra cui:
CommentOrderByEnumCommentStatusEnumCommentTypeEnumCustomPostOrderByEnumCustomPostStatusEnumMediaItemOrderByEnumMenuOrderByEnumTaxonomyOrderByEnumUserOrderByEnum
Input Objects
Il server GraphQL ora supporta anche gli input type, e puoi aggiungere i tuoi input object allo schema GraphQL. Gli input object ti permettono di passare oggetti complessi come input ai campi, il che è particolarmente utile per le mutation.
Diversi input object sono stati aggiunti dove appropriato nello schema. Ad esempio, i campi per eseguire query sui dati (come posts, users, comments, ecc.) ricevono input object complessi sotto gli argomenti di campo filter, sort e pagination, e i campi che mutano i dati (come createPost, addCommentToCustomPost, ecc.) ricevono un input object sotto l'argomento di campo input.
Oneof Input Objects
L'"oneof" input object è un tipo particolare di input object, in cui esattamente uno dei campi di input deve essere fornito come input, altrimenti restituisce un errore di validazione. Questo comportamento introduce il polimorfismo per gli input.
Ad esempio, il campo Root.post ora riceve un argomento di campo by, che è un oneof input object che permette di recuperare il post tramite diverse proprietà, come per id o per slug:
{
postByID: post(by: {
id: 1
}) {
id
title
}
postBySlug: post(by: {
slug: "hello-world"
}) {
id
title
}
}Il vantaggio è che un singolo campo può quindi essere usato per affrontare diversi casi d'uso, così possiamo evitare di creare un campo diverso per ogni caso d'uso (come postByID, postBySlug, ecc.), rendendo così lo schema GraphQL più snello ed elegante.
Sono stati implementati diversi Oneof Input Objects:
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
Le operazioni GraphQL (ovvero le operazioni query e mutation) ora possono anche ricevere direttive.
Restringere le direttive a tipi specifici
Le direttive (di campo) possono essere ristrette per essere applicate solo ai campi di alcuni tipi specifici. Ad esempio, una direttiva @strUpperCase che trasforma il valore del campo in maiuscolo ha senso solo sui campi String, non su Int o Float o Boolean. Questa restrizione può ora essere dichiarata nel directive resolver.
Stampare il percorso completo verso il nodo della query GraphQL che produce errori
La risposta contiene ora il percorso completo verso i nodi nella query GraphQL che restituiscono un errore (sotto la voce extensions.path), rendendo più facile individuare la fonte del problema.
Ad esempio, nella seguente query, la direttiva @nonExisting non esiste:
query {
myField @nonExisting
}La risposta è la seguente:
{
"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"
}
}Abilitare le impostazioni predefinite non sicure
Gato GraphQL fornisce impostazioni predefinite sicure:
- L'endpoint singolo è disabilitato
- Gli elementi di dati «sensibili» nello schema GraphQL (come
User.roles, o il filtraggio dei post perstatus) non sono esposti - Solo una manciata di opzioni delle impostazioni e di meta key (per post, utenti, ecc.) possono essere interrogate
- Il numero di entità che possono essere interrogate contemporaneamente è limitato (per post, utenti, ecc.)
Queste impostazioni predefinite sicure sono necessarie per rendere sicuri i siti «live», per prevenire attacchi malevoli. Tuttavia, non sono necessarie quando si costruiscono siti «statici», dove il sito WordPress non è vulnerabile agli attacchi (come quando si tratta di un sito di sviluppo su un computer portatile, dietro un firewall sicuro, o non esposto a Internet in generale).
A partire da v0.9, possiamo abilitare i valori predefiniti non sicuri aggiungendo in wp-config.php:
define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );In alternativa, possiamo definire questa stessa chiave/valore come variabile d'ambiente.
Quando si abilitano i valori predefiniti non sicuri, le impostazioni predefinite del plugin vengono trasformate così:
- L'endpoint singolo è abilitato
- Gli elementi di dati «sensibili» sono esposti nello schema GraphQL
- Tutte le opzioni delle impostazioni e le meta key possono essere interrogate
- Il numero di entità che possono essere interrogate contemporaneamente è illimitato
Organizzare i Custom Endpoint e le Persisted Query per categoria
Durante la creazione di un Custom Endpoint o di una Persisted Query, possiamo aggiungervi una «GraphQL endpoint category», per organizzare tutti i nostri endpoint:

Ad esempio, possiamo creare categorie per gestire gli endpoint per cliente, applicazione, o qualsiasi altra informazione richiesta:

Nell'elenco dei Custom Endpoint e delle Persisted Query, possiamo visualizzare le loro categorie e, cliccando su qualsiasi link di categoria, o usando il filtro in alto, verranno mostrate solo tutte le voci di quella categoria.

Eseguire query sulle schema extensions tramite introspezione
I metadati personalizzati associati agli elementi dello schema possono ora essere interrogati tramite il campo extensions.
Tutti gli elementi di introspezione dello schema sono stati aggiornati con il nuovo campo, ognuno dei quali restituisce un oggetto di un corrispondente tipo «Extensions», che espone le proprietà personalizzate per quell'elemento.
# 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!
}Completato il disaccoppiamento del codice del server GraphQL da WordPress
Il server GraphQL sottostante che alimenta il plugin può ora essere installato ed eseguito come componente PHP autonomo, ovvero indipendentemente da WordPress.
Questo apre le porte all'uso di Gato GraphQL con altri framework (es: Laravel), e in qualsiasi ambiente PHP, che WordPress sia disponibile o meno (come quando si esegue un'attività di Integrazione Continua).
Sfogliare la documentazione durante la modifica di una Schema Configuration, Custom Endpoint e Persisted Query
Tutti i blocchi mostrati durante la modifica di una Schema Configuration, Custom Endpoint e Persisted Query dispongono ora di un pulsante «info» che, quando cliccato, mostra la documentazione in una finestra modale.


Molto altro ancora
Per scoprire tutte le altre nuove funzionalità, consulta la descrizione completa della nuova release, o sfoglia il changelog.
Se ti piace ciò che vedi, aiutaci a diffondere l'amore ❤️