Blog

🔌 Dostęp do danych API REST z wtyczek WordPress

Leonardo Losoviz
Autor: Leonardo Losoviz ·

Wiele wtyczek WordPress udostępnia dane przez API REST, ale nie zapewnia warstwy GraphQL. Dzięki Gato GraphQL możesz nadal używać tych danych w jednym żądaniu GraphQL: rozszerzenie HTTP Client pozwala wywoływać dowolny endpoint REST i pracować z odpowiedzią JSON bezpośrednio w swojej query.

Dlatego gdy wtyczka nie ma integracji GraphQL, nie jesteś zablokowany — odpytujesz jej API REST z GraphQL i masz wszystko w jednym miejscu.

Ten artykuł pokazuje, jak to zrobić. Ten sam wzorzec działa dla każdej wtyczki udostępniającej endpointy REST.

Wymagania wstępne

  1. Upewnij się, że rozszerzenie HTTP Client jest zainstalowane (dołączone do rozszerzeń Power Gato GraphQL i pakietów).
  2. Skonfiguruj dozwolone adresy URL, aby baza REST wtyczki była autoryzowana. W przypadku żądań do tego samego serwisu autoryzuj adres URL swojej witryny (np. #https://twojawitryna.com/wp-json/.*# lub dokładną bazę REST). Zobacz konfigurowanie, które adresy URL mogą być żądane przez HTTP.

Jeśli API wtyczki wymaga autoryzacji, musisz utworzyć token autoryzacyjny i przekazać go w żądaniu (np. przez nagłówki).

Przykład: Pobieranie danych rezerwacji wizyt

BookingPress to wtyczka do rezerwacji wizyt, która oferuje endpointy API REST do pobierania danych rezerwacji. W ten sposób możemy wywoływać te endpointy z GraphQL i pobierać dane rezerwacji.

Sprawdzając dokumentację API REST BookingPress, widzimy, że aktualna baza endpointu to wp-json/bookingpress/v1.

1. Lista rezerwacji (kolekcja)

Użyj _sendJSONObjectCollectionHTTPRequest, gdy API zwraca listę elementów (np. tablicę rezerwacji). Jeśli API opakowuje listę w obiekt (np. { "data": [ ... ] }), może być konieczne użycie _sendJSONObjectItemHTTPRequest, a następnie odczytanie właściwości data z wyniku.

Zbuduj adres URL na podstawie adresu URL home swojej witryny, używając optionValue(name: "home"), aby ta sama query działała w dowolnym środowisku:

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
          }
        ]
      }
    }
  )
}

Zdefiniuj BOOKINGPRESS_API_KEY w swoim środowisku (np. w wp-config.php). Query odczytuje go przez pole _env rozszerzenia Stałe PHP i zmienne środowiskowe via Schema, a następnie usuwa go (@remove) z odpowiedzi.

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

2. Pojedyncza rezerwacja według ID

Dla jednej rezerwacji użyj _sendJSONObjectItemHTTPRequest i zbuduj adres URL z 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. Wyodrębnianie danych z odpowiedzi

Możesz wyodrębnić z odpowiedzi konkretne właściwości, których potrzebujesz, i użyć ich w swojej query.

Użyj _underJSONObjectProperty, aby przejść do właściwości w obiekcie odpowiedzi, i @export, aby wyodrębnić wartość i udostępnić ją w 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") {
{
  # Zrób coś z danymi rezerwacji
  appointmentId: _echo(value: $appointmentId)
  selectedDate: _echo(value: $selectedDate)
  startTime: _echo(value: $startTime)
  serviceId: _echo(value: $serviceId)
  customerId: _echo(value: $customerId)
}

Ten sam wzorzec dla innych wtyczek

Dla każdej wtyczki udostępniającej endpointy REST:

  1. Znajdź bazowy adres URL i ścieżkę (np. w dokumentacji REST/API wtyczki).
  2. Dodaj ten adres URL (lub wyrażenie regularne dla niego) do listy dozwolonych adresów URL HTTP Client.
  3. Jeśli API wymaga uwierzytelnienia, użyj options.headers (lub options.auth dla uwierzytelnienia basic) w input pola _send*.
  4. Użyj _sendJSONObjectItemHTTPRequest dla pojedynczego zasobu i _sendJSONObjectCollectionHTTPRequest dla listy.
  5. Wyodrębnij z odpowiedzi konkretne właściwości, których potrzebujesz, i użyj ich w swojej query.

Możesz łączyć te pola zasilane przez REST z natywnymi typami GraphQL (posty, użytkownicy itp.) w jednej query, dzięki czemu klient otrzymuje jedną odpowiedź łączącą dane rdzenia WordPress i dane wtyczki z jej API REST.

Więcej przykładów wywołań REST i obsługi odpowiedzi znajdziesz w dokumentacji rozszerzenia HTTP Client oraz w samouczku dotyczącym pobierania danych z zewnętrznego API.


Zapisz się do naszego newslettera

Bądź na bieżąco ze wszystkimi aktualizacjami Gato GraphQL.