博客

🔌 从 WordPress 插件访问 REST API 数据

Leonardo Losoviz
作者:Leonardo Losoviz ·

许多 WordPress 插件通过 REST API 公开数据,但不提供 GraphQL 层。使用 Gato GraphQL,您仍可以在单个 GraphQL 请求中使用这些数据:HTTP Client 扩展允许您调用任何 REST 端点,并在 Query 中直接处理 JSON 响应。

因此,当一个插件没有 GraphQL 集成时,您不会陷入困境——您可以从 GraphQL 查询其 REST API,并将所有内容集中在一处。

本文将展示如何做到这一点。同样的模式适用于任何公开 REST 端点的插件。

前提条件

  1. 确保已安装 HTTP Client 扩展(包含在 Gato GraphQL Power 扩展和套件中)。
  2. 配置允许的 URL,以便允许插件的 REST 基础路径。对于同站请求,允许您的站点 URL(例如:#https://yoursite.com/wp-json/.*# 或您的确切 REST 基础路径)。请参阅配置可进行 HTTP 请求的 URL

如果插件的 API 需要授权,您需要创建授权令牌并在请求中传递它(例如通过请求头)。

示例:获取预约数据

BookingPress 是一个提供 REST API 端点以获取预约数据的预约管理插件。因此,我们可以从 GraphQL 调用这些端点来获取预约数据。

查阅 BookingPress REST API 文档,我们可以看到当前的端点基础路径为 wp-json/bookingpress/v1

1. 获取预约列表(集合)

当 API 返回列表(例如预约数组)时,使用 _sendJSONObjectCollectionHTTPRequest。如果 API 将列表包装在对象中(例如 { "data": [ ... ] }),您可能需要使用 _sendJSONObjectItemHTTPRequest,然后从结果中读取 data 属性。

使用 optionValue(name: "home") 从站点的主页 URL 构建 URL,使同一 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 通过 PHP 常量和环境变量 via Schema 扩展的 _env 字段读取它,然后用 @remove 将其从响应中移除。

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

2. 按 ID 获取单条预约

获取单条预约时,使用 _sendJSONObjectItemHTTPRequest 并用 ID 构建 URL:

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") {
{
  # Do something with the appointment data
  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 需要身份验证,在传给 _send* 字段的 input 中使用 options.headers(或基本身份验证使用 options.auth)。
  4. 对单个资源使用 _sendJSONObjectItemHTTPRequest,对列表使用 _sendJSONObjectCollectionHTTPRequest
  5. 从响应中提取所需的特定属性,并在 Query 中使用它们。

您可以在一个 Query 中将这些 REST 支持的字段与原生 GraphQL 类型(文章、用户等)结合使用,让客户端获得一个混合了 WordPress 核心数据和插件 REST API 数据的单一响应。

更多调用 REST 和处理响应的示例,请参阅 HTTP Client 扩展文档 以及从外部 API 获取数据教程。


订阅我们的新闻通讯

及时了解 Gato GraphQL 的所有更新。