Blog

🚀 Rilasciata la nuova versione 0.8 di Gato GraphQL!

Leonardo Losoviz
Di Leonardo Losoviz ·

La versione 0.8 di Gato GraphQL è ora disponibile per il download! 🎉

Si tratta di una versione importante, che si concentra su tre aree:

  1. Refactoring del codice per abilitare le estensioni
  2. Maggiore conformità alla specifica GraphQL
  3. Completamento dello schema GraphQL

Inoltre, supporta il nuovo WordPress 5.8 e contiene numerose correzioni di bug e miglioramenti.

Si noti che questa versione contiene modifiche non retrocompatibili!

Di seguito le note di rilascio. Link rapidi:


Supporto per WordPress 5.8

WordPress 5.8 deprecata diversi filter hooks, tra cui allowed_block_types e block_categories (utilizzati da questo plugin).

Gli hook interessati sono stati sostituiti:

  1. allowed_block_types => allowed_block_types_all
  2. block_categories => block_categories_all

Supporto migliorato per PHP 8.0

Questa versione corregge alcuni problemi durante l'utilizzo di PHP 8.0.

Codice semplificato, utilizzando i container services ovunque

Il codice del server GraphQL è stato refattorizzato per utilizzare un service container per registrare tutti gli elementi dello schema (type resolvers, field resolvers, interface resolvers, custom scalar resolvers e altri).

Si tratta di una pietra miliare, che introduce un approccio unico per sviluppare il plugin e le sue estensioni, semplificando notevolmente il loro codice e la loro documentazione.

La documentazione su come creare estensioni personalizzate per Gato GraphQL può finalmente essere scritta. Il lavoro su di essa inizierà presto e sarà pubblicato nella sezione guide.

La cache viene salvata sotto wp-content

Il plugin memorizza in cache i risultati su disco per ottimizzare le prestazioni.

I file memorizzati in cache erano precedentemente conservati in una cartella di sistema, fuori dalla vista dell'utente amministratore. D'ora in poi, vengono conservati sotto wp-content/graphql-api/cache/.

È stato introdotto un endpoint GraphQL a "schema fisso" per alimentare l'editor di WordPress

Ora ci sono 2 endpoint nel wp-admin:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT

Con GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT, lo schema GraphQL viene modificato dalle preferenze dell'utente, come essere sotto namespace o meno, avere tipi/direttive abilitati o meno, e altre.

Con GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT, lo schema GraphQL non viene modificato dalle preferenze dell'utente, esponendo sempre tutti i tipi, campi e direttive, inclusi i campi admin "unrestricted".

L'endpoint fisso consente ai blocchi Gutenberg di interrogare tutti i campi, indipendentemente dal fatto che siano abilitati o meno dall'utente, e con accesso senza restrizioni.

Ulteriore supporto dei tipi di campo nello schema

Il supporto per le liste come tipi di campo è stato ampliato, supportando ora le seguenti funzionalità:

  • Liste con elementi non nulli: [String!]
  • Liste di liste: [[String]]
  • Qualsiasi combinazione di esse: [[String!]!]

Input coercion: accettare un valore singolo quando è attesa una lista

Ora possiamo inserire un valore singolo nella query GraphQL dove è attesa una lista, come definito nella specifica GraphQL.

Ad esempio, queste query sono ora equivalenti:

query InputSingleValue {
  posts(filter: { ids: 1 }) {
    title
  }
}
 
query InputListOfSingleItem {
  posts(filter: { ids: [1] }) {
    title
  }
}

Schema WordPress ulteriormente completato

Sono state aggiunte allo schema GraphQL ulteriori entità del modello di dati di WordPress:

Schema GraphQL

Vediamo quali nuovi elementi sono stati aggiunti.

Categorie

Le categorie sono state mappate, tramite il nuovo tipo PostCategory, e i nuovi campi:

  • Root.postCategories: [PostCategory]
  • Root.postCategory: PostCategory
  • Post.categories: [PostCategory]

Ad esempio, questa query recupera le categorie dei post:

