What's your biggest current challenge? Have your say in Community Polls along the right column.
Our Partner & Developer boards on the community are moving to a brand new home: the .dev community forums! While you can still access past discussions here, for all your future app and storefront building questions, head over to the new forums.

Re: Why the JSON data in product-handle-js differs depending on the store

Why the JSON data in product-handle-js differs depending on the store

ptt-kmatsubara
Shopify Partner
66 0 4

As a prerequisite, this API is used to obtain sellingPlan information.
https://shopify.dev/docs/api/ajax/reference/product#get-locale-products-product-handle-js


For a product that includes three variations, if you associate plan group A with the first variation and plan group A with the second variation, the structure of the JSON data returned will differ depending on the store.

 

What is the reason for this difference?

 

correct JSON data

{
  "selling_plan_groups": [
    {
      "id": "de6ea32ed60090ea69fcd92c946ca3fe6a7743d0",
      "name": "ウィジェット検証用1",
      "options": [
        {
          "name": "ウィジェット検証用1",
          "position": 1,
          "values": ["プラン1"]
        }
      ],
      "selling_plans": [
        {
          "id": 8612348198,
          "name": "プラン1",
          "description": "",
          "options": [
            {
              "name": "ウィジェット検証用1",
              "position": 1,
              "value": "プラン1"
            }
          ],
          "recurring_deliveries": true,
          "price_adjustments": [
            {
              "order_count": null,
              "position": 1,
              "value_type": "percentage",
              "value": 5
            }
          ]
        }
      ],
      "app_id": null
    },
    {
      "id": "a0a0af06a4f3877b0e50310c03e70690aff58dc3",
      "name": "ウィジェット検証用2",
      "options": [
        {
          "name": "ウィジェット検証用2",
          "position": 1,
          "values": ["プラン1"]
        }
      ],
      "selling_plans": [
        {
          "id": 8612380966,
          "name": "プラン1",
          "description": "",
          "options": [
            {
              "name": "ウィジェット検証用2",
              "position": 1,
              "value": "プラン1"
            }
          ],
          "recurring_deliveries": true,
          "price_adjustments": [
            {
              "order_count": null,
              "position": 1,
              "value_type": "percentage",
              "value": 5
            }
          ]
        }
      ],
      "app_id": null
    }
  ]
}

 

Incorrect JSON data

For some reason, they are consolidated into one plan group.

{
  "selling_plan_groups": [
    {
      "id": "9b03a6290bf8382c19a4ec723375ad1f75c4da50",
      "name": "通常配送より5%オフ!",
      "options": [
        {
          "name": "通常配送より5%オフ!",
          "position": 1,
          "values": ["お得用1ヶ月分", "お得用3ヶ月分"]
        }
      ],
      "selling_plans": [
        {
          "id": 689486332187,
          "name": "お得用1ヶ月分",
          "description": "毎月1回、商品を配送いたします。",
          "options": [
            {
              "name": "通常配送より5%オフ!",
              "position": 1,
              "value": "お得用1ヶ月分"
            }
          ],
          "recurring_deliveries": true,
          "price_adjustments": [
            {
              "order_count": null,
              "position": 1,
              "value_type": "percentage",
              "value": 5
            }
          ]
        },
        {
          "id": 689486364955,
          "name": "お得用3ヶ月分",
          "description": "3ヶ月毎に1回、商品を配送いたします。",
          "options": [
            {
              "name": "通常配送より5%オフ!",
              "position": 1,
              "value": "お得用3ヶ月分"
            }
          ],
          "recurring_deliveries": true,
          "price_adjustments": [
            {
              "order_count": null,
              "position": 1,
              "value_type": "percentage",
              "value": 5
            }
          ]
        }
      ],
      "app_id": null
    }
  ]
}
Replies 10 (10)

SBD_
Shopify Staff
1831 273 421

Hey @ptt-kmatsubara 

 

Products can have multiple selling plan groups (e.g. 'Subscribe and save', 'Prepaid') and each selling plan group can have multiple selling plans (.e.g 'Delivery Weekly', 'Delivery Monthly').

 

More info here: https://shopify.dev/docs/apps/selling-strategies/subscriptions/selling-plans

Scott | Developer Advocate @ Shopify 

ptt-kmatsubara
Shopify Partner
66 0 4

Thank you for your reply.

 

yes. I understand their behavior.
The problem is that even though multiple plan groups are linked, the JSON data is treated as if it were a single plan group.
The JSON data provided by Shopify is inconsistent with the information that can be obtained using AdminAPI.

SBD_
Shopify Staff
1831 273 421

Hey @ptt-kmatsubara 

 

Can you please DM me store details so I can investigate?

Scott | Developer Advocate @ Shopify 

ptt-kmatsubara
Shopify Partner
66 0 4

日本語で失礼します。

対象の商品は下記となります。

https://lachaton.jp/products/test.js

^ こちらのJSONデータで提供される情報として、下記のように1プラングループに対し、2プラン紐づけがあるようなJSONデータが返却されています。

 

 

 

