🔌 Truy cập dữ liệu REST API từ các plugin WordPress
Nhiều plugin WordPress công khai dữ liệu qua REST API nhưng không cung cấp lớp GraphQL. Với Gato GraphQL, bạn vẫn có thể sử dụng dữ liệu đó trong một yêu cầu GraphQL duy nhất: tiện ích mở rộng HTTP Client cho phép bạn gọi bất kỳ endpoint REST nào và làm việc với phản hồi JSON trực tiếp trong query của mình.
Vì vậy, khi một plugin không có tích hợp GraphQL, bạn không bị bế tắc — bạn truy vấn REST API của nó từ GraphQL và giữ mọi thứ ở một nơi duy nhất.
Bài viết này hướng dẫn cách thực hiện điều đó. Cùng một mẫu hoạt động cho bất kỳ plugin nào công khai các endpoint REST.
Điều kiện tiên quyết
- Đảm bảo tiện ích mở rộng HTTP Client đã được cài đặt (bao gồm trong các tiện ích mở rộng Power và các gói bundle của Gato GraphQL).
- Cấu hình Allowed URLs để cơ sở REST của plugin được cho phép. Đối với các yêu cầu cùng trang, hãy cho phép URL trang web của bạn (ví dụ:
#https://yoursite.com/wp-json/.*#hoặc cơ sở REST chính xác của bạn). Xem cấu hình những URL nào có thể được yêu cầu HTTP.
Nếu API của plugin yêu cầu xác thực, bạn cần tạo token xác thực và truyền nó vào yêu cầu (ví dụ: qua headers).
Ví dụ: Lấy dữ liệu đặt lịch hẹn
BookingPress là một plugin đặt lịch hẹn cung cấp các endpoint REST API để lấy dữ liệu lịch hẹn. Do đó, chúng ta có thể gọi các endpoint đó từ GraphQL và lấy dữ liệu lịch hẹn.
Kiểm tra tài liệu REST API của BookingPress, chúng ta thấy rằng cơ sở endpoint hiện tại là wp-json/bookingpress/v1.
1. Liệt kê các lịch hẹn (collection)
Dùng _sendJSONObjectCollectionHTTPRequest khi API trả về một danh sách các mục (ví dụ: một mảng các lịch hẹn). Nếu API bao bọc danh sách trong một đối tượng (ví dụ: { "data": [ ... ] }), bạn có thể cần dùng _sendJSONObjectItemHTTPRequest rồi đọc thuộc tính data từ kết quả.
Xây dựng URL từ URL trang chủ của trang web bằng optionValue(name: "home") để cùng một query hoạt động trên mọi môi trường:
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
}
]
}
}
)
}Định nghĩa BOOKINGPRESS_API_KEY trong môi trường của bạn (ví dụ: trong wp-config.php). Query đọc nó qua trường _env của tiện ích mở rộng PHP Constants and Environment Variables, sau đó dùng @remove để loại bỏ nó khỏi phản hồi.
// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. Một lịch hẹn theo ID
Để lấy một lịch hẹn, dùng _sendJSONObjectItemHTTPRequest và xây dựng URL với 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. Trích xuất dữ liệu từ phản hồi
Bạn có thể trích xuất các thuộc tính cụ thể cần thiết từ phản hồi và sử dụng chúng trong query của mình.
Dùng _underJSONObjectProperty để điều hướng đến thuộc tính từ đối tượng phản hồi, và @export để trích xuất giá trị và làm cho nó có sẵn trong 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") {
{
# Thực hiện gì đó với dữ liệu lịch hẹn
appointmentId: _echo(value: $appointmentId)
selectedDate: _echo(value: $selectedDate)
startTime: _echo(value: $startTime)
serviceId: _echo(value: $serviceId)
customerId: _echo(value: $customerId)
}Cùng mẫu cho các plugin khác
Đối với bất kỳ plugin nào công khai các endpoint REST:
- Tìm URL cơ sở và đường dẫn (ví dụ: từ tài liệu REST/API của plugin).
- Thêm URL đó (hoặc một biểu thức chính quy cho nó) vào danh sách được phép của HTTP Client.
- Nếu API yêu cầu xác thực, dùng
options.headers(hoặcoptions.authcho xác thực basic) tronginputcủa trường_send*. - Dùng
_sendJSONObjectItemHTTPRequestcho một tài nguyên đơn lẻ và_sendJSONObjectCollectionHTTPRequestcho một danh sách. - Trích xuất các thuộc tính cụ thể cần thiết từ phản hồi và sử dụng chúng trong query của bạn.
Bạn có thể kết hợp các trường được hỗ trợ bởi REST này với các kiểu GraphQL gốc (bài viết, người dùng, v.v.) trong một query duy nhất, để client nhận được một phản hồi duy nhất kết hợp dữ liệu lõi WordPress và dữ liệu plugin từ REST API của chúng.
Để xem thêm ví dụ về việc gọi REST và xử lý phản hồi, hãy xem tài liệu tiện ích mở rộng HTTP Client và hướng dẫn về lấy dữ liệu từ API bên ngoài.