🔌 Доступ к данным REST API из плагинов WordPress
Многие плагины WordPress предоставляют данные через REST API, но не предоставляют слой GraphQL. С Gato GraphQL вы всё равно можете использовать эти данные в одном GraphQL-запросе: расширение HTTP Client позволяет обращаться к любому REST-эндпоинту и работать с JSON-ответом прямо в вашей query.
Таким образом, когда у плагина нет интеграции с GraphQL, вы не застреваете — вы запрашиваете его REST API через GraphQL и сохраняете всё в одном месте.
В этой статье показано, как это сделать. Тот же паттерн работает для любого плагина, предоставляющего REST-эндпоинты.
Предварительные требования
- Убедитесь, что расширение HTTP Client установлено (входит в расширения Power и бандлы Gato GraphQL).
- Настройте разрешённые URL, чтобы REST-база плагина была разрешена. Для запросов к тому же сайту разрешите URL вашего сайта (например,
#https://yoursite.com/wp-json/.*#или вашу точную REST-базу). Смотрите настройку разрешённых URL для HTTP-запросов.
Если API плагина требует авторизации, вам нужно создать токен авторизации и передать его в запросе (например, через заголовки).
Пример: Получение данных о записях на приём
BookingPress — это плагин для записи на приём, который предлагает REST API эндпоинты для получения данных о записях. Поэтому мы можем вызывать эти эндпоинты из GraphQL и получать данные о записях.
Ознакомившись с документацией REST API BookingPress, мы видим, что текущая база эндпоинта — wp-json/bookingpress/v1.
1. Список записей (коллекция)
Используйте _sendJSONObjectCollectionHTTPRequest, когда API возвращает список элементов (например, массив записей). Если API оборачивает список в объект (например, { "data": [ ... ] }), возможно, вам потребуется использовать _sendJSONObjectItemHTTPRequest, а затем прочитать свойство data из результата.
Постройте URL из URL главной страницы вашего сайта с помощью optionValue(name: "home"), чтобы одна и та же query работала в любой среде:
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
}
]
}
}
)
}Определите BOOKINGPRESS_API_KEY в вашем окружении (например, в wp-config.php). Query читает его через поле _env расширения Константы PHP и переменные среды, а затем удаляет (@remove) из ответа.
// В wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. Единственная запись по ID
Для одной записи используйте _sendJSONObjectItemHTTPRequest и постройте URL с 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. Извлечение данных из ответа
Вы можете извлечь из ответа нужные вам конкретные свойства и использовать их в своей query.
Используйте _underJSONObjectProperty для навигации к свойству из объекта ответа, и @export для извлечения значения и его доступности в 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") {
{
# Сделать что-то с данными записи
appointmentId: _echo(value: $appointmentId)
selectedDate: _echo(value: $selectedDate)
startTime: _echo(value: $startTime)
serviceId: _echo(value: $serviceId)
customerId: _echo(value: $customerId)
}Тот же паттерн для других плагинов
Для любого плагина, предоставляющего REST-эндпоинты:
- Найдите базовый URL и путь (например, в документации REST/API плагина).
- Добавьте этот URL (или регулярное выражение для него) в список разрешённых HTTP Client.
- Если API требует аутентификации, используйте
options.headers(илиoptions.authдля базовой аутентификации) вinputполя_send*. - Используйте
_sendJSONObjectItemHTTPRequestдля единственного ресурса и_sendJSONObjectCollectionHTTPRequestдля списка. - Извлеките из ответа нужные вам конкретные свойства и используйте их в своей query.
Вы можете комбинировать эти поля на основе REST с нативными типами GraphQL (записи, пользователи и т.д.) в одной query, чтобы клиент получал единственный ответ, объединяющий данные ядра WordPress и данные плагина из его REST API.
Для получения дополнительных примеров вызовов REST и обработки ответов смотрите документацию расширения HTTP Client и обучающий материал по получению данных из внешнего API.