{
  posts {
    id
    title
    categories {
      id
      name
      url
    }
  }
}

È stato aggiunto anche un campo mutation, per assegnare categorie ai post:

  • MutationRoot.setCategoriesOnPost: Post

Ed è stato aggiunto un input categories ai campi mutation per i post:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (quando le nested mutations sono abilitate)

Meta

I valori meta di custom post, utente, commento e tassonomia possono ora essere interrogati, tramite i nuovi campi:

  • Post.metaValue: AnyScalar
  • Post.metaValues: [AnyScalar]
  • User.metaValue: AnyScalar
  • User.metaValues: [AnyScalar]
  • Comment.metaValue: AnyScalar
  • Comment.metaValues: [AnyScalar]
  • PostCategory.metaValue: AnyScalar
  • PostCategory.metaValues: [AnyScalar]
  • PostTag.metaValue: AnyScalar
  • PostTag.metaValues: [AnyScalar]

Ad esempio, questa query recupera il meta last_name per gli utenti:

{
  users {
    id
    lastName: metaValue(key: "last_name")
  }
}

Poiché i valori meta possono essere qualsiasi cosa (string, integer, float o boolean), sono stati mappati tramite il nuovo tipo scalare generico AnyScalar.

I valori meta possono essere pubblici o privati. Le meta keys che possono essere interrogate devono essere configurate esplicitamente nella pagina delle impostazioni:

Definizione delle voci
Definizione delle voci

Per impostazione predefinita, l'elenco delle meta keys consentite è vuoto.

I menu sono stati mappati, tramite il nuovo tipo Menu, e il nuovo campo Root.menu.

{
  menu(by: { id: 176 }) {
    itemDataEntries
  }
}

Settings

Le impostazioni del sito (memorizzate nella tabella wp_options) possono essere interrogate tramite il nuovo campo Root.option: AnyScalar.

Ad esempio, questa query recupera il nome del sito:

{
  siteName: optionValue(name: "blogname")
}

Le opzioni accessibili devono essere configurate esplicitamente nella pagina delle impostazioni:

Definizione delle voci per i Settings

Per impostazione predefinita, solo le seguenti opzioni possono essere interrogate:

  • "home"
  • "blogname"
  • "blogdescription"

User posts

Gli utenti che hanno effettuato l'accesso possono recuperare i propri post, per qualsiasi stato (publish, pending, draft o trash), tramite i nuovi campi:

  • Root.myPosts: [Post]
  • Root.myPostCount: Int
  • Root.myPost: Post

Ad esempio, ora possiamo eseguire questa query:

# Log yourself in first
mutation LogIn {
  loginUser(usernameOrEmail: "test", password: "pass") {
    id
    name
  }
}
 
# Then retrieve your posts
query GetMyPosts {
  myPosts {
    id
    title
    url
    status
    author {
      name
    }
  }
}

Aggiunta di campi admin "unrestricted" allo schema GraphQL

Lo schema GraphQL deve trovare un equilibrio tra campi pubblici e privati, al fine di evitare di esporre informazioni private in un'API pubblica.

Il nuovo modulo Schema for the Admin aggiunge campi admin "unrestricted" allo schema GraphQL, che possono esporre dati privati:

Root:

  • unrestrictedPost
  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPost
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • unrestrictedGenericCustomPost
  • unrestrictedGenericCustomPosts
  • unrestrictedGenericCustomPostCount
  • unrestrictedPage
  • unrestrictedPages
  • unrestrictedPageCount
  • unrestrictedUsers
  • roles
  • capabilities

User:

  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • roles
  • capabilities

PostCategory:

  • unrestrictedPosts
  • unrestrictedPostCount

PostTag:

  • unrestrictedPosts
  • unrestrictedPostCount

Ad esempio, per accedere ai dati dei post, attualmente abbiamo il campo posts, che espone solo i dati pubblici, recuperando i post pubblicati.

D'ora in poi, possiamo accedere ai dati dei post anche tramite il campo unrestrictedPosts, che espone dati pubblici e privati, recuperando i post con qualsiasi stato ("publish", "draft", "pending", "trash").

