Shopify から提供されている GraphQL API を使って、公開状態(status が active)のものを取得する方法です。
※この内容は API のバージョン 2020/10 時点のものになります。
準備
https://shopify-graphiql-app.shopifycloud.com/
こちらのプラグインを入れておくと、GraphiQL を管理画面上で使えて便利です。
Products で取得してみる(失敗)
まず、Shopify 公式サイトにある API のリファレンスを確認してみます。今回は商品情報を取得するので、Product のフィールドを見てみます。
https://shopify.dev/docs/admin-api/graphql/reference/object/product?api%5Bversion%5D=2020-10
status ( ProductStatus! ) | The product status. Product statuses aren’t currently available to stores on the Shopify Plus plan. |
どうやら status が Product の公開状態を表しているようです(Shopify Plus Plan だと使えないっぽい?)
いったん status の中身を見てみようと思い GraphiQL で試してみました。Products で複数の商品情報を取得できるのですが、試してみるとそもそもスキーマに status がありませんでした…。
そのため、取得しようとするとエラーになります。
query {
products(first: 10) {
edges {
node {
id
title
status # エラーになる
}
}
}
}
そもそも Products クエリに引数を渡して、status が active のものを探したかったんですが、Products に status を渡すようなものが無いのでダメそう。
https://shopify.dev/docs/admin-api/graphql/reference/queryroot
ProductVariants で取得してみる(成功)
先ほどのリンクの Products クエリの下にある ProductVariants クエリを見てみます。ProductVariant には商品の価格とか数量とか、商品に関する情報が入っています。
こいつの引数を見てみると、query というものを設定できるようです。これは Products の方にもありますが、こちらはサポートしているパラメータとして product_status
というものを設定できるようです(Products には無い)。
これならステータスを設定できそうです。
公開状態の商品を取得するクエリ
query のパラメータは、search syntax という Shopify 特有?のクエリを文字列として設定するみたいです。query=***
みたいに書いてあってよく分からんなと思いましたが、普通にquery:"条件"
を渡せばいいようです。
以下で取得することが出来 ました。
query {
productVariants(first: 10, query:"product_status:active") {
edges {
node {
product {
id
title
}
price
}
}
}
}
productVariants の node では product の情報も取れるので一緒に取得しています。
ちなみに query に設定した Product の status には、
- ACTIVE … 公開
- ARCHIVED … アーカイブ
- DRAFT … 下書き
の3つがあります。リファレンスの ProductStatus を見ると大文字なんですが、小文字でないとダメでした。
bulkOperationRunQuery
を使うとか他の方法もありそうですが、とりあえず以上です。