注文の通知メールなどでよく使われる、顧客が注文した商品の属性によって表現を変えたい!こういう時に用いられるのがfor文とif文。今回はfor文とif文「 繰り返し実行」or「1度だけ実行 」について解説します。
Shopifyストア構築における条件分岐でよく使われるLiquidのfor文とif文。
2つを合わせて条件分岐を作り、アクションを実行させる構文も多く見受けられます。
今回は「繰り返し実行させる」or「1度だけ実行 」の制御構文について、例文とともに紹介したいと思います。
繰り返し実行
まず、繰り返し実行の例文を見てみましょう。
{% for line in subtotal_line_items %}
{% for tag in line.product.tags %}
{% if tag == '海外発送不可' %}
<p>海外発送不可</p>
{% endif %}
{% endfor %}
{% endfor %}
この構文を簡単に説明すると、
①{% for line in subtotal_line_items %}
の「subtotal_line_items」は、注文の各商品をループ(要素を1つずつ取り出して「line」という変数に代入して実行)。
②{% for tag in line.product.tags %}
は、各商品に付けられているタグをループ(こちらも要素1つずつ取り出して「tag」という変数に代入して実行)。
③if文を使い「海外発送不可」というタグを持つ商品を条件分岐→「海外発送不可」表示
④ループは続き、条件分岐も続く(繰り返し実行)
となります。もし、注文の商品10個あって、そのうち5個の商品が「海外発送不可」タグを持っていれば、「海外発送不可」は5回表示されます。
1度だけ実行させる
1度だけ実行に用いられる構文には、{% assign %}
と{% for %}
、{% if %}
(もしくは{% unless %}
)の組み合わせがよく使われます。
以下は、1度だけ実行させる構文の例文。
{% assign nooverseas = false %}
{% for line in subtotal_line_items %}
{% for tag in line.product.tags %}
{% if tag == '海外発送不可' %}
{% unless nooverseas %}
<p>海外発送不可商品が含まれています。</p>
{% assign nooverseas = true %}
{% endunless %}
{% endif %}
{% endfor %}
{% endfor %}
この構文、実は理解するまで結構な時間がかかりました。
一つのパッケージのように覚えるしかないと割り切って考えるようにしています。
自分が理解する範囲で解説すると、
①「assign 〇〇〇=false」で初期化:これは、複数ある要素で何かの条件に一致(true)すれば、アクションを実行し、その他の要素はスルーするための仕掛けみたいもの
②for文を使い、ループを回す。ループの回すと、その対象(例えば、注文した商品)が持つ複数の要素を一つずつ取り出して変数に代入して繰り返し実行する。
③if文を使い、条件をつけ、アクションを実行する。
④ここでは、複数のある商品のタグの中で「海外発送不可」というものが出てくれば、{% unless %}
以下のアクションが実行される。
⑤「unless 〇〇〇」は、ちょっと分かりづらいが、(ここも割り切って)「if 〇〇〇 ==false」と同じ意味。「assign overseas=false」と初期化されているため、1度目のループでは、条件と一致することになり、以下のアクッションが実行される。
アクションの中には、{% assign nooverseas = true %}
と、「nooverseas」を「true」にするアクションもある。そのため、2度目のループでは、同じif tag == '海外発送不可'
には、{% unless nooverseas %}
は実行されない。要するに「1度だけ実行」が完成するということになる。
という構文になります。
要は、{% unless %}
は、2度目以降のループを見据えて設定されたものになるわけです。
この構文は、マイページや注文通知など、注文履歴が確認できるページで、商品のうち一つが「〇〇〇」というタグもしくはコレクションを持っている場合、1度だけ特定の処理をしたい(例えば、注意書きを付け加えるなど)場合によく使われる構文になります。
では「1度だけ実行」の別の使い方と例文を紹介します。
{% assign noshipping = false %}
{% for line in order.line_items %}
{% for collection in line.variant.product.collections %}
{% if collection.title == '発送不要' %}
{% assign noshipping = true %}
{% endif %}
{% endfor %}
{% endfor %}
{% if noshipping %}
発送不要
{% else %}
発送可能
{% endif %}
これは、注文のした商品が「発送不要」というコレクションに属していれば「発送不要」と表示される構文になります。
では、各商品のコレクションを取り出し、繰り返し実行をしているのに、なぜ「1度だけ実行」になるのでしょうか。
ちょっとわかりやすく例を挙げましょう。
田中さんにはお子さんが5人います。女の子には人形をあげ、男の子には何もあげないとしましょう。
お子さんの名前、年齢、性別、身長など色んな属性の中で「性別」だけで判断して、アクションをし、ほかの属性(要素)は無視する。
この「性別」だけで動く構文なので「1度だけ実行」になるのです。
for文のループで複数ある要素を取り出し、if文を使い1つの要素だけが条件があえば、アクションを実行し、ほかの要素は無視するため、「1度だけ実行」と言えるのではないでしょうか。
(この説明で逆に分かりづらくなったのであれば、お詫び申し上げます)
以上、Shopify Liquid for文とif文「 繰り返し実行」or「1度だけ実行 」の(自分なりの)解説と例文でした。