Блог

🔌 Доступ к данным REST API из плагинов WordPress

Leonardo Losoviz
Автор: Leonardo Losoviz ·

Многие плагины WordPress предоставляют данные через REST API, но не предоставляют слой GraphQL. С Gato GraphQL вы всё равно можете использовать эти данные в одном GraphQL-запросе: расширение HTTP Client позволяет обращаться к любому REST-эндпоинту и работать с JSON-ответом прямо в вашей query.

Таким образом, когда у плагина нет интеграции с GraphQL, вы не застреваете — вы запрашиваете его REST API через GraphQL и сохраняете всё в одном месте.

В этой статье показано, как это сделать. Тот же паттерн работает для любого плагина, предоставляющего REST-эндпоинты.

Предварительные требования

  1. Убедитесь, что расширение HTTP Client установлено (входит в расширения Power и бандлы Gato GraphQL).
  2. Настройте разрешённые 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-эндпоинты:

  1. Найдите базовый URL и путь (например, в документации REST/API плагина).
  2. Добавьте этот URL (или регулярное выражение для него) в список разрешённых HTTP Client.
  3. Если API требует аутентификации, используйте options.headers (или options.auth для базовой аутентификации) в input поля _send*.
  4. Используйте _sendJSONObjectItemHTTPRequest для единственного ресурса и _sendJSONObjectCollectionHTTPRequest для списка.
  5. Извлеките из ответа нужные вам конкретные свойства и используйте их в своей query.

Вы можете комбинировать эти поля на основе REST с нативными типами GraphQL (записи, пользователи и т.д.) в одной query, чтобы клиент получал единственный ответ, объединяющий данные ядра WordPress и данные плагина из его REST API.

Для получения дополнительных примеров вызовов REST и обработки ответов смотрите документацию расширения HTTP Client и обучающий материал по получению данных из внешнего API.


Подпишитесь на нашу рассылку

Будьте в курсе всех обновлений Gato GraphQL.