vendorに属する商品の取得方法として良いものが浮かばず悩んでいましたが、フィルターを使えば簡単に実現できたのでメモとして。
実現したいこと
- Shopifyで特定vendorに属する商品を表示させたい
- コレクションは作成しない
vendorは日本語環境では「販売元」と表示さており、今回はこのvendorを軸にして商品リストを作成することを目指します。
コレクションを使う方法
通常はvendorごとにコレクションを作成することになると思います。
コレクションとして作るとコードを書く必要はありませんし、OS2.0対応テーマであればテーマエディタで便利に扱えますからおすすめです。
サンプルコード
vendorとして「my-shop」という名称が登録されている前提。
{% paginate collections.all.products by 100 %}
{% assign product_list = collections.all.products | where: "vendor", "my-shop" %}
{% endpaginate %}
以下で値を確認。
{{ product_list | json }}
単純に、collections.all.productsに対してwhereフィルターを使うだけで実現できました。
vendorのハンドル
vendorには半角スペースや日本語など色々と入力できますが、whereフィルターで用いる場合にはhandle形式になっている必要があります。
そのため以下のhandleizeフィルターを使って事前に変換しておく方が安全です。
扱える商品点数の制限
Shopifyの1ページあたりの商品上限数である50個を超えない限り、希望する数の商品を表示できます。
上記にあるように、通常では50商品までしか商品データを取得できません。
そこでpaginateを使って無理やり取得できる商品点数を増やしています。
この方法は以下フォーラムやそのほかのサイトでも紹介されています。
留意事項
制限が課せられているには理由があるはずで、おそらくShopifyのシステムに対する負荷軽減目的だと思われます。
現状ではこれしか手がないようなので使わざるを得ないものの、この方法を利用するストアが増えれば増えるほど問題は深刻になり、やがては使用できなくなるかもしれない可能性は頭の隅においておく必要があるかもしれません。
そのため、本当に50以上の商品を取得する必要があるのか点は常に意識しておいた方がよいと思います。
vendor
把握しかねていますがvendorには以下のような特徴があるようです。
- URLはmyshopify.com/collections/vendors?q=my-shopのようになる
- vendorはコレクションではない(collections['vendors']やcollections['my-shop']では商品データ取得できない)
- vendorオブジェクトというものは存在しない
URLから解釈するなら「vendorの名称をクエリとして投げて取得しており、表示する際にコレクションを利用している」ということになるかもしれません。
そのためproductsやcollectionsなどのglobalオブジェクトとしてvendorsが存在しているわけではないようです。
結び
当初はforループの中でvendorを取得して比較し、リストを作成するしかないのかなと考えていましたが、whereフィルターで簡単に解決できました。
とはいえ冒頭に記載した通りコレクションを作れば済む話ではあるので、あまり利用する機会はない方法だとは思います。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。