🎯 おめでとうございます:あなたのWordPressプラグインが「コア」機能になりました
WP REST APIはすでにWordPressコアに含まれているため、GraphQLを避けてRESTAPIを使ってWordPressプラグインやGutenbergブロックにデータを供給するようアドバイスすることが多くありました。
しかし、それはもう過去の話です。WordPress 6.5がリリースされました。その中には、画期的な新機能「Plugin Dependencies」が含まれています。
Plugin Dependenciesを使えば、プラグインディレクトリに公開されているWordPressプラグインを自分のプラグインの依存関係として定義でき、WordPressはそのプラグインをインストールする直前に依存プラグインを自動的にインストールしてくれます。
その結果、ディレクトリ内のすべてのプラグインは事実上「コア」機能となります。他のプラグインから必要とされた際に暗黙的にインストールされるからです。
WooCommerceのアドオンがWooCommerceへの依存を宣言するような、明白かつ実際には必要性の低いケースもあります(サイトオーナーはすでにWooCommerceを使っているでしょうから)。
しかし、必要なプラグインが他のプラグインに「ツール」を提供する場合、つまりサイトオーナーがそのプラグインを事前にインストールしていることを期待できない(あるいは存在すら知らない)ような場合には、その効果は非常に大きくなります。
GraphQLとGato GraphQLはまさにそのケースです。
GraphQLがWordPressの「コア」機能になる
GraphQLは、WordPressサイトのあらゆるデータを取得・変更・保存するためのインターフェースです。データとやり取りする必要のあるプラグイン(実質的にほぼすべてのプラグイン)は、GraphQLを活用してそのニーズを満たすことができます。
GraphQLは「ツール」であり、Gato GraphQLはそのツールプロバイダーです。
プラグインでGato GraphQLへの依存を宣言することで、GraphQLサーバーがプラグイン自身のために即座に利用可能になります。
たとえば、GraphQLを使ってプラグインのGutenbergブロックにデータをフェッチすることができ、RESTコントローラーを作成・維持するコストを省けます。
プラグイン開発者がGraphQLをWP REST APIの現実的な代替手段として検討できる時代がついに到来しました。
プラグインの依存関係は問題になりえないか?
依存関係としてインストールされたプラグインはwp-adminに表示されるため、何も知らないサイトオーナーは「これはどこから来たの?ハッキングされた?スパム?一体何が起きているの?」と当然疑問に思うかもしれません。
サイトオーナーが不満を抱けば、それは深刻な問題です。どんなプラグインもユーザーを敵に回すことはできません(少なくとも、状況を理解して解決策を歓迎するまでは)。
この状況は改善できますし、完全に回避することも可能です。たとえば、Gato GraphQLを依存プラグインとして考えた場合、Gato GraphQLにはLiteバージョンのプラグインを提供することも考えられます。これはUI上に表示されることなく、内部利用専用のGraphQLサーバーをインストールするだけのシンプルなものです(TODOリストにまた一つ追加です!🤷🏻♂️)。
Gato GraphQL(および他のプラグイン)にとってより重要な問いは、「新しいサイトのセキュリティが低下しないか?」という点です。
Gato GraphQLに特化して言えば、公開GraphQLエンドポイントが任意の訪問者からアクセス可能なデータを露出し、意図せずプライベートなデータが漏洩することはないでしょうか?
答えはNoです。Gato GraphQLはデフォルトで公開シングルエンドポイントを有効にしていないため、セキュリティリスクを心配せずにインストールできます。
Gato GraphQLをプラグインの依存関係として追加する
さあ、実際に手を動かして、この素晴らしい新機能を試してみましょう。
プラグインでGraphQLを使用するには、プラグインヘッダーでgatographqlをプラグインの依存関係として宣言する必要があります。
/**
* Plugin Name: Blocks for cooking recipes
* Requires Plugins: gatographql
*/これにより、プラグインは内部blockEditorエンドポイントを通じてデータにアクセスできます。このエンドポイントはwp-admin内のJavaScript定数GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINTとして利用でき、以下のURLを指します。
https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditorたとえば、ブロックは次のようなJavaScriptコードを使ってデータを取得できます。
(async function () {
const data = {
query: `
query GetCookingRecipeBlockData($limit: Int) {
posts(pagination: { limit: $limit }) {
id
title
author {
id
name
}
}
}
`,
variables: {
limit: 3
},
};
const response = await fetch(
GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT,
{
method: 'post',
body: JSON.stringify(data),
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'Content-Length': data.length,
},
credentials: 'include',
}
);
/**
* Execute the query, and await the response
*/
const json = await response.json();
/**
* Check if the query produced errors, otherwise use the results
*/
if (json.errors) {
console.log(JSON.stringify(json.errors));
} else {
console.log(JSON.stringify(json.data));
}
})();GraphQLクエリでネストされたmutationsを使用したい場合は、プラグイン専用の内部エンドポイントを作成し、それに応じて設定することもできます。