
Shopifyでは、商品やコレクション、顧客、注文などに自由度の高いカスタムデータを持たせることができます。このカスタムデータの格納先となるのがMetafieldsです。基本的な使い方はもちろん、独自のIDを利用して管理精度を上げたり、クエリ条件を駆使して目的のデータを正確に抽出したり、さらにはアプリ単位でメタフィールドを扱う方法も用意されています。この記事では、開発者がそれらの機能を効果的に活用するための実装手順とコード例を紹介します。
なぜShopify Metafieldsが重要なのか
EC運営において、標準フィールドだけでは表現しきれないユニークなデータを管理したいシーンは多々存在します。たとえば、商品の素材情報やカスタムオプション、在庫保管場所の詳細など、独自の属性を付与することで運営管理やユーザーエクスペリエンスを向上させることが可能です。Metafieldsは、こうした柔軟な拡張性を提供する仕組みとして、ビジネスに合わせたさまざまな使い方をサポートしてくれます。
カスタムIDでメタフィールドを管理する
Working with custom IDsでは、デフォルトのID以外に自前のIDを設定する方法が紹介されています。独自IDを付与しておくと、以下のようなメリットを得られます。
- 外部システムとの連携が容易になる
- 一意の識別子として運用しやすい
たとえば複数のショップや外部システム(ERP、CRM、PIMなど)とデータを連携する際、確実に一意となるIDが必要になることがあります。そこで役立つのがカスタムIDです。この機能を使うことで、ShopifyのGraphQL Admin API経由でMetafieldsに独自のIDを付与し、さまざまなシステムと同期をとりやすくできます。
特にアプリ同士の連携において、ハードコーディングを減らし、保守性を高めるうえで役立つでしょう。
制限事項
ID メタフィールド タイプは、一意の値を持つように自動的に構成されます。
カスタム ID による検索は、すべてのリソース タイプで使用できるわけではありません。現在サポートされているのは次のリソースタイプです。
- 商品
- 商品バリエーション
- コレクション
- 顧客
- 注文
使用方法
まずは、MetafieldDefinitionを作成します。MetafieldDefinitionは、メタフィールドのスキーマを定義するためのものです。以下は、IDメタフィールドを作成するMutationの例です。
mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {
metafieldDefinitionCreate(definition: $definition) {
createdDefinition {
id
name
namespace
key
}
userErrors {
field
message
code
}
}
}
{
"definition": {
"name": "My Custom ID",
"namespace": "custom",
"key": "id",
"description": "An custom ID field",
"type": "id",
"ownerType": "PRODUCT",
"pin": true
}
}
idempotencyKey に一意の値を指定し、衝突や重複を防ぐようにします。
続いて新しいリソースにメタフィールドを追加します。先ほど作成したメタフィールド定義を参照して対応しているリソースにメタフィールドを追加します。
ここでは製品にカスタムIDを追加する例を示します。
mutation createProductMetafields($input: ProductInput!) {
productCreate(input: $input) {
product {
id
metafields(first: 3) {
edges {
node {
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}
{
"input": {
"metafields": [
{
"namespace": "custom",
"key": "id",
"value": "1234"
}
],
"title": "Nike shoes"
}
}
こちらは既存のリソースにメタフィールドを追加する例です。
mutation updateProductMetafields($input: ProductInput!) {
productUpdate(input: $input) {
product {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}
{
"input": {
"metafields": [
{
"namespace": "custom",
"key": "id",
"value": "1234"
}
],
"title": "Nike shoes"
}
}
追加したカスタムIDを使ってリソースを検索することができます。クエリはproductByIdentifier
やcustomerByIdentifier
のように[リソースタイプ]ByIdentifierという形式で行います。次の例では、カスタム ID で商品を検索します。
query findProduct {
productByIdentifier(identifier: {customId: {
namespace:"custom", key:"id", value:"1234"
}}) {
title
handle
}
}
メタフィールドのクエリで必要なデータを抽出する
メタフィールドは大量に保存できる反面、必要なデータのみを取り出したいケースも多いでしょう。そんなときに便利なのが、Query by Metafield Valueです。たとえば、文字列や数値、Dateなど、条件に応じたフィルタリングを行うことで、目的のレコードだけを取得できます。
利用可能なメタフィールドの種類は次のとおりです。
- 単一行テキストまたは単一行テキスト(リスト)
- 製品参照または製品参照(リスト)
- trueまたはfalse
- コレクション参照またはコレクション参照(リスト)
- ページ参照またはページ参照(リスト)
- メタオブジェクト参照またはメタオブジェクト参照 (リスト)
- 会社参照または会社参照(リスト)
以下のサンプルでは、あるタクソノミーの参照フィールド値によるメタオブジェクトの照会を行っています。
query Metaobjects {
metaobjects(first: 20, type: "shopify--color-pattern",
query: "fields.taxonomy_reference:\"gid://shopify/TaxonomyValue/2\"") {
edges {
node {
id
displayName
type
name: field{key: "color_taxonomy_reference"} { value }
updatedAt
createdAt
}
}
}
}
こちらはシングルテキストによるメタオブジェクトの検索例です。
query Metaobjects {
metaobjects(first: 20, type: "custom--product-feature",
query: "fields.feature_name:\"waterproof\"") {
edges {
node {
id
displayName
type
name: field(key: "feature_name") { value }
updatedAt
createdAt
}
}
}
}
GraphQLのquery引数をうまく組み合わせることで、テキストやタグ情報など、さまざまな条件検索が可能です。商品を効率的に絞り込むだけでなく、在庫管理やプロモーション対象の特定などにも応用できます。
アプリメタフィールドを使うメリット
アプリメタフィールドは、特定のアプリのインストールに関連付けられ、そのアプリによってのみアクセスできるメタフィールドです。
アプリメタフィールドは、他のアプリやマーチャントによって上書きされることはなく、GraphQLを使用してアクセスできます。 アプリメタフィールドを使用すると、アプリメタフィールドと条件付きアプリブロックを使用して、アプリの支払いプランに応じて異なるレベルの機能をユーザーに提供できます。 また、アプリメタフィールドにクライアントIDやクライアントシークレットを格納することもできます。
アプリメタフィールドを使用すると、次のようなメリットがあります。
• 他のアプリとデータが衝突しにくい namespaceやkeyが重複するリスクを極力抑えられます。 • アプリ固有の機能開発がしやすい 独自仕様のデータを自由に扱えて、アップデートにも柔軟に対応できます。 • スケーラビリティとセキュリティ アプリ単位でアクセス権を制御しやすくなり、データの安全性を高められます。
以下はGraphQLを使ってアプリ独自のメタフィールドを作成する例です。
mutation CreateAppDataMetafield($metafieldsSetInput: [MetafieldsSetInput!]!) {
metafieldsSet(metafields: $metafieldsSetInput) {
metafields {
id
namespace
key
}
userErrors {
field
message
}
}
}
inputにnamespaceやkey、valueなどの情報を指定して、メタフィールドを作成します。
{
"metafieldsSetInput": [
{
"namespace": "secret_keys",
"key": "api_key",
"type": "single_line_text_field",
"value": "aS1hbS1hLXNlY3JldC1hcGkta2V5Cg==",
"ownerId": "gid://shopify/AppInstallation/3"
}
]
}
このとき、「namespace」「key」をアプリ用に確保したネーミングにすることで、ほかのメタフィールドとの干渉を避けられます。
新しいデータ型や要件にも柔軟に対応できるため、GraphQLを使うと拡張性と保守性が高まり、今後のShopify APIの進化にも追随しやすくなります。
メタフィールド活用のポイント
- 型の選択に注意する メタフィールドのタイプ(テキスト、URL、数値など)は適切に選ぶことで整合性を保ち、データ取得時の変換が楽になります。
- namespaceとkeyを設計する 自作アプリや複数の外部アプリと共存する場合、命名規則やキー管理をしっかり行うことでトラブルを防げます。
- 更新時のバージョン管理 大規模ストアやチーム開発では、メタフィールドの変化を追跡できる仕組みを用意しておくと安心です。
これらのポイントを踏まえると、運用時の混乱を防ぎつつ、ビジネスロジックに即したデータ管理が可能になります。
まとめ
Shopify Metafieldsは、標準機能を補完する柔軟な拡張ポイントとして、多くの開発者やマーチャントに活用されています。今回紹介したように、独自IDを活用した重複管理、クエリによる高精度なデータ抽出、アプリ専用メタフィールドの利用など、運用規模や要件に合わせた多彩なアプローチが用意されています。 適切なメタフィールドの設計と運用を行うことで、データ管理の効率化や機能拡張をスムーズに実現でき、Shopifyストアのユーザー体験やバックエンド運用をさらなる高みに引き上げられるでしょう。