🔌 Dostęp do danych API REST z wtyczek WordPress
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
- Upewnij się, że rozszerzenie HTTP Client jest zainstalowane (dołączone do rozszerzeń Power Gato GraphQL i pakietów).
- 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:
- Znajdź bazowy adres URL i ścieżkę (np. w dokumentacji REST/API wtyczki).
- Dodaj ten adres URL (lub wyrażenie regularne dla niego) do listy dozwolonych adresów URL HTTP Client.
- Jeśli API wymaga uwierzytelnienia, użyj
options.headers(luboptions.authdla uwierzytelnienia basic) winputpola_send*. - Użyj
_sendJSONObjectItemHTTPRequestdla pojedynczego zasobu i_sendJSONObjectCollectionHTTPRequestdla listy. - 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.