Shopify APIを利用して在庫管理を行う
Shopify で販売している商品の在庫を一定間隔で指定の在庫に自動で更新してほしいという依頼があったので、Shopify APIについて色々調べてみました。
Shopifyの在庫を更新するには?
Shopify で販売している商品の在庫を更新するにはShopify APIを利用して行います。
APIの使用に関しては「https://shopify.dev/api」で確認することができます。
Shopify APIを利用するには?
Shopify APIを利用するには予め「アクセストークン」を取得しておく必要があります。
在庫に関するAPIは?
在庫更新のためのAPIは2022年9月現在、取得に関しては公開されていますが直接更新するためのものが用意されていないようです。
その為、現在の在庫を取得し、指定の在庫数に足りない在庫数を計算し、商品在庫に加算する方法しかないようです。
Shopify APIを利用する
ではShopify APIを利用して商品の在庫を更新する方法を紹介します。
inventoryItems
まずは[inventoryItems]を利用して商品の「inventory item Id」「SKU」を取得します。
1 2 3 4 5 6 7 8 9 10 | $query = '{ inventoryItems(first:50) { edges { node { id sku } } } }'; |
上記クエリーを下記のスクリプトを利用しAPIに送信しレスポンスを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $options = [ 'http' => [ 'ignore_errors' => true, 'method' => 'POST', 'header' => [ 'scope: read_customers', 'Content-Type: application/graphql', 'X-Shopify-Access-Token: ' . 'shpat_*****************' ], 'content' => $query ] ]; $context = stream_context_create($options); $contents = file_get_contents('https://********.myshopify.com/admin/api/2022-07/graphql.json', false, $context); print_r(json_decode($contents)); |
レスポンスはJSON形式で下記のような感じで返ってきます。
[id]がinventory item Id、[sku]がSKUとなります。
※SKUは必須項目ではないので予め重複しない文字列を登録しておいてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | stdClass Object ( [data] => stdClass Object ( [inventoryItems] => stdClass Object ( [edges] => Array ( [0] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/InventoryItem/41887914033229 [sku] => test-0001 ) ) [1] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/InventoryItem/41887914065997 [sku] => test-0002 ) ) [2] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/InventoryItem/41887914098765 [sku] => test-0003 ) ) ) ) ) [extensions] => stdClass Object ( [cost] => stdClass Object ( [requestedQueryCost] => 52 [actualQueryCost] => 31 [throttleStatus] => stdClass Object ( [maximumAvailable] => 1000 [currentlyAvailable] => 969 [restoreRate] => 50 ) ) ) ) |
productVariants
次に[productVariants]を利用して現在の商品の在庫数を取得します。
下記のクエリーでSKUと在庫数を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $query = '{ productVariants(first: 50) { edges { node { id sku barcode inventoryQuantity price } } } }'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | stdClass Object ( [data] => stdClass Object ( [productVariants] => stdClass Object ( [edges] => Array ( [0] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/ProductVariant/39788322979917 [sku] => test-0001 [barcode] => [inventoryQuantity] => 10 [price] => 1000 ) ) [1] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/ProductVariant/39788323012685 [sku] => test-0002 [barcode] => [inventoryQuantity] => 10 [price] => 1000 ) ) [2] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/ProductVariant/39788323045453 [sku] => test-0003 [barcode] => [inventoryQuantity] => 10 [price] => 1000 ) ) ) ) [extensions] => stdClass Object ( [cost] => stdClass Object ( [requestedQueryCost] => 52 [actualQueryCost] => 31 [throttleStatus] => stdClass Object ( [maximumAvailable] => 1000 [currentlyAvailable] => 969 [restoreRate] => 50 ) ) ) ) |
上記の情報が取得できたらロケーションIDも取得します。
locations
ローケーションを複数登録している場合は、割り当てが必要ですが今回は1件のみの登録なので割り当てに必要はありませんでした。
1 2 3 4 5 6 7 8 9 | $query = '{ locations(first: 50) { edges { node { id } } } }'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | stdClass Object ( [data] => stdClass Object ( [locations] => stdClass Object ( [edges] => Array ( [0] => stdClass Object ( [node] => stdClass Object ( [id] => gid://shopify/Location/61785047117 ) ) ) ) ) [extensions] => stdClass Object ( [cost] => stdClass Object ( [requestedQueryCost] => 52 [actualQueryCost] => 3 [throttleStatus] => stdClass Object ( [maximumAvailable] => 1000 [currentlyAvailable] => 997 [restoreRate] => 50 ) ) ) ) |
全ての情報が取得できたら、現在の在庫数から加算したい在庫数を商品ごとに計算し「inventory item Id」を利用して在庫を加算していきます。
inventoryBulkAdjustQuantityAtLocation
APIを利用して商品情報の更新にはMutationを利用します。
クエリーは下記のように記載します。「availableDelta」に加算したい在庫数を設定、「inventoryItemId」「locationId」には取得したIDを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $mutation = ' mutation{ inventoryBulkAdjustQuantityAtLocation( inventoryItemAdjustments:{ availableDelta: 10, inventoryItemId: "gid://shopify/InventoryItem/41946259030093" }, locationId: "gid://shopify/Location/61785047117" ) { inventoryLevels { id available } } } '; |
リクエストが正常に受け取られれば下記のレスポンスが返ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | stdClass Object ( [data] => stdClass Object ( [inventoryBulkAdjustQuantityAtLocation] => stdClass Object ( [inventoryLevels] => Array ( [0] => stdClass Object ( [id] => gid://shopify/InventoryLevel/96102449229?inventory_item_id=41946259030093 [available] => 20 ) ) ) ) [extensions] => stdClass Object ( [cost] => stdClass Object ( [requestedQueryCost] => 10 [actualQueryCost] => 10 [throttleStatus] => stdClass Object ( [maximumAvailable] => 1000 [currentlyAvailable] => 990 [restoreRate] => 50 ) ) ) ) |
Shopify APIを利用してみて
今回初めてShopify APIを利用し、「GraphQL」を初めて利用しました。
SQLとは異なりますが、構文を理解すれば同じように利用でき便利でした。
しかし、Shopifyの制限により直接在庫を更新できないなどの利用し難い部分もありました。
在庫編集に関する記事があまり見つからなかったので情報共有・備忘録の意味を込めてこの記事を作成しました。
S.E->お勧め記事;
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- PHPフレームワーク「Laravel」Bladeテンプレートを利用する
- PHPフレームワーク「Laravel」ファイル構造
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- Python 配列(タプル)
- CrowdWorks いつの間にか「プロクラウドワーカー」になっていた
- プログラマー になる為に必要な プログラミング以外 の知識・スキル
- Panic Nova 購入から1年が過ぎライセンスの更新時期の注意点
- CrowdWorks 提案後、受注に繋がりました。提案〜契約までの流れを解説