APIでのコーディング
APIでのコーディングエディターのブロックにデータを提供する

エディターのブロックにデータを提供する

WordPressエディターのコンテンツは(Gutenberg)ブロックで作成され、ブロックはAPIを通じてサーバーからデータを取得します。WordPressコアはWP REST APIを使用しますが、Gato GraphQLを使って独自のブロックを動かすこともできます。

ブロックがGraphQLサーバーからデータを取得する方法を見ていきましょう。

エンドポイント

ブロックはWordPressエディターのコンテキスト内で使用されるため、ユーザーはすでにログイン済みです。そのため、公開エンドポイントではなく、内部GraphQLエンドポイント(wp-admin内でのみアクセス可能)に接続できます。

この内部 blockEditor エンドポイントは以下のURLでアクセスできます:

https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditor

このエンドポイントは事前定義された設定を持ちます(つまり、プラグインのユーザー設定は適用されません)。そのため、動作が一貫しています。

便利なことに、エンドポイントURLを含むJavaScriptグローバル変数 GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT を参照することもできます。

独自の内部エンドポイントを作成することで、ブロックに必要な特定の設定を事前定義することもできます(ネストされたミューテーションの有効化、ネームスペースの有効化、クエリ可能なCPTの定義、スキーマ設定で利用可能なその他の設定など)。

あるいは、パーシステッドクエリを作成してエンドポイントの代わりにデータを取得することもできます。クライアントコードをどのように適応させるかをご確認ください。

fetch を使用した接続

標準の fetch メソッドを使ってサーバーに接続できます。

以下のJavaScriptコードは、変数付きのクエリをGraphQLサーバーに送信し、レスポンスをコンソールに出力します。

(async function () {
  const limit = 3;
  const data = {
    query: `
      query GetPostsWithAuthor($limit: Int) {
        posts(pagination: { limit: $limit }) {
          id
          title
          author {
            id
            name
          }
        }
      }
    `,
    variables: {
      limit: `${ limit }`
    },
  };
 
  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));
  }
})();

RESTのnonceヘッダーを送信する

RESTのnonceを含む操作を実行する必要がある場合は、X-WP-Nonce ヘッダーを追加してください。

PHPコードを通じて、nonceを含むJS変数を出力します:

// Generate HTML in the editor:
// <script type="text/javascript">var WP_REST_NONCE = "{ Nonce value }"</script>
add_action(
  'admin_print_scripts',
  function(): void {
    printf(
      '<script type="text/javascript">var %s = "%s"</script>',
      'WP_REST_NONCE',
      wp_create_nonce('wp_rest')
    );
  }
);

次に、fetch のヘッダーにnonce値を含めます:

// ...
  headers: {
    'X-WP-Nonce': `${ WP_REST_NONCE }`,
    // ...
  };

GraphQLクライアントライブラリを使用した接続

お好みのGraphQLクライアントライブラリを使用してサーバーに接続することもできます。いくつかの選択肢を示します:

以下はGraphQL requestを使用した例です:

/* eslint-disable */
 
const { request, gql } = require(`graphql-request`)
 
main()
 
async function main() {
  const query = gql`
    query {
      posts {
        id
        title
        author {
          id
          name
        }
      }
    }
  `
 
  const data = await request(GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT, query)
  console.log(data)
}

Gato GraphQL プラグイン自体も graphql-request ライブラリを使用してGraphQL経由でブロックを動かしています。

「Schema Configuration」ブロックのソースコードと、そのデータストアをご覧ください。