Blog

🔌 Auf REST API-Daten von WordPress-Plugins zugreifen

Leonardo Losoviz
Von Leonardo Losoviz ·

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

  1. Stelle sicher, dass die HTTP Client-Erweiterung installiert ist (enthalten in den Gato GraphQL Power-Erweiterungen und Bundles).
  2. 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:

  1. Finde die Basis-URL und den Pfad (z. B. aus der REST/API-Dokumentation des Plugins).
  2. Füge diese URL (oder einen regulären Ausdruck dafür) zur erlaubten Liste des HTTP Client hinzu.
  3. Wenn die API eine Authentifizierung erfordert, verwende options.headers (oder options.auth für Basic-Authentifizierung) im input des _send*-Feldes.
  4. Verwende _sendJSONObjectItemHTTPRequest für eine einzelne Ressource und _sendJSONObjectCollectionHTTPRequest für eine Liste.
  5. 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.


Abonniere unseren Newsletter

Bleib über alle Updates zu Gato GraphQL auf dem Laufenden.