SITECORE MANIA 開発者向け技術ブログ

XM Cloud

菅野

菅野

XMCloudで実際に使用したGraphQLの紹介

今回は、実案件の Sitecore XM Cloud で実際に使用した GraphQL クエリを題材に、XM Cloud における GraphQL の使い方を紹介します。
本記事の後半では、Authoring and Management API を利用したコンテンツの作成・更新・取得・削除といった操作を中心に解説します。

GraphQLについて

GraphQL は、API のために作られたされたクエリ言語です。
クライアントが必要なデータ構造を明示的に指定できる点が特徴で、REST API と比較して柔軟かつ効率的なデータ取得が可能です。(1)

Sitecore XM Cloudで使用したAPI

Sitecore XM Cloud は、フロントエンドとバックエンドを分離したヘッドレスアーキテクチャ(2)を採用しています。
この構成において、フロントエンドと XM Cloud を接続する手段としてGraphQL API が提供されています。

XM Cloud では、用途に応じて以下の GraphQL API を使い分けます。

Authoring and Management API

  • コンテンツの取得だけでなく、作成・更新・削除が可能です。
  • 管理画面を拡張するカスタム UI やツールの実装に利用されます。

Experience Edge for XM APIs

  • 公開済みコンテンツの取得に特化した Read-only APIを使用しています。
  • 本番サイトのフロントエンドから利用されることが多いです。

Sitecore XM CloudでGraphQLを使うメリット

XM Cloudのコンテンツ配信層である Experience Edge(3) は、ヘッドレス配信を前提とした GraphQL ベースの参照専用(Read-only)API として構築されています。

Experience Edgeによる高速・安定した配信

Experience Edge は、ヘッドレス配信を前提としたGraphQL ベースの参照専用 API です。

  • 公開コンテンツは CDN にキャッシュされ、高速に配信されます。
  • 高負荷アクセスを想定した設計のため、安定したパフォーマンスを維持できます。

最適化されたデータ取得

GraphQL では、取得したいフィールドを明示的に指定できます。

  • 不要なフィールドを取得しないため、通信量を削減できます。
  • 複雑なページ構成でも、1 回のリクエストで必要なデータを取得できます。

開発者体験の向上

  • GraphQL Playground(4)を使って、ブラウザ上でクエリを試行できます。
  • ローカル・検証・本番で共通のスキーマを利用でき、環境差分による問題を防ぎやすくなります。     

一貫したAPI設計

配信系・管理系の両方で GraphQL を採用しており、実装や保守の一貫性が高まります。

サンプル紹介

今回は、Authoring and Management APIの新規作成、更新、削除、取得のコードのサンプルコードを紹介したいと思います。

新規作成クエリ

以下のように作成するアイテム名、使用するテンプレートID、作成対象となる親アイテムのID、作成言語し、各フィールドの値を指定します。

# カスタムフィールドすべてに値を入れてアイテムを作成するクエリ
mutation {
  createItem(
    input: {
      # 作成するアイテム名、使用するテンプレートID、作成対象となる親アイテムのID、作成言語
      name: "TestCreate"
      templateId: "{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}"
      parent: "{CEA1631E-5FBC-4F0A-8655-ABE9F1D5EA4D}"
      language: "en"

      # 各フィールドの値
      fields: [
        { name: "Title", value: "TitleTestCreate" }
        { name: "Checkbox", value: "1" }
        { name: "Date", value: "20250715T000000Z" }
        { name: "Datetime", value: "20250714T013000Z" }
        { name: "Multi-Line", value: "testMulti" }
        { name: "Rich", value: "teastRich" }
        { name: "Single-Line", value: "testSingle" }
        {
          name: "CheckList"
          value: "{D1D16DB6-5BB3-4C80-86DD-29CAD071ACAE}|{34AC799A-75C6-442D-BF90-8F3202D70551}"
        }
        { name: "Droplist", value: "ID View" }
        {
          name: "Grouped Droplink"
          value: "{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}"
        }
        { name: "Grouped Droplist", value: "Home" }
        {
          name: "Treelist"
          value: "{9811DC81-9410-4251-B66D-C5340867DAED}"
        }
        {
          name: "Droplink"
          value: "{D1D16DB6-5BB3-4C80-86DD-29CAD071ACAE}"
        }
        {
          name: "Droptree"
          value: "{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}"
        }
        {
          name: "General Link"
          value: ""
        }
        { name: "Datasource", value: "/sitecore/layout/Renderings" }
        { name: "Number", value: "1" }
        { name: "Integer", value: "6" }
      ]
    }
  ) {
    # 戻り値
    item {
      itemId
      name
      path

      # Standard Fields を除外
      fields(excludeStandardFields: true) {
        nodes {
          name
          value
        }
      }
    }
  }
}

