ShopifyのLiquidテンプレートを使って、土日や祝日をスキップし、最短発送日を自動計算する方法を紹介。ユーザービリティ向上のための実装手法をサンプルコードとともにわかりやすく解説します。
Shopifyが提供するテンプレート言語「Liquid」は、その柔軟性と応用範囲の広さから、ECサイトのカスタマイズにおいて重要な役割を果たします。
他のプログラミング言語に劣らない表現力を持ち、効果的に活用することで、競合との差別化にもつながるでしょう。
今回は、ユーザービリティ向上の一環として、Liquidを使って土日や祝日をスキップし、自動で最短の発送日を算出する方法を紹介します。サンプルコードを交えながら、実装のポイントを分かりやすく解説していきます。
こんなイメージ
ECサイトでは、週末や祝日に多くのユーザーが買い物をします。しかし、もし配送業務を行わない場合、注文後の最短発送日をユーザーに正しく案内することが重要です。
そこで、Liquidを使って 週末や祝日をスキップし、次の営業日を自動計算する仕組みを導入します。
・土日や祝日に購入された場合は 次の営業日を算出
・祝日が連続する場合も対応
ただし、コードをシンプルにするために、営業日に購入された場合は 当日発送として処理する形を取ります
手法をざっくり
では、手法をざっくり説明いたします。
①商品を閲覧する日(便宜上、今日)が土・日に該当するかをチェック
②条件分岐:土曜日の場合は、2日後(月曜日)を発送日にし、日曜日の場合は、1日後の(月曜日)を発送日にする。
③該当しなければ、今日を発送日にする。
④発送日をさらにフィルタリング。予め祝日リストを作成(変数に祝日を配列で格納)し、それに配当するかをチェック。
⑤該当すれば、翌日を発送日にする。その発送日が祝日であるかを繰り返し(10回ループ)チェック → 該当すれば翌日にし、該当しなければ発送日を確定(ループを終了)
サンプルコード
では、早速サンプルコードを見てみましょう。
{%- assign holidays = "2025-03-20,2025-04-29,2025-05-03,2025-05-06,2025-07-21" | split: "," -%}
{%- assign shipping_date = 'now' | date: "%Y-%m-%d" -%}
{%- assign weekday = shipping_date | date: "%w" -%}
{%- if weekday == '6' -%}
{%- assign shipping_date = shipping_date | date: "%s" | plus: 172800 | date: "%Y-%m-%d" -%}
{%- elsif weekday == '0' -%}
{%- assign shipping_date = shipping_date | date: "%s" | plus: 86400 | date: "%Y-%m-%d" -%}
{%- endif -%}
{%- for i in (0..10) -%}
{%- assign is_holiday = false -%}
{%- for holiday in holidays -%}
{%- if shipping_date == holiday -%}
{%- assign shipping_date = shipping_date | date: "%s" | plus: 86400 | date: "%Y-%m-%d" -%}
{%- assign is_holiday = true -%}
{%- endif -%}
{%- endfor -%}
{%- unless is_holiday -%}
{%- break -%}
{%- endunless -%}
{%- endfor -%}
発送予定日: {{ shipping_date }}
コードを簡単に解説します。
①{%- assign holidays = ....%}
:まず「holidays(祝日リスト)」という変数に2025年の祝日を配列を作成して格納します。
②「shipping_date(発送日)」という変数に本日の日付を格納います。この変数は、条件分岐やfor文などでフィルタリングされ、最終的に確定されます。
③「weekday」という変数に「shipping_date」を数字の曜日に変換し格納(0:日、1:月、2:火、3:水、4:木、5:金、6:土)
④条件分岐:本日の曜日が土曜日(6)の場合は、2日後(+172800秒)を計算に「shipping_date(発送日)」に格納。日曜日は1日後(+86400秒)。どちらに該当しなければスルー
④祝日チェック:「shipping_date(発送日)」を再度フィルタリング。予め用意した「holidays(祝日リスト)」の要素を1つずる取り出して祝日であるかをチェック。祝日であれば翌日に(+86400秒)、さらにチェックしてまた祝日であれば翌日にと、ループを最大10回回す({%- for i in (0..10) -%}
)。もし祝日でなければ、ループを即時終了。
⑤最終的に確定した「shipping_date(発送日)」を表示
{%- for i in (0..10) -%}を用いる理由
{%- for i in (0..10) -%}
は、他プログラミング言語でいう「while文」のような挙動をします。
「祝日チェックをして該当すれば翌日へ」と作業が終了したとしましょう。もし、その翌日も祝日であれば? そうです。連休などを考えると何回か繰り返しチェックを行わなければなりません。
{%- for i in (0..10) -%}
は「10回ほど繰り返しチェックすれば、だいたいの連休はすべてチェックできる。なぜなら10連休は中々ないから」という計算で設定されたもので、{%- for i in (0..20) -%}
でも構いません。
{%- for i in (0..10) -%}
の直後の{%- assign is_holiday = false -%}
は、祝日に該当しなければ、ループを終了させるためのフラグです。
フラグについてもっと知りたい方は以下の記事をぜひご一読ください。
【Shopify Liquid】ループの記録係!1回のみ実行に有用な「フラグ(Flag)」サンプルコード
以上、Liquidを使って土日や祝日をスキップし、自動で最短の発送日を算出する方法について紹介しました。ぜひご活用ください。