Shopifyで配列の中に特定の文字列が含まれているか否かを調べる

試行錯誤の結果のメモですが、もしかしましたら求める動作をする正規の方法があるかもしれず、内容の有益性は保証できません。

実現したいこと

  • ShopifyのLiquidファイル上での動作が対象
  • article.tagsなどの配列の中に特定の文言があるかどうかを調べる

ShopifyにはPHPのin_array()のような機能がないようなので、別の方法でどうにかできないかと試作したものです。

サンプル


{% if article.tags contains 'target'  %}
  {% assign flag = true %}
{% else %}
  {% assign flag = false %}
{% endif %}

{% if flag %}
目的の文言が含まれたタグがあれば出力する内容
{% endif %}

検索対象が単なる文字列であるならcontainsを使えば容易に判定できますが、検索対象が配列の場合は値の文字列と完全一致でないとヒットしないようです。

targetというタグの有無を判定する前出のサンプルで言えば以下のようになります。

  • contains 'target'と書けばtrueを返す
  • contains 'tar'と書けばfalseを返す

またcontainsはオブジェクトに対して使えません。

ただしオブジェクトや配列の場合でも文字列に変換すれば部分一致で検索可能ではあるので、場合によっては文字列に変換することが検討できるかもしれません。

whereフィルターを用いる方法

  • 特定のコレクションの中から、特定のプロパティと値を持つ商品だけの配列を作成する

記事の趣旨とは少し違いますが、上記の前提であれば以下で可能です。


All products:
{% for product in collection.products %}
- {{ product.title }}
{% endfor %}

{% assign kitchen_products = collection.products | where: "type", "kitchen" %}

Kitchen products:
{% for product in kitchen_products %}
- {{ product.title }}
{% endfor %}

残念なのは完全一致のような使い方になる点で、例えば以下のように書いても配列は作成できません。


商品名(title)が以下である場合。
・Fish knife
・Meat knife
・Vegetable knife
・Case
・Whetstone
・stand

以下のように書いても{Fish knife,Meat knife,Vegetable knife}のような配列は作れない

{% assign kitchen_products = collection.products | where: "title", "knife" %}

結び

コード全体の作り方次第でこういうコードが不要になる場合もありますが、何かの際に使えるかもしれません。

3人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