{
    "selling_plan_groups": [
        {
            "id": "168e14bb2598ba7406f54360cedcbd7436f2815a",
            "name": "通常配送よりさらに5%オフ!",
            "options": [
                {
                    "name": "通常配送よりさらに5%オフ!",
                    "position": 1,
                    "values": [
                        "お得用1ヶ月分",
                        "お得用3ヶ月分"
                    ]
                }
            ],
            "selling_plans": [
                {
                    "id": 689584111899,
                    "name": "お得用1ヶ月分",
                    "description": "毎月1回、商品を配送いたします。",
                    "options": [
                        {
                            "name": "通常配送よりさらに5%オフ!",
                            "position": 1,
                            "value": "お得用1ヶ月分"
                        }
                    ],
                    "recurring_deliveries": true,
                    "price_adjustments": [
                        {
                            "order_count": null,
                            "position": 1,
                            "value_type": "percentage",
                            "value": 5
                        }
                    ]
                },
                {
                    "id": 689584144667,
                    "name": "お得用3ヶ月分",
                    "description": "毎月1回、商品を配送いたします。",
                    "options": [
                        {
                            "name": "通常配送よりさらに5%オフ!",
                            "position": 1,
                            "value": "お得用3ヶ月分"
                        }
                    ],
                    "recurring_deliveries": true,
                    "price_adjustments": [
                        {
                            "order_count": null,
                            "position": 1,
                            "value_type": "percentage",
                            "value": 5
                        }
                    ]
                }
            ],
            "app_id": null
        }
    ]
}

 

 

 

また、AdminAPI実行時に返却される情報は下記となります。

(3つあるバリエーションのうち2つにそれぞれ1つプラングループ紐づけ)

 

 

{
    "data": {
        "product": {
            "title": "(検証用)極上ナチュラルチキンペースト",
            "variants": {
                "edges": [
                    {
                        "node": {
                            "id": "gid://shopify/ProductVariant/47093534523675",
                            "title": "1week",
                            "sellingPlanGroupCount": 0,
                            "sellingPlanGroups": {
                                "edges": []
                            }
                        }
                    },
                    {
                        "node": {
                            "id": "gid://shopify/ProductVariant/47093534589211",
                            "title": "お得用1ヶ月",
                            "sellingPlanGroupCount": 1,
                            "sellingPlanGroups": {
                                "edges": [
                                    {
                                        "node": {
                                            "id": "gid://shopify/SellingPlanGroup/77200916763",
                                            "name": "通常配送よりさらに5%オフ!"
                                        }
                                    }
                                ]
                            }
                        }
                    },
                    {
                        "node": {
                            "id": "gid://shopify/ProductVariant/47093534621979",
                            "title": "お得用3ヶ月",
                            "sellingPlanGroupCount": 1,
                            "sellingPlanGroups": {
                                "edges": [
                                    {
                                        "node": {
                                            "id": "gid://shopify/SellingPlanGroup/77200949531",
                                            "name": "通常配送よりさらに5%オフ!"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        }
    },
    "extensions": {
        "cost": {
            "requestedQueryCost": 133,
            "actualQueryCost": 14,
            "throttleStatus": {
                "maximumAvailable": 1000.0,
                "currentlyAvailable": 986,
                "restoreRate": 50.0
            }
        }
    }
}

 

 

 

こちらの想定するJSONとしては下記のような構成となります。

(2つプラングループがある状態)

 

 

 

{
  "selling_plan_groups": [
    {
      "id": "aaaa",
      "selling_plans": [
        { "id": 689486332187 },
      ]
    },
    {
      "id": "bbbb",
      "selling_plans": [
        { "id": 689486332187 },
      ]
    }
  ]
}

 

 

junichiokamura
Community Manager
1201 280 509

こちらですが、同じ名称で違うデータを参照していたりしませんか? Ajax APIのレスポンスにproduct 情報を含めることはできますか? 

Senior Partner Solutions Engineer
ptt-kmatsubara
Shopify Partner
66 0 4

こちらでよろしいでしょうか。

https://lachaton.jp/products/test.js

 

該当のストア様の商品となります。

こちらの商品は3つのバリエーションが有り、

「1week」・・・プラングループ紐づけ無し

「お得用1ヶ月」・・・プラングループID「77200916763」を紐づけ

「お得用3ヶ月」・・・プラングループID「77200949531」を紐づけ

といった構成になっています。(gidからShopifyの管理部分の文字列は省略しています)

junichiokamura
Community Manager
1201 280 509

こちらですが、原因は、2つのGroupが同じ名前で登録されているのでマージされているのではないかと思います。Group名を片方変えた場合、どうなりますか?

Senior Partner Solutions Engineer
ptt-kmatsubara
Shopify Partner
66 0 4

ありがとうございます。Group名を別にした場合、期待するJSONデータが返却されるようになりました。

 

状況整理すると、異なるIDのプラングループを紐づけても名前が同一のものは1つのプラングループとなるようマージされる仕様(バグではなく)となっている。

という解釈でよろしいでしょうか。

junichiokamura
Community Manager
1201 280 509

公式な記載はありませんが、JSONのデータのgroupのIDは、Admin GraphQLでかえってきているIDの値と異なっており、これは、Admin APIの仕様ではなくて、Storefront APIの仕様に準拠していると見えます。
https://shopify.dev/docs/api/storefront/unstable/objects/SellingPlanGroup

Strorefront APIで、product > SellingPlanGroupを参照すると、IDはレスポンスに含まれないため、同一名称はマージされるものと思います。

Senior Partner Solutions Engineer
ptt-kmatsubara
Shopify Partner
66 0 4

承知いたしました。ありがとうございました。