🔌 从 WordPress 插件访问 REST API 数据
许多 WordPress 插件通过 REST API 公开数据,但不提供 GraphQL 层。使用 Gato GraphQL,您仍可以在单个 GraphQL 请求中使用这些数据:HTTP Client 扩展允许您调用任何 REST 端点,并在 Query 中直接处理 JSON 响应。
因此,当一个插件没有 GraphQL 集成时,您不会陷入困境——您可以从 GraphQL 查询其 REST API,并将所有内容集中在一处。
本文将展示如何做到这一点。同样的模式适用于任何公开 REST 端点的插件。
前提条件
- 确保已安装 HTTP Client 扩展(包含在 Gato GraphQL Power 扩展和套件中)。
- 配置允许的 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 端点的插件:
- 找到基础 URL 和路径(例如从插件的 REST/API 文档中)。
- 将该 URL(或其正则表达式)添加到 HTTP Client 的允许列表中。
- 如果 API 需要身份验证,在传给
_send*字段的input中使用options.headers(或基本身份验证使用options.auth)。 - 对单个资源使用
_sendJSONObjectItemHTTPRequest,对列表使用_sendJSONObjectCollectionHTTPRequest。 - 从响应中提取所需的特定属性,并在 Query 中使用它们。
您可以在一个 Query 中将这些 REST 支持的字段与原生 GraphQL 类型(文章、用户等)结合使用,让客户端获得一个混合了 WordPress 核心数据和插件 REST API 数据的单一响应。
更多调用 REST 和处理响应的示例,请参阅 HTTP Client 扩展文档 以及从外部 API 获取数据教程。