🔌 Toegang tot REST API-data van WordPress-plugins
Veel WordPress-plugins bieden data aan via de REST API, maar hebben geen GraphQL-laag. Met Gato GraphQL kun je die data toch gebruiken in één GraphQL-verzoek: de HTTP Client-extensie laat je elk REST-endpoint aanroepen en direct met het JSON-antwoord werken in je query.
Dus als een plugin geen GraphQL-integratie heeft, zit je niet vast — je bevraagt hun REST API vanuit GraphQL en houdt alles op één plek.
In dit artikel laten we zien hoe je dat doet. Hetzelfde patroon werkt voor elke plugin die REST-endpoints aanbiedt.
Vereisten
- Zorg dat de HTTP Client-extensie is geïnstalleerd (inbegrepen bij de Gato GraphQL Power-extensies en -bundels).
- Configureer de Toegestane URL's zodat de REST-basis van de plugin is toegestaan. Voor verzoeken aan dezelfde site sta je je site-URL toe (bijv.
#https://jouwsite.com/wp-json/.*#of je exacte REST-basis). Zie configureren welke URL's via HTTP kunnen worden opgevraagd.
Als de API van de plugin autorisatie vereist, moet je een autorisatietoken aanmaken en dat meesturen in het verzoek (bijv. via headers).
Voorbeeld: Afspraakboekingsdata ophalen
BookingPress is een afspraakboekingsplugin die REST API-endpoints biedt om afspraakdata op te halen. Zo kunnen we die endpoints aanroepen vanuit GraphQL en de afspraakdata ophalen.
In de BookingPress REST API-documentatie zien we dat de huidige endpoint-basis wp-json/bookingpress/v1 is.
1. Afspraken ophalen (collectie)
Gebruik _sendJSONObjectCollectionHTTPRequest wanneer de API een lijst van items retourneert (bijv. een array van afspraken). Als de API de lijst in een object verpakt (bijv. { "data": [ ... ] }), moet je mogelijk _sendJSONObjectItemHTTPRequest gebruiken en daarna de eigenschap data uit het resultaat lezen.
Bouw de URL op vanuit de home-URL van je site met optionValue(name: "home"), zodat dezelfde query in elke omgeving werkt:
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
}
]
}
}
)
}Definieer BOOKINGPRESS_API_KEY in je omgeving (bijv. in wp-config.php). De query leest het via het _env-veld van de extensie PHP-constanten en omgevingsvariabelen via Schema, waarna het met @remove uit het antwoord wordt verwijderd.
// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. Enkele afspraak op ID
Voor één afspraak gebruik je _sendJSONObjectItemHTTPRequest en bouw je de URL op met het 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. Data extraheren uit het antwoord
Je kunt de specifieke eigenschappen die je nodig hebt uit het antwoord extraheren en ze gebruiken in je query.
Gebruik _underJSONObjectProperty om naar de eigenschap in het antwoordobject te navigeren, en @export om de waarde te extraheren en beschikbaar te maken in de 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") {
{
# Doe iets met de afspraakdata
appointmentId: _echo(value: $appointmentId)
selectedDate: _echo(value: $selectedDate)
startTime: _echo(value: $startTime)
serviceId: _echo(value: $serviceId)
customerId: _echo(value: $customerId)
}Hetzelfde patroon voor andere plugins
Voor elke plugin die REST-endpoints aanbiedt:
- Zoek de basis-URL en het pad op (bijv. in de REST/API-documentatie van de plugin).
- Voeg die URL (of een regex ervoor) toe aan de toegestane lijst van de HTTP Client.
- Als de API authenticatie vereist, gebruik dan
options.headers(ofoptions.authvoor basic-authenticatie) in deinputvan het_send*-veld. - Gebruik
_sendJSONObjectItemHTTPRequestvoor één resource en_sendJSONObjectCollectionHTTPRequestvoor een lijst. - Extraheer de specifieke eigenschappen die je nodig hebt uit het antwoord en gebruik ze in je query.
Je kunt deze REST-gevulde velden combineren met native GraphQL-types (berichten, gebruikers, enz.) in één query, zodat de client één antwoord ontvangt dat WordPress-kerndata en plugindata uit hun REST API combineert.
Voor meer voorbeelden van het aanroepen van REST en het verwerken van antwoorden, zie de HTTP Client-extensiedocumentatie en de tutorial over data ophalen uit een externe API.