「RuffRuff 予約販売」は在庫切れや新商品販売前、入荷待ちなどのタイミングで発生する機会損失の削減をサポートします。
自身のShopifyストアに驚くほど簡単に予約販売を実現し、無制限での予約商品を登録および無制限で予約注文を受け付けることが可能です。また、予約商品と通常商品を同時に注文させないように制限したり、入荷時期が未定な場合は再入荷通知も可能です。
他の予約販売アプリにはない商品出荷前に支払回収できる「後払い」機能などのユニークな機能もたくさん存在します。引用元: 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ステップあります。
- JSONLファイルを用意する (ローカルで作成)
- 上記のJSONLファイルをアップロードする (stagedUploadsCreate を実行)
- アップロードしたファイルを元に一括更新する (bulkOperationRunMutation を実行)
- 一括更新が完了するのを待つ
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.へお問い合わせください。