{
  unrestrictedPosts(status: [draft, pending]) {
    id
    title
    status
    author {
      id
      name
    }
  }
}

Introduzione del tipo scalare AnyScalar

Il tipo scalare AnyScalar rappresenta uno qualsiasi degli scalari integrati (String, Int, Boolean, Float o ID).

Viene utilizzato sui campi option e metaValue(s) appena introdotti, perché non conosciamo in anticipo il tipo dei dati restituiti, e l'unione dei tipi scalari non è ancora supportata dalla specifica GraphQL.

Settings in formato lungo

Le opzioni nella pagina Settings sono divise per schede. Da v0.8 è anche possibile visualizzarle tutte insieme in un'unica pagina lunga.

Per abilitare questo comportamento, deseleziona la voce "Have all options in this Settings page be organized under tabs, one tab per module." nelle Settings, e premi su "Save Changes":

Casella di controllo per abilitare/disabilitare le schede nelle Settings

Quindi, tutte le impostazioni verranno mostrate insieme in formato lungo:

Settings in formato lungo


Modifiche non retrocompatibili

La versione v0.8 produce modifiche non retrocompatibili con la versione precedente.

Modifiche non retrocompatibili di configurazione

I seguenti CPT hanno avuto il loro blocco "Options" ricostruito:

  • Schema Configurations
  • Custom Endpoints
  • Persisted Queries

Nella precedente v0.7, un singolo blocco Options per queste entità conteneva molti elementi di configurazione. Da v0.8, questo blocco è stato disaccoppiato in diversi blocchi indipendenti, ciascuno contenente la propria configurazione.

Ad esempio, in v0.7, (oltre ad abilitare/disabilitare l'endpoint) il blocco Custom Endpoint Options consentiva di configurare i client GraphiQL e Interactive Schema:

Options in Custom Endpoint

Da v0.8, questa configurazione viene aggiunta tramite i blocchi GraphiQL e Interactive Schema:

Options in Custom Endpoint

La configurazione memorizzata nei blocchi Options per tutti e 3 i CPT non viene migrata automaticamente al nuovo formato. Pertanto, prima di aggiornare a v0.8, ti preghiamo di annotare la tua configurazione memorizzata e di replicarla dopo l'aggiornamento alla nuova versione.

Ci scusiamo per l'inconveniente.

Inoltre, dovrai fare clic sul pulsante "Reset the template" mostrato nell'editor di WordPress, per tutte le voci dei 3 CPT.

Reset the template nell'editor di WordPress

Direttive non standard rimosse

Le direttive non standard sono state rimosse dal plugin:

  • @default
  • @removeIfNull
  • @export

Moduli rimossi

I seguenti moduli sono stati rimossi dal plugin:

  • Field Deprecation
  • Configuration Cache
  • Schema Cache
  • Multiple Query Execution
  • Proactive Feedback
  • Schema Editing Access
  • Embeddable fields

Roadmap futura

Ora che v0.8 è stata rilasciata, possiamo iniziare a pianificare la strada da percorrere.

Il piano attuale è il seguente:

Rilasciare v0.9 a settembre 2021, includendo:

  • Custom scalars
  • Uno schema GraphQL aggiornato, utilizzando custom scalars ove appropriato (es: Post.date restituirà il tipo Date invece di String)
  • Ulteriori miglioramenti per supportare le estensioni

E poi, rilasciare v1.0 verso la fine dell'anno o all'inizio del 2022, includendo:

  • Una demo di un plugin di estensione
  • Guide di documentazione complete sulla creazione di estensioni
  • Lancio del plugin Gato GraphQL su wp.org

Per ricevere notifiche sullo stato attuale, puoi iscriverti alla newsletter.


Hai riscontrato problemi?

Se hai qualche problema nell'installazione o nell'esecuzione di v0.8, crea una issue nel repository.


Iscriviti alla nostra newsletter

Resta aggiornato su tutte le novità di Gato GraphQL.