🔌 Accedere ai dati dell'API REST dai plugin WordPress
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
- Assicurati che l'estensione HTTP Client sia installata (inclusa nelle estensioni Power di Gato GraphQL e nei bundle).
- 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:
- Trova l'URL di base e il percorso (ad esempio dalla documentazione REST/API del plugin).
- Aggiungi quell'URL (o un'espressione regolare per esso) alla lista consentita dell'HTTP Client.
- Se l'API richiede l'autenticazione, usa
options.headers(ooptions.authper l'autenticazione basic) nell'inputdel campo_send*. - Usa
_sendJSONObjectItemHTTPRequestper una singola risorsa e_sendJSONObjectCollectionHTTPRequestper una lista. - 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.