【Shopify】Graphql で公開状態の商品を取得する

  • Shopify

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を使うとか他の方法もありそうですが、とりあえず以上です。