更新クエリ

以下のように更新するアイテムのパスを指定し、更新するフィールドと値 の指定をします。

# カスタムフィールドを一括更新するクエリ
mutation {
  updateItem(
    # 更新するアイテムパス、更新するフィールドと値
    input: {
      path: "/sitecore/content/Home/Test/tes5"
      fields: [
        {
          name: "Checkbox"
          value: "1"
        }
        {
          name: "Date"
          value: "20250715T000000Z"
        }
        {
          name: "Datetime"
          value: "20250714T013000Z"
        }
        {
          name: "Multi-Line"
          value: "testMulti"
        }
        {
          name: "Rich"
          value: "teastRich"
        }
        {
          name: "Single-Line"
          value: "testSingle"
        }
        {
          name: "CheckList"
          value: "{D1D16DB6-5BB3-4C80-86DD-29CAD071ACAE}|{34AC799A-75C6-442D-BF90-8F3202D70551}"
        }
        {
          name: "Droplist"
          value: "ID View"
        }
        {
          name: "Grouped Droplink"
          value: "{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}"
        }
        {
          name: "Grouped Droplist"
          value: "Home"
        }
        {
          name: "Treelist"
          value: "{9811DC81-9410-4251-B66D-C5340867DAED}"
        }
        {
          name: "Droplink"
          value: "{D1D16DB6-5BB3-4C80-86DD-29CAD071ACAE}"
        }
        {
          name: "Droptree"
          value: "{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}"
        }
        {
          name: "Datasource"
          value: "/sitecore/layout/Renderings"
        }
        {
          name: "Number"
          value: "2"
        }
        {
          name: "Integer"
          value: "3"
        }
      ]
    }
  ) {
    item {
      # 戻り値
      name
      path

      # Standard Fields を除外
      fields(excludeStandardFields: true) {
        nodes {
          name
          value
        }
      }
    }
  }
}

検索クエリ

以下のように検索対象のフィールド値を指定し、検索条件の指定を行います。

# 特定のパス配下に存在し、かつアイテム名が指定された値のものを検索
query {
  search(
    query: {
      searchStatement: {
        operator: MUST
        # MUST [ SHOULD, SHOULD ] でいずれか必須(Or)     
        criteria: [
          # api key
          { operator: SHOULD, criteriaType: SEARCH, field: "_path", value: "59b41b5fe22e460b941efb64fe8da8fc" },
          # rendering hosts
          { operator: SHOULD, criteriaType: SEARCH, field: "_path", value: "895e25c412b24b2c823382f3b79eef53" },
        ]
        # MUST { MUST } でどちらも必須(And)
        subStatements: {
          operator: MUST
          # MUST [ SHOULD, SHOULD ] { MUST [ SHOULD, SHOULD ] } なので
          # _path がいずれかを含む、かつ _name がいずれかに一致
          criteria: [
              { operator: SHOULD, criteriaType: EXACT, field: "_name", value: "Default" },
              { operator: SHOULD, criteriaType: EXACT, field: "_name", value: "Rendering Hosts" },
          ]
        }
      }
    }
  ) {
    # 戻り値
    totalCount
    results {
      path
      name
    }
  }
}

削除クエリ

以下のように、削除対象のアイテムパスを指定します。

mutation{
  deleteItem(
    input:{
      path: "/sitecore/content/Home/Test/TestCreate"
    }
  ){
     successful
  }
}

本記事では、Sitecore XM Cloud で使用されるGraphQLと Authoring and Management API を利用したGraphQL クエリの実例を紹介しました。

本記事が、XM Cloud で GraphQL を利用する際の参考になれば幸いです。
最後まで読んでいただき、ありがとうございました。

参考文献

(1)GraphQLについて
(2)ヘッドレスについて
(3)Experience Edgeについて
(4)公式の GraphQL Playground 使い方

※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス