WordPress向けGraphQLサーバー

Gato GraphQL vs WPGraphQL

Gato GraphQLとWPGraphQLの比較

Gato GraphQL vs WPGraphQL
plus image
Gato GraphQL vs WPGraphQL

ヘッドレスWordPressサイトを構築して静的にデプロイするだけであれば、現在WPGraphQLを使用していても、Gato GraphQLに切り替えても大きな違いはありません。

それ以外の場合、Gato GraphQLへの切り替えには多くの利点があります。以下は、Gato GraphQL+全拡張機能が提供する機能で、WPGraphQLでは利用できないものです。

比較表

機能Gato GraphQLWPGraphQL
N+1クエリ問題アーキテクチャ設計により問題が発生しない適切に処理しないと問題になる可能性があり、開発者の注意が必要
セキュリティ:エンドポイントの無効化persisted queriesでシングルエンドポイントを完全に無効化可能(PRO)未提供
アクセス制御UIによるロール/capability/IPを使ったフィールド単位の検証(PRO)フィールドレベルではなく、粒度が低い
キャッシュ制御クエリのmax-ageを自動計算(PRO)自動キャッシュ制御なし
カスタムエンドポイントパスワード保護/カスタマイズ可能な複数エンドポイント、エンドポイント階層をサポート(PRO)シングルエンドポイント、カスタマイズ制限あり
一括更新・検索/置換GraphQL経由での一括削除、タグ付け、置換(regex対応)(PRO)未提供
カスタム/実験的GraphQL機能ネストされたmutation、スキーマのnamespacing、oneOf input objectほぼ標準GraphQL仕様に準拠
Multiple Query Execution(コンポーザビリティ)1つのドキュメントで複数クエリを実行、@exportで状態を共有クエリのバッチ処理(1リクエストに複数)、ただし状態の共有は不可
内部/プライベートエンドポイントバックエンド/PHPのみのプライベートエンドポイント、ユーザーには非公開(PRO)利用不可
リッチなデータmutation1つのドキュメントでデータの取得・変更・保存が可能(PRO)未対応
コンテンツの同期と配信GraphQL、RSS、CSV、REST APIによるインポート/エクスポート(PRO)未提供
Webサービス連携アウトバウンド/インバウンドAPI呼び出しとwebhook(PRO)未対応
自動化(フック/ワークフロー)GraphQLをワークフロー自動化として活用(PRO/UIエディタ)利用不可
使いやすさ(UI統合)GraphQLクエリの構築・管理のための豊富なUI機能より基本的な管理UI
バッチ処理/コンポーザビリティフィールド/ディレクティブの合成、再利用可能なリゾルバロジック(PRO)未対応
Multiple Query Execution対応、状態共有と依存関係あり対応、状態共有なし
標準ヘッドレス/静的利用両方とも同等の機能を持つ両方とも同等の機能を持つ

ラベル:

  • (PRO):Gato GraphQLの有料/プロバージョン/拡張機能が必要な機能を示します。

主なポイントの概要:

  • Gato GraphQLは高度な開発、自動化、セキュリティのための重要な追加機能を提供します
  • 両プラグインは基本的な静的/ヘッドレスWordPressインストールに対して同等です
  • Gato GraphQLの高度な機能は以下に焦点を当てています:
    • きめ細かな制御
    • ワークフローの自動化
    • リッチな統合機能
    • 最新のGraphQL実験的機能

開発のしやすさ

開発者は「n+1」クエリ問題を心配する必要はありません。GraphQLサーバーのアーキテクチャ設計により、そもそも問題が発生しません

セキュリティ

persisted queriesを使って事前定義済みのデータを公開する場合、GraphQLのシングルエンドポイントを完全に無効化し、認証済みユーザーでもアクセスできないようにすることができます。

Persisted queryエディタ
Persisted queryエディタ

アクセス制御

ログイン済みユーザー、特定のロールやcapabilityを持つユーザー、または特定のIP範囲からの訪問者のみがデータにアクセスできるよう、フィールド単位で検証することができます(PRO)。

アクセス制御リストエディタ
アクセス制御リストエディタ

キャッシュ制御

標準のHTTPキャッシングを使ってGraphQLレスポンスをキャッシュする場合、GraphQLクエリに含まれるすべてのフィールドをもとにmax-ageヘッダーが自動的に計算されます(PRO)。

キャッシュ制御リストエディタ

エンドポイントのカスタマイズと管理

特定の顧客やアプリケーション向けにカスタマイズした複数のカスタムエンドポイントを提供し、パスワードで保護することができます。

さらに、カスタムカテゴリを追加したり、階層構造を持たせることもできます(例:/graphql/customers/some-customer/graphql/customers/another-customer)。

パスワード保護されたカスタムエンドポイント
パスワード保護されたカスタムエンドポイント

一括更新

更新を一括で実行できます。たとえば、サイト上のすべてのコメントを削除したり、すべての投稿にタグやカテゴリを割り当てたりすることができます。

また、数百の投稿にわたって文字列を検索・置換することも可能です。たとえば、古いドメインを新しいドメインに置換することや、regexを使った置換も行えます(PRO)。

カスタムGraphQL機能

仕様として提案されているが未リリースの新しいGraphQL機能にアクセスできます。ネストされたmutationスキーマのnamespacing、および'oneOf' Input Objectが含まれます。

名前空間付きインタラクティブスキーマ
名前空間付きインタラクティブスキーマ

Multiple Query Execution

WPGraphQLはクエリのバッチ処理を許可しており、1つのHTTPリクエスト内で複数のGraphQLクエリを解決できます。

Gato GraphQLはMultiple Query Executionを提供しており、1つのGraphQLドキュメントで複数のオペレーションを実行できます。

Multiple Query Executionクエリのバッチ処理の改善版であり、@exportディレクティブを通じてオペレーション間で状態を共有できます。

たとえば、投稿を複製するには、queryオペレーションで投稿データを取得し、そのデータをmutationオペレーションに渡して新しい投稿を作成します:

query GetPostAndExportData($postId: ID!)
{
  post(by: { id: $postId }, status: any) {
    author {
      id @export(as: "authorID")
    }
    categories {
      id @export(as: "categoryIDs", type: LIST)
    }
    rawContent @export(as: "rawContent")
    rawExcerpt @export(as: "excerpt")
    featuredImage {
      id @export(as: "featuredImageID")
    }
    tags {
      id @export(as: "tagIDs", type: LIST)
    }
    rawTitle @export(as: "title")
  }
}
 
mutation DuplicatePost
  @depends(on: "GetPostAndExportData")
{
  createPost(input: {
    status: draft,
    authorBy: {
      id: $authorID
    },
    categoriesBy: {
      ids: $categoryIDs
    },
    contentAs: {
      html: $rawContent
    },
    excerpt: $excerpt
    featuredImageBy: {
      id: $featuredImageID
    },
    tagsBy: {
      ids: $tagIDs
    },
    title: $title
  }) {
    postID
  }
}

コンポーザビリティ

フィールドを合成する機能を利用できます。あるフィールドの値を同じクエリ内の別のフィールドへの入力として提供でき、基本的なフィールドリゾルバのセットで無限のユースケースに対応できます(PRO)。

たとえば、Post.hasExcerptフィールドを新たに作成する代わりに、Post.excerpt_notEmptyフィールドを適用して同じ値を生成できます:

query {
  post(by: { id: 1 }) {
    excerpt 
    hasExcerpt: _notEmpty(value: $__excerpt)
  }
}

同様に、ディレクティブを合成することもでき、ディレクティブをフィールドの値の内部プロパティに適用することができます。

たとえば、次のクエリは投稿のカテゴリ名を別の言語に翻訳します:

query {
  post(by: { id: 1 }) {
    title
    categoryNames
    frenchCategoryNames: categoryNames
      @underEachArrayItem
        @strTranslate(
          from: "en",
          to: "fr"
        )
  }
}

GraphQLサーバーの可用性

Gutenbergブロックを動かすためのプライベートエンドポイントを公開できます。また、公開向けエンドポイントを一切公開せずに、PHPコードを使ってアプリケーションのデータを取得するためのプライベートGraphQLサーバーにアクセスできます(PRO)。

データmutationの汎用性

GraphQLを使って、サイトのコンテンツを取得・変更・再保存するすべての操作を1つのGraphQLドキュメント内で実行できます(PRO)。

たとえば、投稿内のすべてのGutenbergブロックを取得し、プロパティを抽出し、Google Translate APIでそれらの文字列を翻訳し、文字列をブロックに戻し、投稿を再保存することができます。

コンテンツの同期と配信

GraphQLを使って、別のWordPressサイトから投稿をインポートするRSSフィードからインポートするCSVからインポートする、またはREST APIやGraphQL APIからインポートすることができます(PRO)。

別のWordPressサイトにコンテンツをエクスポートし、JSONやCSVとして保存することもできます(PRO)。

Webサービス連携

HTTPクライアントを使って任意の外部サービスのAPIを呼び出せます(PRO)。たとえば、WordPressユーザーをMailchimpのメーリングリストに登録することができます。

また、専用のwebhookを通じて任意のサービスからの受信データを受け取り処理することもできます(PRO)。たとえば、InstaWPサンドボックスサイトに登録されたニュースレターのメールアドレスを取得し、自動的にMailchimpに送信することができます。

自動化

GraphQLを使ってタスクやコンテンツワークフローを自動化できます(PRO)。

たとえば、新しい投稿が作成されたとき(フックdraft_postのイベント経由)、投稿にサムネイルがないかどうかを確認するpersisted queryを実行し、ない場合はStable Diffusion APIを呼び出して画像を生成し、TinyPngで圧縮して、最終的にその画像を投稿のアイキャッチ画像として設定することができます。

自動化ルールエディタ
自動化ルールエディタ

使いやすさ

これらすべての追加ユースケースは、PHPコードをデプロイすることなく、ユーザーインターフェースでGraphQLクエリを入力することで、wp-admin内から直接実現できます。

ニュースレターを購読する

Gato GraphQL のすべてのアップデートを把握しましょう。