Blog

🔌 Accedere ai dati dell'API REST dai plugin WordPress

Leonardo Losoviz
Di Leonardo Losoviz ·

Molti plugin WordPress espongono i dati tramite l'API REST ma non forniscono uno strato GraphQL. Con Gato GraphQL puoi comunque usare quei dati in un'unica richiesta GraphQL: l'estensione HTTP Client ti permette di chiamare qualsiasi endpoint REST e di lavorare con la risposta JSON direttamente nella tua query.

Quindi, quando un plugin non ha un'integrazione GraphQL, non sei bloccato: interroghi la sua API REST da GraphQL e mantieni tutto in un unico posto.

Questo articolo mostra come farlo. Lo stesso schema funziona per qualsiasi plugin che espone endpoint REST.

Prerequisiti

  1. Assicurati che l'estensione HTTP Client sia installata (inclusa nelle estensioni Power di Gato GraphQL e nei bundle).
  2. Configura gli URL consentiti in modo che la base REST del plugin sia autorizzata. Per le richieste verso lo stesso sito, autorizza l'URL del tuo sito (ad esempio, #https://tuosito.com/wp-json/.*# o la tua base REST esatta). Consulta configurare quali URL possono essere oggetto di richieste HTTP.

Se l'API del plugin richiede un'autorizzazione, dovrai creare il token di autorizzazione e trasmetterlo nella richiesta (ad esempio tramite gli header).

Esempio: Recuperare i dati di prenotazione degli appuntamenti

BookingPress è un plugin di prenotazione appuntamenti che offre endpoint dell'API REST per recuperare i dati degli appuntamenti. Possiamo quindi chiamare quegli endpoint da GraphQL e recuperare i dati degli appuntamenti.

Consultando la documentazione dell'API REST di BookingPress, vediamo che la base dell'endpoint attuale è wp-json/bookingpress/v1.

1. Elencare gli appuntamenti (collezione)

Usa _sendJSONObjectCollectionHTTPRequest quando l'API restituisce una lista di elementi (ad esempio, un array di appuntamenti). Se l'API incapsula la lista in un oggetto (ad esempio, { "data": [ ... ] }), potresti dover usare _sendJSONObjectItemHTTPRequest e poi leggere la proprietà data dal risultato.

Costruisci l'URL a partire dall'URL home del tuo sito usando optionValue(name: "home") in modo che la stessa query funzioni in qualsiasi ambiente:

query GetBookingPressAppointments {
  siteURL: optionValue(name: "siteurl")
    @remove
 
  restBase: _sprintf(
    string: "%s/wp-json/bookingpress/v1/appointments",
    values: [$__siteURL]
  )
    @remove
 
  bookingpressApiKey: _env(name: "BOOKINGPRESS_API_KEY")
    @remove
 
  authorizationHeader: _sprintf(
    string: "x-bookingpress-api-key %s",
    values: [$__bookingpressApiKey]
  )
    @remove
 
  appointments: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: $__restBase,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
}

Definisci BOOKINGPRESS_API_KEY nel tuo ambiente (ad esempio in wp-config.php). La query lo legge tramite il campo _env dell'estensione Costanti PHP e Variabili d'Ambiente tramite lo Schema, e poi lo rimuove (@remove) dalla risposta.

// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );

2. Appuntamento singolo per ID

Per un singolo appuntamento, usa _sendJSONObjectItemHTTPRequest e costruisci l'URL con l'ID:

query GetBookingPressAppointment($appointmentId: ID!) {
  siteURL: optionValue(name: "siteurl")
    @remove
 
  restURL: _sprintf(
    string: "%s/wp-json/bookingpress/v1/appointments/%s",
    values: [$__siteURL, $appointmentId]
  )
    @remove
 
  bookingpressApiKey: _env(name: "BOOKINGPRESS_API_KEY")
    @remove
 
  authorizationHeader: _sprintf(
    string: "x-bookingpress-api-key %s",
    values: [$__bookingpressApiKey]
  )
    @remove
 
  appointment: _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__restURL,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
}

3. Estrarre i dati dalla risposta

Puoi estrarre dalla risposta le proprietà specifiche di cui hai bisogno e usarle nella tua query.

Usa _underJSONObjectProperty per navigare fino alla proprietà dall'oggetto di risposta, e @export per estrarre il valore e renderlo disponibile nella query.

query GetBookingPressAppointment($appointmentId: ID!) {
  # ...
  appointment: _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__restURL,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
    @underJSONObjectProperty(by: { path: "data.id" })
      @export(as: "appointmentId")
    @underJSONObjectProperty(by: { path: "data.selected_date" })
      @export(as: "selectedDate")
    @underJSONObjectProperty(by: { path: "data.start_time" })
      @export(as: "startTime")
    @underJSONObjectProperty(by: { path: "data.service_id" })
      @export(as: "serviceId")
    @underJSONObjectProperty(by: { path: "data.customer_id" })
      @export(as: "customerId")
}
 
query DoSomethingWithTheAppointment @depends(on: "GetBookingPressAppointment") {
{
  # Fai qualcosa con i dati dell'appuntamento
  appointmentId: _echo(value: $appointmentId)
  selectedDate: _echo(value: $selectedDate)
  startTime: _echo(value: $startTime)
  serviceId: _echo(value: $serviceId)
  customerId: _echo(value: $customerId)
}

Lo stesso schema per altri plugin

Per qualsiasi plugin che espone endpoint REST:

  1. Trova l'URL di base e il percorso (ad esempio dalla documentazione REST/API del plugin).
  2. Aggiungi quell'URL (o un'espressione regolare per esso) alla lista consentita dell'HTTP Client.
  3. Se l'API richiede l'autenticazione, usa options.headers (o options.auth per l'autenticazione basic) nell'input del campo _send*.
  4. Usa _sendJSONObjectItemHTTPRequest per una singola risorsa e _sendJSONObjectCollectionHTTPRequest per una lista.
  5. Estrai dalla risposta le proprietà specifiche di cui hai bisogno e usale nella tua query.

Puoi combinare questi campi alimentati da REST con tipi GraphQL nativi (post, utenti, ecc.) in un'unica query, così il client riceve una singola risposta che mescola i dati del core di WordPress e i dati del plugin provenienti dalla sua API REST.

Per altri esempi di chiamate REST e gestione delle risposte, consulta la documentazione dell'estensione HTTP Client e il tutorial su recuperare dati da un'API esterna.


Iscriviti alla nostra newsletter

Resta aggiornato su tutte le novità di Gato GraphQL.