コンテンツにスキップ
【厳選】おすすめ Shopifyアプリ
【厳選】おすすめ Shopifyアプリ
ShopifyのMetafieldsをGraphQL APIで一括更新する Tsun Inc.

ShopifyのMetafieldsをGraphQL APIで一括更新する

「RuffRuff 予約販売」は在庫切れや新商品販売前、入荷待ちなどタイミングで発生する機会損失の削減をサポートします。
ノーコードかつ3ステップで簡単にセットアップでき、日本語に対応しています。
無制限で予約商品を登録および無制限で予約注文を受け付けることが可能です。

引用元: RuffRuff 予約販売


Tsun Inc.でCTOをしている小笠原です!
このブログではShopify開発に役立つ情報を共有していきます。
Shopifyエンジニアの方の参考になれば嬉しいです!

今回のテーマは「ShopifyのMetafieldsをGraphQL APIを使って一括更新する」です。

メタフィールド(Metafields)とは
メタフィールド(Metafields)とは、Shopifyのデフォルトで設定できる情報とは別に情報を付加したい場合に、付加したい情報の定義設定及び追加できる仕組みのことです。

引用元:https://tsun.ec/blogs/articles/43

下記の記事では、メタフィールドやメタフィールドの一括編集におすすめのShopifyアプリも紹介していますので参考にしてください。

Shopifyのメタフィールドとは?おすすめのShopifyアプリも紹介

動機

Metafieldsの追加は専用のShopifyアプリを使って行っていましたが、一括更新は有料プランが必要なため、今回はGraphQL APIを使ってやってみようかなーと思いました。

また、GraphQL APIを使った一括更新(bulk update)は以前やったことがあったため、同じ要領でMetafieldsも更新できるなというのがある程度わかっていました。

前提条件

対象読者

  • ShopifyのGraphQL APIを使ってデータ取得や更新をしたことがある
  • ShopifyのMetafieldsを使ったことがある

環境

  • Shopify GraphQL APIのVersion 2022-07 を使って動作確認しています

準備するもの

  • 更新するストアのアクセストークン
  • Postmanなどのツールが便利です

やりかた

今回はサンプルとしてProductVariantのMetafieldsを一括更新してみます。

ProductVariantには小売価格を表すretail_priceというMetafieldが1つ設定されています。

GraphQL APIを使った一括更新 (bulk update) のやり方は 公式リファレンス にある通りにやればOKです。

大まかなステップとしては下記の4ステップあります。

  1. JSONLファイルを用意する (ローカルで作成)
  2. 上記のJSONLファイルをアップロードする (stagedUploadsCreate を実行)
  3. アップロードしたファイルを元に一括更新する (bulkOperationRunMutation を実行)
  4. 一括更新が完了するのを待つ

JSONLファイルを用意する

まずは更新のためのJSONLファイルを用意します。(JSONではなくJSONLなので注意してください)

このJSONLファイルは更新する対象を特定するためのidと更新する値さえ入っていればOKです。

今回は下記のようなJSONLファイル(bulk-update-metafields.jsonl)を作成しました。

{ "input": { "id": "gid:\/\/shopify\/ProductVariant\/1", "metafields": { "namespace": "global", "key": "retail_price", "type": "number_integer", "value": "1805" } } }
{ "input": { "id": "gid:\/\/shopify\/ProductVariant\/2", "metafields": { "namespace": "global", "key": "retail_price", "type": "number_integer", "value": "6397" } } }
{ "input": { "id": "gid:\/\/shopify\/ProductVariant\/3", "metafields": { "namespace": "global", "key": "retail_price", "type": "number_integer", "value": "5115" } } }
{ "input": { "id": "gid:\/\/shopify\/ProductVariant\/4", "metafields": { "namespace": "global", "key": "retail_price", "type": "number_integer", "value": "7896" } } }
{ "input": { "id": "gid:\/\/shopify\/ProductVariant\/5", "metafields": { "namespace": "global", "key": "retail_price", "type": "number_integer", "value": "1443" } } }

JSONLファイルをアップロードする

