🔌 WordPressプラグインのREST APIデータにアクセスする
多くのWordPressプラグインはREST APIを通じてデータを公開していますが、GraphQLレイヤーは提供していません。Gato GraphQLを使えば、そのデータを1つのGraphQLリクエストで利用できます。HTTP Client拡張機能を使えば、任意のRESTエンドポイントを呼び出し、JSONレスポンスをクエリ内で直接扱うことができます。
プラグインにGraphQL統合がない場合でも、行き詰まることはありません。GraphQLからそのREST APIをクエリして、すべてを1か所にまとめることができます。
この記事では、その方法を説明します。同じパターンはRESTエンドポイントを公開するあらゆるプラグインに適用できます。
前提条件
- HTTP Client拡張機能がインストールされていることを確認してください(Gato GraphQL Powerエクステンションおよびバンドルに含まれています)。
- プラグインのRESTベースが許可されるよう許可URLを設定してください。同一サイトへのリクエストの場合は、サイトURLを許可してください(例:
#https://yoursite.com/wp-json/.*#またはRESTベースの正確なURL)。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 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 内)。クエリはPHPコンスタントと環境変数 via Schema拡張機能の _env フィールドを通じてそれを読み取り、レスポンスから @remove で削除します。
// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. IDによる単一予約の取得
1件の予約を取得する場合は、_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. レスポンスからのデータ抽出
レスポンスから必要な特定のプロパティを抽出して、クエリ内で使用できます。
_underJSONObjectProperty を使ってレスポンスオブジェクトからプロパティにアクセスし、@export を使って値を抽出してクエリ内で利用可能にします。
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を使用します。 - レスポンスから必要な特定のプロパティを抽出してクエリ内で使用します。
これらのREST連携フィールドをネイティブのGraphQLタイプ(投稿、ユーザーなど)と1つのクエリ内で組み合わせることができ、クライアントはWordPressコアデータとプラグインのREST APIからのデータが混在した単一のレスポンスを受け取ることができます。
RESTの呼び出しとレスポンスの処理に関するさらなる例については、HTTP Client拡張機能のドキュメントと外部APIからのデータ取得チュートリアルを参照してください。