FROM CACHE - jp_header

REST API で Product 情報の全部を取得できない

解決済
WEBUILD
Shopify Partner
31 10 33

REST API エンドポイント /admin/api/2020-01/products.json
にアクセスし、Product 情報を取得しようとしています。

一度のリクエストでの取得上限は250であるため、
最後の行のproduct idを取得し、2回目以降のリクエストに since_id を指定してループ処理しています。

これで全商品が取得できるかと思いきや
どうも一部欠落しているようです。

コードが悪いのかと思い、ブラウザでURLを直接入力してテストしてみてもやはりレスポンスの数が
Product の総数と一致しません。

REST API エンドポイント /admin/api/2020-01/products/count.json

でproductの総数をチェックしてみたところ、810アイテムでしたが
上記のsince_idで1ページずつチェックした結果、2ページ + 86アイテムで 586アイテムしか取得できませんでした。

なにか他に全商品を取得する方法はありますでしょうか。それとも間違いを犯してしまっているのでしょうか。

 

 

1 件の受理された解決策

ベストソリューション
WEBUILD
Shopify Partner
31 10 33

成功

自己解決しました。
やはりどうやら Since_id というのは そのidから先の商品って感じでもなさそうです。
なぜこんな仕様なのか、なにに使うのかイメージがわきませんんが。。。

すべての商品情報が欲しい場合は

エンドポイント admin/api/2020-01/products.json

にアクセスした際にレスポンスヘッダーに返される値に含まれる

Link情報を使用します。
内部的にページネーション用のオブジェクトが作られている?らしく

このリンクには現在表示されているページの前後のページ用のURLが記載されています。

 

公式リファレンスはこちら 

 

注意すべき点は、僕もハマったのですがphpなどで受け取ったレスポンスヘッダーを

文字列で出力してみても、このLinkに含まれるURL文字列は見た目には表示されません。

これでURL取得できないやん!!っとなりますが、ソースコードで見るとたしかに入ってますので安心してください。

 

なので情報としては取得できているので、あとは不要な部分をカットしてURLのみにして

イテレーションしてあげれば全商品の取得が可能になります。

なにかのお役に立てれば幸いです。

元の投稿で解決策を見る

2件の返信2
WEBUILD
Shopify Partner
31 10 33

成功

自己解決しました。
やはりどうやら Since_id というのは そのidから先の商品って感じでもなさそうです。
なぜこんな仕様なのか、なにに使うのかイメージがわきませんんが。。。

すべての商品情報が欲しい場合は

エンドポイント admin/api/2020-01/products.json

にアクセスした際にレスポンスヘッダーに返される値に含まれる

Link情報を使用します。
内部的にページネーション用のオブジェクトが作られている?らしく

このリンクには現在表示されているページの前後のページ用のURLが記載されています。

 

公式リファレンスはこちら 

 

注意すべき点は、僕もハマったのですがphpなどで受け取ったレスポンスヘッダーを

文字列で出力してみても、このLinkに含まれるURL文字列は見た目には表示されません。

これでURL取得できないやん!!っとなりますが、ソースコードで見るとたしかに入ってますので安心してください。

 

なので情報としては取得できているので、あとは不要な部分をカットしてURLのみにして

イテレーションしてあげれば全商品の取得が可能になります。

なにかのお役に立てれば幸いです。

masayasuishida
新規メンバー
1 0 0

最近Shopifyパートナー登録をしまして、早速、以下リンクのドキュメントに従ってphpで商品情報を取得してみたのですが、250を超えて取得できないという同じ事象で悩んでました。
https://www.shopify.jp/blog/partner-shopify-access-token-generate

ナイス情報、有難うございます!

上記ドキュメントのサンプルコードは「https://github.com/nyalex/shopify-generating-api-token-guide」からダウンロードしました。
上記コードでLink情報を取得するには、「functions.php」の55行目
$h = explode(":", $part);
これを
$h = preg_split('/:/', $part, 2);
に書き換えたら、

$limit = 100;
$products = shopify_call($token, $shop, "/admin/products.json", array('limit'=>$limit), 'GET');
echo $products['headers']['Link'];

でLink情報を取得できました。有難うございました。

Since_idの使用方法は未だに不明です・・・