更新するストアに対して下記のmutationクエリを実行します。

mutation {
  stagedUploadsCreate(input:{
    resource: BULK_MUTATION_VARIABLES,
    filename: "bulk-update-metafields",
    mimeType: "text/jsonl",
    httpMethod: POST
  }){
    userErrors{
      field,
      message
    },
    stagedTargets{
      url,
      resourceUrl,
      parameters {
        name,
        value
      }
    }
  }
}

クエリが成功すると、アップロードに必要なkeyなどの情報が返ってくるのですべてメモします。

上記でメモした情報とJSONLファイルを指定してShopifyのサーバーにPOSTすることでファイルのアップロードが完了します。(この時点ではShopifyのサーバーにファイルをアップロードされただけで更新はされない)

アップロードしたファイルを元に一括更新する

Shopifyのサーバーにアップロードしたファイルを元にクエリを投げることでShopifyに一括更新してね!と伝えます。

具体的には下記のようなクエリを実行します。

mutation bulkOperationRunMutation($mutation: String!, $stagedUploadPath: String!) {
  bulkOperationRunMutation(mutation: $mutation, stagedUploadPath: $stagedUploadPath) {
    bulkOperation {
      id
      url
      status
    }
    userErrors {
      field
      message
    }
  }
}
{
  "mutation": "mutation call($input: ProductVariantInput!) { productVariantUpdate(input: $input) { productVariant { metafields(first: 10) { edges { node { namespace key type value } } } } userErrors {  message field } } }",
  "stagedUploadPath": "tmp/55523704929/bulk/d1cbc8f2-a3a7-4808-a148-f9024cfb1126/bulk-update-metafields"
}

一括更新が完了するのを待つ

更新件数によっては更新完了まで結構時間がかかるので気長に待ちます。(Webhookを設定しておけば、完了したタイミングでWebhookを受け取ることも可能)

今回は下記のクエリを投げて完了したかどうかを確認します。

query {
 currentBulkOperation(type: MUTATION) {
    id
    status
    errorCode
    createdAt
    completedAt
    objectCount
    fileSize
    url
    partialDataUrl
 }
}

statusがCOMPLETEDになったら更新完了です。

対象のProductVariantを取得してみて、更新が確認できたらOKです。

まとめ

今回はShopifyのProductVariantに設定されたMetafieldsをGraphQL APIで一括更新してみました。

もちろんMetafieldsの一括更新に対応したアプリを使えばクエリを投げたりする手間なくできると思います。

ただ、一括更新するアプリも内部的には今回紹介したbulk updateの仕組みを使って一括更新していますので、仕組みを知っておくと役に立つかなーと思います。


Tsun Inc.ではShopifyのMetafieldsもバリバリ使って快適なストア構築を行っています。

もし、ストア構築をしたい方は、Tsun Inc.へお問い合わせください。

前の記事 2022年12月時点のShopifyアプリ開発ベストプラクティス
次の記事 新しくリリースされたShopify開発ツールの中から気になるものをご紹介!

Shopify Apps

TECH BLOGS

BLOGS

編集プロセス

EコマースやShopifyの初学者にとって、できるだけ “やさしく” “わかりやすく” “正確に” 難しいコマース用語やマーケティング用語、ストア構築から販売までの仕組み・ノウハウを伝えることを心がけて、記事コンテンツを作成しています。

詳しく見る →

掲載情報に関して

掲載している各種情報は、株式会社Tsunが調査した情報をもとにしています。できるだけ“最新“かつ“正確“な情報の掲載に努めておりますが、内容を完全に保証するものではありません。当サイトによって生じた損害について、株式会社Tsunではその賠償の責任を一切負わないものとします。掲載情報に誤りがある場合には、お手数ですが株式会社Tsunまでご連絡をいただけますようお願いいたします。

アプリの比較

{"one"=>"比較する2つまたは3つのアイテムを選択します", "other"=>"選択された3つのアイテムの{{ count }}"}

比較する最初のアイテムを選択します

比較する2番目の項目を選択します

比較する3番目の項目を選択

比較