🔌 Auf REST API-Daten von WordPress-Plugins zugreifen
Viele WordPress-Plugins stellen Daten über die REST API bereit, bieten aber keine GraphQL-Schicht. Mit Gato GraphQL kannst du diese Daten trotzdem in einer einzigen GraphQL-Anfrage nutzen: Die Erweiterung HTTP Client ermöglicht es dir, beliebige REST-Endpunkte aufzurufen und mit der JSON-Antwort direkt in deiner query zu arbeiten.
Wenn ein Plugin also keine GraphQL-Integration hat, bist du nicht aufgeschmissen – du fragst seine REST API aus GraphQL heraus ab und hast alles an einem Ort.
Dieser Artikel zeigt, wie das geht. Dasselbe Muster funktioniert für jedes Plugin, das REST-Endpunkte bereitstellt.
Voraussetzungen
- Stelle sicher, dass die HTTP Client-Erweiterung installiert ist (enthalten in den Gato GraphQL Power-Erweiterungen und Bundles).
- Konfiguriere die erlaubten URLs, damit die REST-Basis des Plugins zugelassen ist. Für Anfragen an dieselbe Website erlaube die URL deiner Website (z. B.
#https://deinewebsite.com/wp-json/.*#oder deine genaue REST-Basis). Siehe konfigurieren, welche URLs per HTTP angefragt werden dürfen.
Wenn die API des Plugins eine Autorisierung erfordert, musst du das Autorisierungs-Token erstellen und es in der Anfrage übergeben (z. B. über Header).
Beispiel: Terminbuchungsdaten abrufen
BookingPress ist ein Terminbuchungs-Plugin, das REST API-Endpunkte zum Abrufen von Termindaten bereitstellt. Wir können diese Endpunkte also aus GraphQL heraus aufrufen und die Termindaten abrufen.
In der BookingPress REST API-Dokumentation sehen wir, dass die aktuelle Endpunkt-Basis wp-json/bookingpress/v1 ist.
1. Termine auflisten (Sammlung)
Verwende _sendJSONObjectCollectionHTTPRequest, wenn die API eine Liste von Elementen zurückgibt (z. B. ein Array von Terminen). Wenn die API die Liste in einem Objekt verpackt (z. B. { "data": [ ... ] }), musst du möglicherweise _sendJSONObjectItemHTTPRequest verwenden und dann die Eigenschaft data aus dem Ergebnis lesen.
Erstelle die URL aus der Home-URL deiner Website mit optionValue(name: "home"), damit dieselbe query in jeder Umgebung funktioniert:
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
}
]
}
}
)
}Definiere BOOKINGPRESS_API_KEY in deiner Umgebung (z. B. in wp-config.php). Die query liest ihn über das Feld _env der Erweiterung PHP-Konstanten und Umgebungsvariablen via Schema und entfernt ihn dann mit @remove aus der Antwort.
// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. Einzelner Termin per ID
Für einen einzelnen Termin verwendest du _sendJSONObjectItemHTTPRequest und baust die URL mit der ID zusammen:
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. Daten aus der Antwort extrahieren
Du kannst die spezifischen Eigenschaften aus der Antwort extrahieren, die du benötigst, und sie in deiner query verwenden.
Nutze _underJSONObjectProperty, um zur Eigenschaft im Antwortobjekt zu navigieren, und @export, um den Wert zu extrahieren und ihn in der query verfügbar zu machen.
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") {
{
# Mache etwas mit den Termindaten
appointmentId: _echo(value: $appointmentId)
selectedDate: _echo(value: $selectedDate)
startTime: _echo(value: $startTime)
serviceId: _echo(value: $serviceId)
customerId: _echo(value: $customerId)
}Dasselbe Muster für andere Plugins
Für jedes Plugin, das REST-Endpunkte bereitstellt:
- Finde die Basis-URL und den Pfad (z. B. aus der REST/API-Dokumentation des Plugins).
- Füge diese URL (oder einen regulären Ausdruck dafür) zur erlaubten Liste des HTTP Client hinzu.
- Wenn die API eine Authentifizierung erfordert, verwende
options.headers(oderoptions.authfür Basic-Authentifizierung) iminputdes_send*-Feldes. - Verwende
_sendJSONObjectItemHTTPRequestfür eine einzelne Ressource und_sendJSONObjectCollectionHTTPRequestfür eine Liste. - Extrahiere die spezifischen Eigenschaften aus der Antwort, die du benötigst, und verwende sie in deiner query.
Du kannst diese REST-gespeisten Felder mit nativen GraphQL-Typen (Posts, Benutzer usw.) in einer einzigen query kombinieren, sodass der Client eine einzige Antwort erhält, die WordPress-Core-Daten und Plugin-Daten aus deren REST API vermischt.
Weitere Beispiele für REST-Aufrufe und die Verarbeitung von Antworten findest du in der Dokumentation der HTTP Client-Erweiterung und im Tutorial zum Abrufen von Daten aus einer externen API.