【Shopify.dev和訳】API Examples/Products
Shopify アプリのご紹介
Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。
Shopify アプリである、「らくらく日本語フォント設定|リテリア Font Picker」は、ノーコードで日本語フォントを使用できるアプリです。日本語フォントを導入することでブランドを演出することができます。
Product cost
アドミン API で商品コストを管理
Shopify は、マーチャントが 製品バリエーションのコストを記録 し、利益率を追跡し、製品パフォーマンスを報告する機能を開始しました。マーチャントは、バリエーションの価格設定を編集する際に、新しいCost per item
フィールドにアクセスできます。また、商品の CSV ファイルをインポートするか、商品の一括編集機能を使って、商品コストを一括で更新することができます。また、商品コストを分析するために、Profit margin
とGross profit
のレポートが追加されました。商品ごとのコストの詳細については、「商品の詳細」を参照してください。
このガイドでは、製品コストに関連する変更点と、新機能をサポートするためにアプリを更新する方法について説明します。商品原価を読み書きできるようにアプリをアップデートすることで、Shopify の管理画面からビジネスをよりよく理解できるようになり、マーチャントに素晴らしい価値を提供します。
このガイドでは、REST Admin API と GraphQL Admin API の両方を使用したリクエストとレスポンスの例を示しています。
Shopify リソースの変更
製品コスト機能を促進するために、InventoryItem リソースに新しい書き込み可能なcost
プロパティを追加しました。このプロパティにより、アプリはインベントリアイテムのコストを設定・取得することができます。
インベントリアイテムのコストの取得
REST
REST
GET https://{shop}.myshopify.com/admin/api/2021-07/inventory_items/{inventory_item_id}.json
{
"inventory_item": {
"id": 808950810,
"sku": "IPOD2008PINK",
"created_at": "2018-10-29T06:05:58-04:00",
"updated_at": "2018-10-29T06:05:58-04:00",
"cost": "25.00",
"tracked": true,
"admin_graphql_api_id": "gid://shopify/InventoryItem/808950810"
}
}
GraphQL
{
productVariant(id: "gid://shopify/ProductVariant/35437215234") {
id
inventoryItem {
unitCost {
amount
currencyCode
}
}
}
}
{
"data": {
"productVariant": {
"id": "gid://shopify/ProductVariant/35437215234",
"inventoryItem": {
"unitCost": {
"amount": "25.0",
"currencyCode": "CAD"
}
}
}
}
}
コストに関連したバリアントの作成
新しい製品やバリアントの作成時に、GraphQL Admin API を使用してコストを関連付けることができます。productCreate
および productVariantCreate
ミューテーションでは、InventoryItem
ブロックをバリアントに渡すことができ、コストを設定することができます。多くのミューテーションと同様に、アプリのコールリミット内であれば、1 つのリクエストで複数の製品やバリアントを作成することができます。
1 つのバリアントと関連するコストを持つ製品の作成
{
mutation createProduct($input: ProductInput!) {
productCreate(input: $input) {
userErrors {
field
message
}
product {
id
}
}
}
}
{
"input": {
"title": "Product test",
"variants": [
{
"title": "Variant test",
"options": "Red",
"price": "55.00",
"inventoryItem": {
"cost": "25.00"
}
}
]
}
}
複数のバリエーションとそれに伴うコストを持つ製品の作成
{
mutation createProduct($input: ProductInput!) {
productCreate(input: $input) {
userErrors {
field
message
}
product {
id
}
}
}
}
{
"input": {
"title": "Product test",
"variants": [
{
"title": "Variant test 1",
"options": "Red",
"price": "55.00",
"inventoryItem": {
"cost": "33.00"
}
},
{
"title": "Variant test 2",
"options": "Blue",
"price": "55.00",
"inventoryItem": {
"cost": "33.00"
}
}
]
}
}
コストの更新
REST
PUT https://{shop}.myshopify.com/admin/api/2021-07/inventory_items/#{inventory_item_id}.json
{
"inventory_item": {
"id": 808950810,
"cost": "25.00"
}
}
GraphQL
{
mutation updateVariant($input: ProductVariantInput!) {
productVariantUpdate(input: $input) {
userErrors {
field
message
}
productVariant {
id
}
}
}
}
{
"input": {
"id": "gid://shopify/ProductVariant/35437260802",
"inventoryItem": {
"cost": "25.00"
}
}
}
どうやってヘルプを得られますか?
もしあなたのアプリに製品コストを実装することについて質問がある場合は、Shopify Community forums にアクセスして、Shopify コミュニティから助けを得てください。
Inventory
Admin API で商品の在庫を管理する
このガイドでは、商品の在庫を取得・更新する方法を説明します。製品は複数の場所に在庫がある場合があるため、特定の場所の在庫を更新する方法の前に、製品の在庫を確認する方法を説明します。
在庫リソース
在庫の更新を始める前に、在庫リソースの関係を理解しておくと便利です。4 つのインベントリリソースの関係を示すフロー図
- Product Variant: 価格、説明、画像などのマーチャンダイジング情報を含みます。これは、お客様に見てもらいたい商品情報と考えてください。
すべての商品バリエーションは、関連するインベントリアイテムと 1 対 1 の関係にあります。各製品バリアントは 1 つのインベントリアイテムを持ち、そのインベントリアイテムはその製品バリアントにのみ属します。
- InventoryItem: SKU など、物理的な製品に関する情報を含みます。これは、在庫、出荷、フルフィルメントの管理に使用されるバックエンド情報と考えてください。
インベントリアイテムは、1 つまたは複数のインベントリレベルに関連付けられています。在庫アイテムは、そのアイテムがストックされている場所ごとに在庫レベルを持ちます。
- InventoryLevel: 利用可能なアイテムの実際の数量を表す。
在庫レベルは、1 つの在庫アイテムを 1 つのロケーションに関連付けます。各インベントリレベルは、関連するロケーションでそのインベントリアイテムの利用可能な数量を保持します。
- Location: 小売店や倉庫など、マーチャントがビジネスを行う地理的な場所を表します。
ロケーションは多くのインベントリレベルを持つことができます。各ロケーションは在庫アイテムごとに 1 つのインベントリレベルを持ちます。
注文が在庫に与える影響
Shopify が追跡している商品のバリエーションが注文に含まれている場合、Shopify はそのバリエーションの在庫を減少させます。Shopify はどのロケーションから商品が配送されるかわからないので、Shopify は最も低い ID を持つロケーションの在庫レベルを減少させます。
注文が処理されるとき、処理は処理が行われている場所の ID を含みます。Shopify は、フルフィルメントの場所が、在庫が減少した元の場所と一致するかどうかをチェックし、必要に応じて在庫を調整します。
- フルフィルメントの場所が元の場所と一致する場合は、何もする必要はありません。
- フルフィルメントの場所が元の場所と一致しない場合、Shopify はフルフィルメントの場所の在庫レベルを減少させ、元の場所の在庫レベルを増加させます。
例 単純な注文に対する在庫調整
Rahul はオンラインストアを所有しています。彼は 2 つの倉庫を使って商品の在庫を管しています。1 つはロサンゼルス(ID: 6884556842
)で、もう 1 つはニューヨー(ID: 13968834616
)です。Rahul さんの商品の一つである帽子は、両方の倉庫に以下在庫レベルで在庫されています。
- ロサンゼルス:8
- ニューヨーク:6
顧客から帽子の注文が入りました。ロサンゼルスの拠点の ID が一番低いので、Shopify はその拠点の商品の在庫レベルを減らします。
- ロサンゼルス:7
- ニューヨーク:6
この注文は、実際にはニューヨークの拠点で処理されます。フルフィルメントが作成されると、ニューヨークのロケーションの ID が含まれます。Shopify はフルフィルメントのロケーション ID を元のロケーションと比較し、それらが異なっていることを発見する。Shopify は次に、ロサンゼルスの拠点の在庫レベルを増加させ、ニューヨークの拠点の在庫レベルを減少させる。
- ロサンゼルス:8
- ニューヨーク:5
商品バリエーションの在庫レベルを取得する
次のステップでは、インベントリリソースを使用して、製品バリアントが在庫されている場所と、各場所の在庫レベルを検索する方法を説明します。
ステップ 1: 在庫アイテム ID をバリアントに問い合わせる
製品バリアントに問い合わせて、その在庫アイテムの ID を調べます。
REST
GET https://{shop}.myshopify.com/admin/api/2021-07/products/{product_id}/variants/{variant_id}.json
{
"id": 12195009364024,
"product_id": 1321541042232,
"title": "xs",
"inventory_item_id": 12250274365496,
...
"admin_graphql_api_id": "gid://shopify/ProductVariant/12195009364024",
...
}
レスポンスからインベントリアイテム ID を使用して、アイテムのインベントリレベルを見つけることができます。
GraphQL
POST https://{shop}.myshopify.com/admin/api/2021-07/graphql.json
query getVariantByID($id: ID!) {
productVariant(id: $id) {
id
title
inventoryItem {
id
}
}
}
{
"id": "gid://shopify/ProductVariant/12195009364024"
}
{
"productVariant": {
"id": "gid://shopify/ProductVariant/12195009364024",
"title": "xs",
"inventoryItem": {
"id": "gid://shopify/InventoryItem/12250274365496"
}
}
}
レスポンスからインベントリアイテム ID を使用して、アイテムのインベントリレベルを見つけることができます。
ステップ 2: アイテムの在庫レベルを取得する
インベントリアイテム ID を取得したら、それを InventoryLevel リソースで使用して、インベントリアイテムのレベルとロケーションを見つけることができます。
REST
GET https://{shop}.myshopify.com/admin/api/2021-07/inventory_levels.json?inventory_item_ids={inventory_item_id}
{
"inventory_levels": [
{
"inventory_item_id": 12250274365496,
"location_id": 6884556842,
"available": 8,
"updated_at": "2018-06-18T11:49:50-04:00",
"admin_graphql_api_id": "gid://shopify/InventoryLevel/6485147690?inventory_item_id=12250274365496"
},
{
"inventory_item_id": 12250274365496,
"location_id": 13968834616,
"available": 50,
"updated_at": "2018-06-26T14:44:30-04:00",
"admin_graphql_api_id": "gid://shopify/InventoryLevel/13570506808?inventory_item_id=12250274365496"
},
{
"inventory_item_id": 12250274365496,
"location_id": 13968867384,
"available": 100,
"updated_at": "2018-06-26T14:44:30-04:00",
"admin_graphql_api_id": "gid://shopify/InventoryLevel/13570539576?inventory_item_id=12250274365496"
}
]
}
レスポンスでは、3 つの場所で 8、50、100 の数量の在庫レベルが表示されています。
GraphQL
POST https://{shop}.myshopify.com/admin/api/2021-07/graphql.json
query getInventoryItemByID($id: ID!) {
inventoryItem(id: $id) {
id
inventoryLevels(first: 6) {
edges {
node {
id
available
}
}
}
}
}
{
"id": "gid://shopify/InventoryItem/12250274365496"
}
{
"inventoryItem": {
"id": "gid://shopify/InventoryItem/12250274365496",
"inventoryLevels": {
"edges": [
{
"node": {
"id": "gid://shopify/InventoryLevel/6485147690?inventory_item_id=12250274365496",
"available": 8
}
},
{
"node": {
"id": "gid://shopify/InventoryLevel/13570506808?inventory_item_id=12250274365496",
"available": 50
}
},
{
"node": {
"id": "gid://shopify/InventoryLevel/13570539576?inventory_item_id=12250274365496",
"available": 100
}
}
]
}
}
}
この回答では、3 つの場所で 8、50、100 の数量の在庫レベルが表示されています。
商品バリエーションの在庫水準の更新
在庫水準の更新には 2 つの方法があります。
- 指定された量だけ値を増加または減少させることで、利用可能な数量を調整する。
- 利用可能な数量を所定の値に設定する。
在庫量を一定量に調整
REST
在庫レベルの利用可能な数量を増減させるには、ロケーション ID と在庫アイテム ID を持つ adjust エンドポイントを使用します。
POST https://{shop}.myshopify.com/admin/api/2021-07/inventory_levels/adjust.json
{
"location_id": 6884556842,
"inventory_item_id": 12250274365496,
"available_adjustment": 1
}
{
"inventory_level": {
"inventory_item_id": 12250274365496,
"location_id": 6884556842,
"available": 9,
"updated_at": "2018-06-26T15:04:49-04:00",
...
"admin_graphql_api_id": "gid://shopify/InventoryLevel/6485147690?inventory_item_id=12250274365496"
...
}
}
GraphQL
在庫レベルのための利用可能な数量を調整するには、在庫レベル ID を持つadjustInventoryLevelQuantity
ミューテーションを使用してください。
POST https://{shop}.myshopify.com/admin/api/2021-07/graphql.json
mutation adjustInventoryLevelQuantity(
$inventoryAdjustQuantityInput: InventoryAdjustQuantityInput!
) {
inventoryAdjustQuantity(input: $inventoryAdjustQuantityInput) {
inventoryLevel {
available
}
userErrors {
field
message
}
}
}
{
"inventoryAdjustQuantityInput": {
"inventoryLevelId": "gid://shopify/InventoryLevel/6485147690?inventory_item_id=12250274365496",
"availableDelta": 1
}
}
{
"inventoryAdjustQuantity": {
"inventoryLevel": {
"available": 9
},
"userErrors": []
}
}
在庫量を一定量に設定
REST
在庫レベルを特定の値に設定するには、ロケーション ID と在庫アイテム ID を持つ set エンドポイントを使用します。
POST https://{shop}.myshopify.com/admin/api/2021-07/inventory_levels/set.json
{
"location_id": 6884556842,
"inventory_item_id": 12250274365496,
"available": 1
}
{
"inventory_level": {
"inventory_item_id": 12250274365496,
"location_id": 6884556842,
"available": 1,
"updated_at": "2018-06-26T15:44:33-04:00",
...
"admin_graphql_api_id": "gid://shopify/InventoryLevel/6485147690?inventory_item_id=12250274365496"
...
}
}
GraphQL
GraphQL Admin API を使ってレベルを直接設定するミューテーションはありません。代わりに adjustInventoryLevelQuantity
ミューテーションを使って在庫水準を調整してください。
次のステップ
- インベントリーリソースについて詳しくはこちらをご覧ください。
- 開発店舗に複数のロケーションを設定する。
Media
GraphQL Admin API による製品メディアの管理
GraphQL Admin API を使用して、マーチャントの製品に関連するさまざまなタイプのメディアを管理できます。また、Storefront API を使って商品のメディアを取得し、カスタムストアフロントに表示することもできます。このガイドでは、製品メディアの異なるタイプと、それらを扱うための Shopify の API の使用方法について説明します。
GraphQL Admin API と Storefront API のみが、すべてのタイプの製品メディアの操作をサポートしています。REST Admin API は商品画像のみをサポートしています。
製品のメディア タイプ
商品には、以下のメディア タイプがあります。
GraphQL タイプ | 説明 |
---|---|
メディアイメージ | 次のいずれかの形式の画像です。PNG、GIF、JPG。最大画像サイズは 4472 x 4472 px、または 20 メガピクセルです。正方形の画像の場合は、2048 x 2048 px が最適です。 |
ビデオ | Shopify でホストされている MP4 ビデオです。ビデオの再生時間は 1 分以内でなければなりません。最大ファイルサイズは 1GB です。 |
ExternalVideo | YouTube または Vimeo でホストされているビデオで、埋め込み URL で指定されています。 |
Model3d | GLB フォーマットで提供される 3D モデル。アセットは、GLB および USDZ 形式で取得できます。ファイルサイズは 15MB 以下です。 |
GraphQL がサポートするメディアアクション
GraphQL Admin API と Storefront API は、すべてのメディアタイプを扱うことができます。商品のメディアに対して実行できるアクションは、どちらの API を使用しているかによって異なります。
API | メディアのアップロード | 製品にメディアを追加 | メディアの取得 | メディアの削除 |
---|---|---|---|---|
GraphQL Admin API | ✓ | ✓ | ✓ | ✓ |
ストアフロント API | - | - | ✓ | - |
Shopify にメディアをアップロードする
商品にメディアを追加する前に、メディアをアップロードして Shopify でホストすることができます。アセットを Shopify にアップロードするには 2 つの部分があります。
ショップがアップロードできるメディアアセットの数は、ショップの Shopify プランに応じて異なります。詳細については、製品メディアのプランベースの制限を参照してください。
アップロード URL とパラメータの生成
stagedUploadsCreate ミューテーションを使用して、複数のアップロードを認証するために必要な値を生成することができます。このミューテーションは、stagedTargets
配列を返します。各 stagedTarget は、以下のプロパティを持っています。
-
params
- アップロードリクエストを認証するために使用するパラメータ -
url
- メディアアセットをアップロードするための URL -
resourceUrl
- アセットがアップロードされた後にoriginalSource
フィールドで productCreateMedia に渡される URL
このミューテーションは、以下のフィールドを持つ stagedUploadInput タイプの入力を受け入れます。
フィールド | タイプ | 説明 |
---|---|---|
resource | StagedUploadTargetGenerateUploadResource | アップロードするリソースタイプを指定します。有効なメディアの値VIDEO , MODEL_3D , IMAGE . |
filename | String | アップロードするファイルの名前です。 |
mimeType | String | アップロードするファイルのメディアタイプです。次のいずれかの値を使用します。 ・video/mp4 ・videomp4 - video/quicktime ・image/png ・image/gif ・image/jpeg ・model/gltf-binary
|
httpMethod | StagedUploadHttpMethodType | ステージドアップロードで使用する HTTP メソッド。有効な値です。POST(すべてのメディアタイプ)、PUT(画像のみ)。 |
fileSize | UnsignedInt64 | アップロードするファイルのサイズをバイト単位で指定します。 |
次の例では,stagedUploadsCreate ミューテーションを利用して,MP4 ビデオと 3D モデルのアップロードに必要なアップロード値を生成しています。
POST /admin/api/2020-01/graphql.json
mutation generateStagedUploads($input: [StagedUploadInput!]!) {
stagedUploadsCreate(input: $input) {
stagedTargets {
url
resourceUrl
parameters {
name
value
}
}
mediaUserErrors {
code
field
message
}
}
}
{
"input": [
{
"filename": "watches_comparison.mp4",
"mimeType": "video/mp4",
"resource": "VIDEO",
"fileSize": "899765"
},
{
"filename": "another_watch.glb",
"mimeType": "model/gltf-binary",
"resource": "MODEL_3D",
"fileSize": "456"
}
]
}
Open/Hide response
{
"data": {
"stagedUploadsCreate": {
"stagedTargets": [
{
"url": "https://shopify-video-production-core-originals.s3.amazonaws.com/",
"resourceUrl": "https://shopify-video-production-core-originals.s3.amazonaws.com?external_video_id=4635",
"parameters": [
{
"name": "bucket",
"value": "shopify-video-production-core-originals"
},
{
"name": "key",
"value": "c/o/v/7827ebe111a24a09869ec90f3412768f.mp4"
},
{
"name": "policy",
"value": "eyJjb25kaXRpb25zIjpbWyJlcSIsIiRidWNrZXQiLCJzaG9waWZ5LXZpZGVvLXByb2R1Y3Rpb24tY29yZS1vcmlnaW5hbHMiXSxbImVxIiwiJGtleSIsImMvby92Lzc4MjdlYmUxMTFhMjRhMDk4NjllYzkwZjM0MTI3NjhmLm1wNCJdLFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLDg5OTc2NSw4OTk3NjVdLFsiZXEiLCIkY2FjaGUtY29udHJvbCIsInB1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCJdLFsiZXEiLCIkeC1hbXotY3JlZGVudGlhbCIsIkFLSUFZT0k1S1o2MkpRQ1c2M0xVLzIwMTkwOTE3L3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QiXSxbImVxIiwiJHgtYW16LWFsZ29yaXRobSIsIkFXUzQtSE1BQy1TSEEyNTYiXSxbImVxIiwiJHgtYW16LWRhdGUiLCIyMDE5MDkxN1QyMDQ4MzhaIl1dLCJleHBpcmF0aW9uIjoiMjAxOS0wOS0xN1QyMTo0ODozOFoifQ=="
},
{
"name": "cache-control",
"value": "public, max-age=31536000"
},
{
"name": "x-amz-signature",
"value": "16bd494f09d3739f428777e44b2a1f8de96f9545b83db4a58cf027503833c9fc"
},
{
"name": "x-amz-credential",
"value": "AKIAYOI5KZ62JQCW63LU/20190917/us-east-1/s3/aws4_request"
},
{
"name": "x-amz-algorithm",
"value": "AWS4-HMAC-SHA256"
},
{
"name": "x-amz-date",
"value": "20190917T204838Z"
}
]
},
{
"url": "https://storage.googleapis.com/threed-models-production/models/60d55fd9e8cba091/another_watch.glb?external_model3d_id=bW9kZWwzZC0xNTk3",
"resourceUrl": "https://storage.googleapis.com/threed-models-production/models/60d55fd9e8cba091/another_watch.glb?external_model3d_id=bW9kZWwzZC0xNTk3",
"parameters": [
{
"name": "GoogleAccessId",
"value": "threed-model-service--6bgx7cbe@shopify-applications.iam.gserviceaccount.com"
},
{
"name": "key",
"value": "models/60d55fd9e8cba091/another_watch.glb"
},
{
"name": "policy",
"value": "eyJleHBpcmF0aW9uIjoiMjAxOS0wOS0xN1QyMTowMzozOFoiLCJjb25kaXRpb25zIjpbWyJlcSIsIiRidWNrZXQiLCJ0aHJlZWQtbW9kZWxzLXByb2R1Y3Rpb24iXSxbImVxIiwiJGtleSIsIm1vZGVscy82MGQ1NWZkOWU4Y2JhMDkxL2Fub3RoZXJfd2F0Y2guZ2xiIl0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsNDU2LDQ1Nl1dfQ=="
},
{
"name": "signature",
"value": "Tp5B5OXpE2bWEnvQ7F1JvozQPGloujwMJ9CMbLWUwM1LmnUpL3tAh6eJ9d61laiwLqGRgTUOdTkMZTofFi5n/af9sCDZAHXeDKzukrohWYX8M+Ui7VvDflA/l0CIv5uzhMgbfRmqK9XCBK61/WkSuMZblEP0AAmqMtkKZhuxTzj8JMH83JYRqVb0r9k9IE+TEJluc5eSJ6Y+NrrGFV+nbh7T/lexCc02v8NVNNw2I0xNyQ8sZWW53c0WJIuQ4F+oagMGSXeyhxNvjKVPC1NVv5NqFM4A/d7eGLwBmlz4lE4GyUonxyH//Iww7zq+Klyr0+mP8IcYnGJQpT3uJDow+w=="
}
]
}
],
"mediaUserErrors": []
}
}
}
アセットのアップロード
アップロード用のパラメータと URL を生成したら、POST または PUT リクエストを使ってアセットをアップロードする必要があります。リクエストのフォーマットは、使用するメディアタイプと HTTP メソッドによって異なります。
動画、3D モデル POST リクエスト
マルチパートのフォームを使用し、すべてのパラメータをフォーム入力としてリクエストボディに含めます。
curl -v \
-F "bucket=shopify-video-production-core-originals" \
-F "key=c/o/v/7827ebe111a24a09869ec90f3412768f.mp4" \
-F "policy=eyJjb25kaXRpb25zIjpbWyJlcSIsIiRidWNrZXQiLCJzaG9waWZ5LXZpZGVvLXByb2R1Y3Rpb24tY29yZS1vcmlnaW5hbHMiXSxbImVxIiwiJGtleSIsImMvby92Lzc4MjdlYmUxMTFhMjRhMDk4NjllYzkwZjM0MTI3NjhmLm1wNCJdLFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLDg5OTc2NSw4OTk3NjVdLFsiZXEiLCIkY2FjaGUtY29udHJvbCIsInB1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCJdLFsiZXEiLCIkeC1hbXotY3JlZGVudGlhbCIsIkFLSUFZT0k1S1o2MkpRQ1c2M0xVLzIwMTkwOTE3L3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QiXSxbImVxIiwiJHgtYW16LWFsZ29yaXRobSIsIkFXUzQtSE1BQy1TSEEyNTYiXSxbImVxIiwiJHgtYW16LWRhdGUiLCIyMDE5MDkxN1QyMDQ4MzhaIl1dLCJleHBpcmF0aW9uIjoiMjAxOS0wOS0xN1QyMTo0ODozOFoifQ==" \
-F "cache-control=public, max-age=31536000" \
-F "x-amz-signature=16bd494f09d3739f428777e44b2a1f8de96f9545b83db4a58cf027503833c9fc" \
-F "x-amz-credential=WL7JL6XWPQ7FSEUJRMYZ/32138726/us-east-1/s3/aws4_request" \
-F "x-amz-algorithm=AWS4-HMAC-SHA256" \
-F "x-amz-date=20190917T204838Z" \
-F "file=@/Users/shopifyemployee/watches_comparison.mp4" \
"https://shopify-video-production-core-originals.s3.amazonaws.com/"
画像 POST リクエスト
マルチパートフォームを使用し、すべてのパラメータをフォーム入力としてリクエストボディに含めます。
curl -v \
-F "AWSAccessKeyId=AKIAJYM555KVYEWGJDKQ" \
-F "key=tmp/17681717/products/ec24e5f6-ba91-43d7-bb43-4c7174770ac1/watches_comparison.png" \
-F "policy=eyJleHBpcmF0aW9uIjoiMjAxOS0wNi0xNFQxNjo0OTowM1oiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJzaG9waWZ5In0seyJrZXkiOiJ0bXBcLzE3NjgxNzE3XC9wcm9kdWN0c1wvZWMyNGU1ZjYtYmE5MS00M2Q3LWJiNDMtNGM3MTc0NzcwYWMxXC9JR1EucG5nIn0seyJGaWxlbmFtZSI6IklHUS5wbmcifSx7Ik1pbWUtVHlwZSI6ImltYWdlXC9wbmcifSx7IkZpbGUtU2l6ZSI6IjMzNjQ2MSJ9LHsic3VjY2Vzc19hY3Rpb25fc3RhdHVzIjoiMjAxIn0seyJhY2wiOiJwcml2YXRlIn0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMSwyMDk3MTUyMF1dfQ==" \
-F "signature=yZsEky4DDqbbcNnOVFNAagZnlcI=" \
-F "Filename=watches_comparison.png" \
-F "Mime-Type=image/png" \
-F "File-Size=336461" \
-F "success_action_status=201" \
-F "acl=private" \
-F "file=@/Users/shopifyemployee/Desktop/watches_comparison.png" \
"https://shopify.s3.amazonaws.com/"
画像 PUT リクエスト
パラメータをリクエストヘッダーに含める。追加のパラメーターは、すでに URL に含まれています。
curl -X PUT -T ~/Desktop/watches_comparison.png \
-H 'content_type:image/png' \
-H 'x-aws-acl:private' \
-H 'Content-Type:image/png' \
"https://shopify.s3.amazonaws.com/tmp/17681717/products/35c29fff-a86e-4ca4-a8aa-f725b2b6fdcb/watches_comparison.png?AWSAccessKeyId=AKIAJYM555KVYEWGJDKQ&Expires=1560534810&Signature=zUu%2BAmDsgkUsMhE%2BixRwRdXCNMY%3D"
商品メディアのプラン別制限について
Shopify がホストするビデオや 3D モデルの数に は制限があります。制限数はショップが利用している Shopify のプランに依存します。
Basic Shopify | Shopify | Advanced Shopify | Shopify Plus |
---|---|---|---|
250 | 1000 | 5000 | お問い合わせ プラスサポート |
商品にメディアを追加する
productCreateMedia を使って商品に新しいメディアを追加することができます。このミューテーションは 2 つの引数を取ります。
- productId - メディアを追加しようとする商品の ID
- media - CreateMediaInput オブジェクトの配列。
各 CreateMediaInput オブジェクトには、以下のフィールドが含まれます。
フィールド | タイプ | 説明 |
---|---|---|
originalSource | String | メディアオブジェクトの元のソース。画像、YouTube 動画、Vimeo 動画の場合は外部 URL、Shopify でホストされている画像、動画、3D モデルの場合はアップロード URL を指定します。Shopify がホストしているアセットの場合は、stagedUploadsCreate のミューテーションで返されるresourceUrl の値を使用してください。 |
alt | String | メディアに関連付けられた alt テキストです。 |
mediaContentType | メディアコンテンツタイプ | 追加するアセットのコンテンツタイプです。有効な値です。image, video, external_video, model_3d. |
次の例では、Shopify がホストするビデオを商品に追加しています。
POST /admin/api/2020-01/graphql.json
mutation createProductMedia($id: ID!, $media: [CreateMediaInput!]!) {
productCreateMedia(productId: $id, media: $media) {
media {
...fieldsForMediaTypes
mediaErrors {
code
details
message
}
}
product {
id
}
mediaUserErrors {
code
field
message
}
}
}
fragment fieldsForMediaTypes on Media {
alt
mediaContentType
preview {
image {
id
}
}
status
... on Video {
id
sources {
format
height
mimeType
url
width
}
}
... on ExternalVideo {
id
host
embeddedUrl
}
... on Model3d {
sources {
format
mimeType
url
}
}
}
{
"id": "gid://shopify/Product/1",
"media": [
{
"originalSource": "https://storage.googleapis.com/shopify-video-production-core-originals/c/o/v/af64d230f6bc40cbba40a87be950a1a2.mp4?external_video_id=1730",
"alt": "Comparison video showing the different models of watches.",
"mediaContentType": "VIDEO"
}
]
}
Open/Hide response
{
"data": {
"productCreateMedia": {
"media": [
{
"mediaContentType": "VIDEO",
"alt": "Comparison video showing the different models of watches.",
"status": "UPLOADED",
"id": "gid://shopify/Video/3113016",
"sources": [
{
"format": "mp4",
"height": 360,
"mimeType": "video/mp4",
"url": "https://videos.shopifycdn.com/c/vp/2a82811738ca41e7a508e6744028d169/SD-360p.mp4?Expires=1560534951&KeyName=core-signing-key-1&Signature=T_aftXCRfamwlXZNlCwSAOq1sg8=",
"width": 640
}
]
}
],
"mediaUserErrors": []
}
}
}
メディアオブジェクトの取得
製品タイプの media
接続を使用して、製品のあらゆるタイプのメディアを取得することができます。この接続は、Media インターフェースを実装したノードを返します。
media
接続には、mediaContentType
フィールドが含まれており、これを使用して各ノードのメディア タイプを確認できます。各メディアタイプは異なるフィールドを返す可能性があるため、fragments を使用して各タイプの戻りフィールドを指定できます。
POST /admin/api/2020-01/graphql.json
Copy
{
product(id:"gid://shopify/Product/1") {
title
media(first:5) {
edges {
node {
... fieldsForMediaTypes
}
}
}
}
}
fragment fieldsForMediaTypes on Media {
alt
mediaContentType
preview {
image {
id
altText
originalSrc
}
}
status
... on Video {
id
sources {
format
height
mimeType
url
width
}
originalSource {
format
height
mimeType
url
width
}
}
... on ExternalVideo {
id
host
embeddedUrl
}
... on Model3d {
sources {
format
mimeType
url
}
originalSource {
format
mimeType
url
}
}
... on MediaImage {
id
image {
altText
originalSrc
}
}
}
Open/Hide response
{
"data": {
"product": {
"title": "Polaris Watch",
"media": {
"edges": [
{
"node": {
"alt": "Comparison video showing the different models of watches.",
"mediaContentType": "VIDEO",
"preview": {
"image": {
"id": "gid://shopify/Image/1",
"altText": "Comparison video showing the different models of watches..",
"originalSrc": "https://cdn.shopify.com/s/files/1/1768/1717/products/31f1438669864f4f91847f07e39e3835.jpg?v=1234567890"
}
},
"status": "READY",
"id": "gid://shopify/Video/3113016",
"sources": [
{
"format": "mp4",
"height": 360,
"mimeType": "video/mp4",
"url": "https://videos.shopifycdn.com/c/vp/2a82811738ca41e7a508e6744028d169/SD-360p.mp4?Expires=1560956269&KeyName=core-signing-key-1&Signature=MYq_eEWGB-2Ww-oN58j-TbxwDYw=",
"width": 640
}
]
}
},
{
"node": {
"alt": "Comparison video showing the different models of watches.",
"mediaContentType": "EXTERNAL_VIDEO",
"preview": {
"image": {
"id": "gid://shopify/Image/2",
"altText": "Comparison video showing the different models of watches..",
"originalSrc": "https://cdn.shopify.com/s/files/1/1768/1717/products/31f1438669864f4f91847f07e39e3835.jpg?v=2234567890"
}
},
"status": "READY",
"id": "gid://shopify/ExternalVideo/8486968",
"host": "YOUTUBE",
"embeddedUrl": "https://youtu.be/z7RLjNOael0"
}
}
]
}
}
}
}
商品のメディアを更新する
productUpdateMedia ミューテーションを使って、商品に関連するメディアを更新することができます。ミューテーション入力の一部として、以下の引数を含めます。
-
productId
- メディアが属している製品の ID です。 -
media
- 適用するメディアの変更の配列。
メディアアイテムの alt テキストやプレビューイメージの URL を変更することができます。更新したいメディアを識別するために、メディアの ID を含めます。更新するメディアを ID で識別します。例えば、以下の JSON 変数は、ID が gid://shopify/MediaImage/42729528
の MediaImage の alt テキストを更新します。
{
"media": [
{
"id": "gid://shopify/MediaImage/42729528",
"alt": "Some new alt text."
}
]
}
以下の例では、productUpdateMedia mutation を使用して、メディアの alt テキストを更新する方法を示しています。この例では、メディアの変更内容を提供するために JSON 変数を使用し、メディアタイプに基づいて戻り値のフィールドを選択するフラグメントを使用しています。
POST /admin/api/2020-01/graphql.json
mutation updateProductMedia($mediaUpdates: [UpdateMediaInput!]!) {
productUpdateMedia(productId: "gid://shopify/Product/10079786124", media: $mediaUpdates) {
media {
alt
mediaContentType
...mediaFieldsByType
}
mediaUserErrors {
field
message
}
}
}
fragment mediaFieldsByType on Media {
... on ExternalVideo {
id
host
embeddedUrl
}
... on MediaImage {
id
image {
originalSrc
}
}
... on Model3d {
id
sources {
url
mimeType
format
filesize
}
}
... on Video {
id
sources {
url
mimeType
format
height
width
}
}
}
{
"mediaUpdates": [
{
"id": "gid://shopify/MediaImage/42729528",
"alt": "Man wearing Polaris watch."
}
]
}
Open/Hide response
{
"data": {
"productUpdateMedia": {
"media": [
{
"alt": "Man wearing Polaris watch.",
"mediaContentType": "IMAGE",
"id": "gid://shopify/MediaImage/42729528",
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/1768/1717/products/StockSnap_9NPZZJCWW3_copy.jpg?v=1566862515"
}
}
],
"mediaUserErrors": []
}
}
}
メディアオブジェクトの並び替え
productReorderMediaミューテーションを使うと、製品のメディアを並べ替えることができます。このミューテーションは 2 つの引数を受け入れます。
- id - 並び替えの対象となる製品の ID
- moves - メディアオブジェクトの ID とそのリスト内の新しい位置からなるタプルの配列。例えば、次の配列は、メディアオブジェクトを製品のメディアリストの先頭に移動させます。
[
{
"id": "gid://shopify/MediaImage/37"
"newPosition": "0"
},
{
"id": "gid://shopify/Video/2",
"newPosition": "1"
}
]
以下の例では、商品の最初の 3 つのメディアアセットの順序を調整しています。
POST /admin/api/2020-01/graphql.json
mutation reorderProductMedia($id: ID!, $moves: [MoveInput!]!) {
productReorderMedia(id: $id, moves: $moves) {
job {
id
done
}
mediaUserErrors {
code
field
message
}
}
}
{
"id": "gid://shopify/Product/1",
"moves": [
{
"id": "gid://shopify/MediaImage/37",
"newPosition": "0"
},
{
"id": "gid://shopify/Video/2",
"newPosition": "1"
},
{
"id": "gid://shopify/ExternalVideo/1",
"newPosition": "2"
}
]
}
Open/Hide response
{
"data": {
"productReorderMedia": {
"job": {
"id": "gid://shopify/Job/e1104bd6-4234-4b3e-b6d6-173c1d7e89f5",
"done": false
},
"mediaUserErrors": []
}
}
}
返されたジョブの ID を使って、再注文のジョブが完了したときにポーリングすることができます。
メディアオブジェクトの削除
製品からメディアアセットを削除するには、productDeleteMedia ミューテーションを使います。このミューテーションには 2 つの引数があります。
- productId - メディアを削除しようとする製品の ID。
-
mediaIds - 削除したいメディアの ID の配列。
次の例では、1 つの製品から 2 つのメディアアセットを削除します。
POST /admin/api/2020-01/graphql.json
mutation deleteProductMedia($id: ID!, $mediaIds: [ID!]!) {
productDeleteMedia(productId: $id, mediaIds: $mediaIds) {
deletedMediaIds
product {
id
}
mediaUserErrors {
code
field
message
}
}
}
{
"id": "gid://shopify/Product/1",
"mediaIds": [
"gid://shopify/ExternalVideo/1",
"gid://shopify/Video/2"
]
}
Open/Hide response
{
"data": {
"productDeleteMedia": {
"deletedMediaIds": [
"gid://shopify/ExternalVideo/1",
"gid://shopify/Video/2"
],
"product": {
"id": "gid://shopify/Product/1"
},
"mediaUserErrors": []
}
}
}
Storefront API を使用して製品のメディアを取得する
Storefront APIでは、Product タイプのmedia
フィールドを使用して、製品のメディアを照会します。フラグメントを使用して、可能なメディア タイプごとに返すフィールドを指定します。
POST /api/2020-01/graphql.json
Copy
{
node(id: "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzEwMDc5Nzg3NTMy") {
...on Product {
id
media(first: 10) {
edges {
node {
mediaContentType
alt
...mediaFieldsByType
}
}
}
}
}
}
fragment mediaFieldsByType on Media {
...on ExternalVideo {
id
host
embeddedUrl
}
...on MediaImage {
image {
originalSrc
}
}
...on Model3d {
sources {
url
mimeType
format
filesize
}
}
...on Video {
sources {
url
mimeType
format
height
width
}
}
}
Open/Hide response
{
"data": {
"node": {
"id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzEwMDc5Nzg3NTMy",
"media": {
"edges": [
{
"node": {
"mediaContentType": "VIDEO",
"alt": "Comparison video showing the different models of watches.",
"sources": [
{
"url": "https://videos.shopifycdn.com/c/vp/2a82811738ca41e7a508e6744028d169/SD-360p.mp4?Expires=1575744400&KeyName=core-signing-key-1&Signature=OPKELzhY-kYTx9QH9x6NJA9IqnI=",
"mimeType": "video/mp4",
"format": "mp4",
"height": 360,
"width": 640
}
]
}
},
{
"node": {
"mediaContentType": "IMAGE",
"alt": "Polaris watch",
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/1768/1717/products/IGQ.png?v=1560528103"
}
}
}
]
}
}
}
}
関連トピック
Status
製品の識別、フィルタリング、および管理にステータスを使用する
2020-10 バージョンのリリースでは、REST Admin API と GraphQL Admin API の両方で、製品リソースに status
フィールドが追加されました。
このガイドでは、製品のステータスに関連する変更点を紹介し、リクエストとレスポンスの例をいくつか示します。商品のステータスに関連する変更点の完全なリストについては、2020-10 のリリースノートを参照してください。
仕組み
status
フィールドを使用すると、現在の製品ステータス(ドラフト、アクティブ、アーカイブ)に基づいて、製品の識別、フィルタリング、および管理を行うことができます。
新しい製品をドラフトとして保存し、完成するまで繰り返し作業を行い、選択した販売チャネルで利用できるようにするためにアクティブなステータスにすることができます。また、販売を終了した製品をアーカイブすることで、すべての製品情報を保持しながら、製品リストを整理整頓することができます。
製品のステータスを取得する
REST Admin API または GraphQL Admin API を使用して、製品のステータスを照会できます。製品のステータスは、ドラフト、アクティブ、アーカイブのいずれかです。
REST
GET /admin/api/2020-10/products/3.json
{
"product": {
"id": 3,
"title": "Burton Custom Freestyle 151",
"body_html": "Good snowboard!",
"vendor": "Burton",
"product_type": "Snowboard",
"created_at": "2020-09-09T16:35:57-07:00",
"handle": "burton-custom-freestyle-151",
"updated_at": "2020-09-09T16:38:34-07:00",
"published_at": "2020-09-09T16:35:58-07:00",
"template_suffix": "",
"status": "active",
"published_scope": "web",
"tags": "sports, summer",
"admin_graphql_api_id": "gid://shopify/Product/3",
"variants": [
{
"id": 1,
"product_id": 3,
"title": "Default Title",
"price": "100.00",
"sku": "2834713834773462",
"position": 1,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Default Title",
"option2": null,
"option3": null,
"created_at": "2020-09-09T16:35:57-07:00",
"updated_at": "2020-09-09T16:37:47-07:00",
"taxable": true,
"barcode": "",
"grams": 3000,
"image_id": null,
"weight": 3,
"weight_unit": "kg",
"inventory_item_id": 37734050430998,
"inventory_quantity": 2,
"old_inventory_quantity": 2,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/5"
}
],
"options": [
{
"id": 123,
"product_id": 3,
"name": "Title",
"position": 1,
"values": [
"Default Title"
]
}
],
"images": [
{
"id": 234,
"product_id": 3,
"position": 1,
"created_at": "2020-09-09T16:38:34-07:00",
"updated_at": "2020-09-09T16:38:34-07:00",
"alt": null,
"width": 3264,
"height": 2448,
"src": "https://cdn.shopify.com/s/files/1/0262/2383/7206/products/snowboard.jpg?v=1",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/456"
}
],
"image": {
"id": 456,
"product_id": 3,
"position": 1,
"created_at": "2020-09-09T16:38:34-07:00",
"updated_at": "2020-09-09T16:38:34-07:00",
"alt": null,
"width": 3264,
"height": 2448,
"src": "https://cdn.shopify.com/s/files/1/0262/2383/7206/products/snowboard.jpg?v=1",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/456"
}
}
}
GraphQL
クエリ
{
product(id: "gid://shopify/Product/3") {
id
title
status
}
}
{
"data": {
"product": {
"id": "gid://shopify/Product/3",
"title": "Burton Custom Freestyle 151",
"status": "ACTIVE"
}
},
}
ステータスがアクティブな商品を取得する
商品をステータスでフィルタリングして、ショップの商品のサブセットを返すことができます。以下のクエリは、ステータスがアクティブな商品を返します。
REST
GET /admin/api/2020-10/products.json?status=active
{
"products": [
{
"id": 632910392,
"title": "IPod Nano - 8GB",
"body_html": "<p>It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.</p>",
"vendor": "Apple",
"product_type": "Cult Products",
"created_at": "2020-09-08T13:05:54-04:00",
"handle": "ipod-nano",
"updated_at": "2020-09-08T13:05:54-04:00",
"published_at": "2007-12-31T19:00:00-05:00",
"template_suffix": null,
"status": "active",
"published_scope": "web",
"tags": "Emotive, Flash Memory, MP3, Music",
"admin_graphql_api_id": "gid://shopify/Product/632910392",
"variants": [
{
"id": 808950810,
"product_id": 632910392,
"title": "Pink",
"price": "199.00",
"sku": "IPOD2008PINK",
"position": 1,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Pink",
"option2": null,
"option3": null,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"taxable": true,
"barcode": "1234_pink",
"grams": 567,
"image_id": 562641783,
"weight": 1.25,
"weight_unit": "lb",
"inventory_item_id": 808950810,
"inventory_quantity": 10,
"old_inventory_quantity": 10,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/808950810",
"presentment_prices": [
{
"price": {
"currency_code": "USD",
"amount": "199.00"
},
"compare_at_price": null
}
]
},
{
"id": 49148385,
"product_id": 632910392,
"title": "Red",
"price": "199.00",
"sku": "IPOD2008RED",
"position": 2,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Red",
"option2": null,
"option3": null,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"taxable": true,
"barcode": "1234_red",
"grams": 567,
"image_id": null,
"weight": 1.25,
"weight_unit": "lb",
"inventory_item_id": 49148385,
"inventory_quantity": 20,
"old_inventory_quantity": 20,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/49148385",
"presentment_prices": [
{
"price": {
"currency_code": "USD",
"amount": "199.00"
},
"compare_at_price": null
}
]
},
{
"id": 39072856,
"product_id": 632910392,
"title": "Green",
"price": "199.00",
"sku": "IPOD2008GREEN",
"position": 3,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Green",
"option2": null,
"option3": null,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"taxable": true,
"barcode": "1234_green",
"grams": 567,
"image_id": null,
"weight": 1.25,
"weight_unit": "lb",
"inventory_item_id": 39072856,
"inventory_quantity": 30,
"old_inventory_quantity": 30,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/39072856",
"presentment_prices": [
{
"price": {
"currency_code": "USD",
"amount": "199.00"
},
"compare_at_price": null
}
]
},
{
"id": 457924702,
"product_id": 632910392,
"title": "Black",
"price": "199.00",
"sku": "IPOD2008BLACK",
"position": 4,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Black",
"option2": null,
"option3": null,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"taxable": true,
"barcode": "1234_black",
"grams": 567,
"image_id": null,
"weight": 1.25,
"weight_unit": "lb",
"inventory_item_id": 457924702,
"inventory_quantity": 40,
"old_inventory_quantity": 40,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/457924702",
"presentment_prices": [
{
"price": {
"currency_code": "USD",
"amount": "199.00"
},
"compare_at_price": null
}
]
}
],
"options": [
{
"id": 594680422,
"product_id": 632910392,
"name": "Color",
"position": 1,
"values": [
"Pink",
"Red",
"Green",
"Black"
]
}
],
"images": [
{
"id": 850703190,
"product_id": 632910392,
"position": 1,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"alt": null,
"width": 123,
"height": 456,
"src": "https://cdn.shopify.com/s/files/1/0006/9093/3842/products/ipod-nano.png?v=1599584754",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/850703190"
},
{
"id": 562641783,
"product_id": 632910392,
"position": 2,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"alt": null,
"width": 123,
"height": 456,
"src": "https://cdn.shopify.com/s/files/1/0006/9093/3842/products/ipod-nano-2.png?v=1599584754",
"variant_ids": [
808950810
],
"admin_graphql_api_id": "gid://shopify/ProductImage/562641783"
}
],
"image": {
"id": 850703190,
"product_id": 632910392,
"position": 1,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"alt": null,
"width": 123,
"height": 456,
"src": "https://cdn.shopify.com/s/files/1/0006/9093/3842/products/ipod-nano.png?v=1599584754",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/850703190"
}
},
{
"id": 921728736,
"title": "IPod Touch 8GB",
"body_html": "<p>The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.</p>",
"vendor": "Apple",
"product_type": "Cult Products",
"created_at": "2020-09-08T13:05:54-04:00",
"handle": "ipod-touch",
"updated_at": "2020-09-08T13:05:54-04:00",
"published_at": "2008-09-25T20:00:00-04:00",
"template_suffix": null,
"status": "active",
"published_scope": "web",
"tags": "",
"admin_graphql_api_id": "gid://shopify/Product/921728736",
"variants": [
{
"id": 447654529,
"product_id": 921728736,
"title": "Black",
"price": "199.00",
"sku": "IPOD2009BLACK",
"position": 1,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "shipwire-app",
"inventory_management": "shipwire-app",
"option1": "Black",
"option2": null,
"option3": null,
"created_at": "2020-09-08T13:05:54-04:00",
"updated_at": "2020-09-08T13:05:54-04:00",
"taxable": true,
"barcode": "1234_black",
"grams": 567,
"image_id": null,
"weight": 1.25,
"weight_unit": "lb",
"inventory_item_id": 447654529,
"inventory_quantity": 13,
"old_inventory_quantity": 13,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/447654529",
"presentment_prices": [
{
"price": {
"currency_code": "USD",
"amount": "199.00"
},
"compare_at_price": null
}
]
}
],
"options": [
{
"id": 891236591,
"product_id": 921728736,
"name": "Title",
"position": 1,
"values": [
"Black"
]
}
],
"images": [],
"image": null
}
]
}
GraphQL
クエリ
{
products(first: 2, query:"status:active") {
edges {
node {
id
title
status
}
}
}
}
{
"data": {
"products": {
"edges": [
{
"node": {
"id": "gid://shopify/Product/632910392",
"title": "IPod Nano - 8GB",
"status": "ACTIVE"
}
},
{
"node": {
"id": "gid://shopify/Product/921728736",
"title": "IPod Touch 8GB",
"status": "ACTIVE"
}
},
]
}
}
}
ドラフト商品の新規作成
新しい製品を作成する際に、そのステータスを指定することができます。以下の例では、ステータスがドラフトの製品を作成する方法を示しています。
REST
POST /admin/api/2020-10/products.json
{
"product": {
"title": "Burton Custom Freestyle 151",
"body_html": "<strong>Good snowboard!</strong>",
"vendor": "Burton",
"product_type": "Snowboard",
"status": "draft"
}
}
"template_suffix": null,
"status": "draft",
"published_scope": "web",
"tags": "",
"admin_graphql_api_id": "gid://shopify/Product/4",
"variants": [
{
"id": 5,
"product_id": 4,
"title": "Default Title",
"price": "0.00",
"sku": "",
"position": 1,
"inventory_policy": "deny",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": null,
"option1": "Default Title",
"option2": null,
"option3": null,
"created_at": "2020-09-09T17:03:06-07:00",
"updated_at": "2020-09-09T17:03:06-07:00",
"taxable": true,
"barcode": null,
"grams": 0,
"image_id": null,
"weight": 0,
"weight_unit": "kg",
"inventory_item_id": 789,
"inventory_quantity": 0,
"old_inventory_quantity": 0,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/6"
}
],
"options": [
{
"id": 456,
"product_id": 4,
"name": "Title",
"position": 1,
"values": [
"Default Title"
]
}
],
"images": [],
"image": null
}
}
GraphQL
リクエスト
次のリクエスト例は、productCreate ミューテーションを使用して新しいドラフト製品を作成する方法を示しています。
備考
特定のミューテーションは、製品の公開または公開解除に使用できます。
-
publishablePublish
とpublishablePublishToCurrentChannel
です。これらのミューテーションを製品に使用した場合、その製品がアクティブな状態である場合にのみ発行されます。製品のステータスがドラフトまたはアーカイブの場合は、チャネルに公開の意図が作成されます。製品のステータスがアクティブになると、その製品はパブリッシュされます。 -
publishableUnpublish
およびpublishableUnpublishToCurrentChannel
これらのミューテーションを製品に使用した場合、製品のステータスがアクティブである場合に限り、その製品は指定されたチャネルからアンパブリッシュされます。製品のステータスがドラフトまたはアーカイブである場合、公開の意図はそのチャネルから削除されます。
mutation {
productCreate(
input: {
title: "Burton Custom Freestyle 151"
productType: "Snowboard"
vendor: "Burton"
status: "DRAFT"
}
) {
product {
id
status
}
}
}
{
"data": {
"productCreate": {
"product": {
"id": "gid://shopify/Product/4",
"status": "DRAFT"
}
}
}
}
製品のステータスを更新する
製品のステータスは、いつでも変更することができます。以下の例では、製品のステータスをアーカイブに更新する方法を示しています。
REST
PUT /admin/api/2020-10/products/3.json
備考
PUT /admin/api/{version}/product_listings/{product_listing_id}.json は、製品がアクティブな状態にある場合にのみ、製品リストを作成します。製品のステータスがドラフトまたはアーカイブの場合は、チャネルに公開の意図が作成されます。商品のステータスがアクティブになると、そのチャンネルの商品リストが自動的に作成されます。
{
"product": {
"id": 3,
"status": "archived"
}
}
{
"product": {
"id": 3,
"title": "Burton Custom Freestyle 151",
"body_html": "Good snowboard!",
"vendor": "Burton",
"product_type": "Snowboard",
"created_at": "2020-09-09T16:35:57-07:00",
"handle": "burton-custom-freestyle-151",
"updated_at": "2020-09-09T16:38:34-07:00",
"published_at": "2020-09-09T16:35:58-07:00",
"template_suffix": "",
"status": "archived",
"published_scope": "web",
"tags": "sports, summer",
"admin_graphql_api_id": "gid://shopify/Product/3",
"variants": [
{
"id": 1,
"product_id": 3,
"title": "Default Title",
"price": "100.00",
"sku": "2834713834773462",
"position": 1,
"inventory_policy": "continue",
"compare_at_price": null,
"fulfillment_service": "manual",
"inventory_management": "shopify",
"option1": "Default Title",
"option2": null,
"option3": null,
"created_at": "2020-09-09T16:35:57-07:00",
"updated_at": "2020-09-09T16:37:47-07:00",
"taxable": true,
"barcode": "",
"grams": 3000,
"image_id": null,
"weight": 3,
"weight_unit": "kg",
"inventory_item_id": 37734050430998,
"inventory_quantity": 2,
"old_inventory_quantity": 2,
"requires_shipping": true,
"admin_graphql_api_id": "gid://shopify/ProductVariant/5"
}
],
"options": [
{
"id": 123,
"product_id": 3,
"name": "Title",
"position": 1,
"values": [
"Default Title"
]
}
],
"images": [
{
"id": 234,
"product_id": 3,
"position": 1,
"created_at": "2020-09-09T16:38:34-07:00",
"updated_at": "2020-09-09T16:38:34-07:00",
"alt": null,
"width": 3264,
"height": 2448,
"src": "https://cdn.shopify.com/s/files/1/0262/2383/7206/products/snowboard.jpg?v=1",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/456"
}
],
"image": {
"id": 456,
"product_id": 3,
"position": 1,
"created_at": "2020-09-09T16:38:34-07:00",
"updated_at": "2020-09-09T16:38:34-07:00",
"alt": null,
"width": 3264,
"height": 2448,
"src": "https://cdn.shopify.com/s/files/1/0262/2383/7206/products/snowboard.jpg?v=1",
"variant_ids": [],
"admin_graphql_api_id": "gid://shopify/ProductImage/456"
}
}
}
GraphQL
Request
製品のステータスを変更するには、productUpdate
または productChangeStatus
ミューテーションを使用します。次の例では、productUpdate
ミューテーションを使用しています。
mutation {
productUpdate(
input: {
id: "gid://shopify/Product/3"
title: "Burton Custom Freestyle 151"
status: "ARCHIVED"
}
) {
product {
id
status
}
}
}
{
"data": {
"productUpdate": {
"product": {
"id": "gid://shopify/Product/3",
"status": "ARCHIVED"
}
}
}
}
Variant media
GraphQL Admin API によるバリアントのメディア管理
バージョン 2020-10 では、GraphQL Admin API を使って、商品のバリアントにイメージタイプのメディアオブジェクトを追加できるようになりました。
たとえば、製品、バリアント、メディアオブジェクトを作成して、メディアオブジェクトをバリアントに添付することが 1 つのステップで可能です。また、商品のメディアをそのバリアントに関連付けることもできます。
このガイドでは、GraphQL Admin API を使用して製品バリアントのメディアを管理する方法を説明します。
必要条件
- Getting started with the GraphQL Admin and REST Admin APIs ガイドを完了し、API で認証されていること。
- 開発ストアで商品と商品バリエーションを作成している。
スコープ
variant media GraphQL mutations を使用するには、アプリが Shopify ストアに対して以下のアクセススコープを要求する必要があります。
- read_products:商品の読み取りを許可します。
- write_products:商品に対するミューテーションの書き込みを許可します。
注意点
- メディアの入力には配列を使用できますが、バージョン 2020-10 では、入力できるメディアオブジェクトは 1 つに制限されており、画像である必要があります。
-
productVariantCreate
では、mediaSrc
属性は現在動作しません。
製品の問い合わせとそのバリアントの表示
以下のクエリは、製品のバリアントに添付されている画像メディアオブジェクトの情報を返します。
リクエスト
POST /admin/api/2020-10/graphql.json
query {
product(id: "gid://shopify/Product/1") {
title
variants(first: 10) {
edges {
node {
selectedOptions {
name
value
}
media(first: 10) {
edges {
node {
alt
mediaContentType
status
__typename
... on MediaImage {
id
preview {
image {
originalSrc
}
}
__typename
}
}
}
}
}
}
}
}
}
{
"data": {
"product": {
"title": "Polaris Watch",
"variants": {
"edges": [
{
"node": {
"selectedOptions": [
{
"name": "Width",
"value": "24m"
},
{
"name": "Length",
"value": "30m"
}
],
"media": {
"edges": [
{
"node": {
"alt": "Girl in a t-shirt",
"mediaContentType": "IMAGE",
"status": "READY",
"__typename": "MediaImage",
"id": "gid://shopify/MediaImage/42729528",
"preview": {
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/1768/1717/products/StockSnap_9NPZZJCWW3_copy.jpg?v=1566862515"
}
}
}
}
]
}
}
}
]
}
}
},
"extensions": {
"cost": {
"requestedQueryCost": 343,
"actualQueryCost": 46,
"throttleStatus": {
"maximumAvailable": 1000,
"currentlyAvailable": 954,
"restoreRate": 50
}
}
}
}
製品を作成し、そのバリアントにメディアを関連付ける
productCreate ミューテーションを使用して新しい製品を作成する際に、mediaSrc
属性を含めて、バリアントに関連付けるメディアの URL を指定することができます。このフィールドは、製品に作成したメディアの originalSource
フィールドの 1 つと一致します。
バリアントのオプションを作成する際には、options
の値が含まれていることを確認してください。これらの値は、商品に設定されているオプションと一致する必要があります。例えば、商品にバリアントオプション ["Color", "Size"]
が設定されている場合、各バリアントには ["Red", "M"]
のように色とサイズのオプションが必要です。
リクエスト
POST /admin/api/2020-10/graphql.json
mutation productCreate($input: ProductInput!, $media: [CreateMediaInput!]) {
productCreate(input: $input, media: $media) {
product {
id
variants(first: 10) {
edges {
node {
selectedOptions {
name
value
}
media(first: 10) {
edges {
node {
... on MediaImage {
id
alt
image {
originalSrc
}
}
}
}
}
}
}
}
}
userErrors {
field
message
}
}
}
{
"media": [
{
"mediaContentType": "IMAGE",
"originalSource": "https://cdn.come/red_t_shirt.jpg"
},
{
"mediaContentType": "IMAGE",
"originalSource": "https://cdn.come/yellow_t_shirt.jpg"
}
],
"input": {
"title": "T-shirt",
"options": [
"Color", "Size"
],
"variants": [
{
"mediaSrc": ["https://cdn.come/red_t_shirt.jpg"],
"options": ["Red", "M"]
},
{
"mediaSrc": ["https://cdn.come/red_t_shirt.jpg"],
"options": ["Red", "L"]
},
{
"mediaSrc": ["https://cdn.come/yellow_t_shirt.jpg"],
"options": ["Yellow", "M"]
},
{
"mediaSrc": ["https://cdn.come/yellow_t_shirt.jpg"],
"options": ["Yellow", "L"]
}
]
}
}
{
"data": {
"productCreate": {
"product": {
"id": "gid://shopify/Product/1",
"variants": {
"edges": [
{
"node": {
"selectedOptions": [
{
"name": "Color",
"value": "Red"
},
{
"name": "Size",
"value": "M"
}
],
"media": {
"edges": [
{
"node": {
"id": "gid://shopify/MediaImage/1489599037496",
"alt": "Girl in a red medium-sized t-shirt",
"image": null
}
}
]
}
}
},
{
"node": {
"selectedOptions": [
{
"name": "Color",
"value": "Red"
},
{
"name": "Size",
"value": "L"
}
],
"media": {
"edges": [
{
"node": {
"id": "gid://shopify/MediaImage/1489599037496",
"alt": "Girl in a red large-sized t-shirt",
"image": null
}
}
]
}
}
},
{
"node": {
"selectedOptions": [
{
"name": "Color",
"value": "Yellow"
},
{
"name": "Size",
"value": "M"
}
],
"media": {
"edges": [
{
"node": {
"id": "gid://shopify/MediaImage/1489599070264",
"alt": "Girl in a yellow medium-sized t-shirt",
"image": null
}
}
]
}
}
},
{
"node": {
"selectedOptions": [
{
"name": "Color",
"value": "Yellow"
},
{
"name": "Size",
"value": "L"
}
],
"media": {
"edges": [
{
"node": {
"id": "gid://shopify/MediaImage/1489599070264",
"alt": "Girl in a yellow large-sized t-shirt",
"image": null
}
}
]
}
}
}
]
}
},
"userErrors": []
}
},
"extensions": {
"cost": {
"requestedQueryCost": 252,
"actualQueryCost": 36,
"throttleStatus": {
"maximumAvailable": 1000,
"currentlyAvailable": 964,
"restoreRate": 50
}
}
}
}
既存の製品バリアントにメディアを添付する
メディアオブジェクトを既存の製品バリアントにアタッチするには、次のようにする必要があります。
- productCreateMedia ミューテーションを使用して、製品にメディアを作成する。
- 製品にバリアントがない場合は、製品に少なくとも 1 つのバリアントを作成する必要があります。
詳細については、 productCreate、 productUpdate、 productVariantCreate の各ミューテーションを参照してください。
メディアオブジェクトとバリアントを持つ製品がある場合、次のクエリ例に示すように、 productVariantAppendMedia ミューテーションを使用して、メディア ID
を 1 つ以上のバリアント ID
に関連付けることができます。
リクエスト
POST /admin/api/2020-10/graphql.json
mutation ($variantMedia: [ProductVariantAppendMediaInput!]!) {
productVariantAppendMedia(productId: "gid://shopify/Product/1", variantMedia: $variantMedia) {
product {
id
}
productVariants {
media(first: 10) {
edges {
node {
mediaContentType
preview {
image {
originalSrc
}
}
}
}
}
}
userErrors {
code
field
message
}
}
}
{
"variantMedia": [
{
"variantId": "gid://shopify/ProductVariant/1",
"mediaIds": ["gid://shopify/MediaImage/1"]
},
{
"variantId": "gid://shopify/ProductVariant/2",
"mediaIds": ["gid://shopify/MediaImage/1"]
},
{
"variantId": "gid://shopify/ProductVariant/3",
"mediaIds": ["gid://shopify/MediaImage/2"]
},
{
"variantId": "gid://shopify/ProductVariant/4",
"mediaIds": ["gid://shopify/MediaImage/2"]
}
]
}
{
"data": {
"productVariantAppendMedia": {
"product": {
"id": "gid://shopify/Product/1"
},
"productVariants": [
{
"media": {
"edges": [
{
"node": {
"mediaContentType": "IMAGE",
"preview": {
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/0013/1245/6760/products/istock_e4f127b277.jpg?v=151354"
}
}
}
}
]
}
},
{
"media": {
"edges": [
{
"node": {
"mediaContentType": "IMAGE",
"preview": {
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/0013/1245/6760/products/istock_e4f127b277.jpg?v=151354"
}
}
}
}
]
}
},
{
"media": {
"edges": [
{
"node": {
"mediaContentType": "IMAGE",
"preview": {
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/0013/1245/6760/products/istock_00004f2ea339.jpg?v=13783"
}
}
}
}
]
}
},
{
"media": {
"edges": [
{
"node": {
"mediaContentType": "IMAGE",
"preview": {
"image": {
"originalSrc": "https://cdn.shopify.com/s/files/1/0013/1245/6760/products/istock_00004f2ea339.jpg?v=13783"
}
}
}
}
]
}
}
],
"userErrors": []
}
},
"extensions": {
"cost": {
"requestedQueryCost": 42,
"actualQueryCost": 30,
"throttleStatus": {
"maximumAvailable": 1000,
"currentlyAvailable": 970,
"restoreRate": 50
}
}
}
}
バリアントからメディアを切り離す
バリアントからメディアを切り離すには、 productVariantDetachMedia ミューテーションを使います。
このミューテーションを使用すると、メディアはバリアントに関連付けられなくなりますが、メディアは製品に関連付けられたままになります。productDeleteMedia
ミューテーションを使用すると、製品からメディアを削除することもできます。
次の例は、productVariantDetachMedia
ミューテーションを使用して、製品バリアントからメディアオブジェクトの関連付けを解除する方法を示しています。
リクエスト
POST /admin/api/2020-10/graphql.json
mutation productVariantDetachMedia($variantMedia: [ProductVariantDetachMediaInput!]!) {
productVariantDetachMedia(productId: "gid://shopify/Product/1", variantMedia: $variantMedia) {
product {
id
}
productVariants {
id
media(first: 10) {
edges {
node {
preview {
image {
originalSrc
}
}
}
}
}
}
userErrors {
field
message
}
}
}
{
"variantMedia": [
{
"variantId": "gid://shopify/ProductVariant/1",
"mediaIds": [
"gid://shopify/Media/1"
]
},
{
"variantId": "gid://shopify/ProductVariant/2",
"mediaIds": [
"gid://shopify/Media/2"
]
}
]
}
{
"data": {
"productVariantDetachMedia": {
"product": {
"id": "gid://shopify/Product/1"
},
"productVariants": [
{
"id": "gid://shopify/ProductVariant/1",
"media": {
"edges": []
}
},
{
"id": "gid://shopify/ProductVariant/2",
"media": {
"edges": []
}
}
],
"userErrors": []
}
},
"extensions": {
"cost": {
"requestedQueryCost": 42,
"actualQueryCost": 14,
"throttleStatus": {
"maximumAvailable": 1000,
"currentlyAvailable": 986,
"restoreRate": 50
}
}
}
}
Shopify アプリのご紹介
Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。
Shopify アプリである、「らくらく日本語フォント設定|リテリア Font Picker」は、ノーコードで日本語フォントを使用できるアプリです。日本語フォントを導入することでブランドを演出することができます。
Discussion