ここで使われているのが、Liquidでよく用いられる「フラグ(真偽)」という考え方です。
-本文中

(最終更新 2025年05月16日)

【Shopify Liquid】カート内で1つの注文に同時購入を防ぐシンプルな方法

Shopifyでデジタル商品と物理商品の同時購入を防ぐには?カート内の商品タイプを判定し、「ご購入手続きへ」ボタンを無効化するシンプルなLiquidカスタマイズを解説。配送トラブル防止に最適な実装方法をご紹介。

近年、Shopifyを活用したオンラインショップでも、デジタルコンテンツの取り扱いが増えてきました。PDF形式のガイドブックや動画教材、ライブ配信のチケットなど、物理的な発送を伴わない商品は、ユーザーにとっても購入しやすく、運営者にとっても在庫管理の負担が少ないメリットがあります。

私自身が運営するストアでも、ここ最近でデジタル商品(例えば、公演チケット)の割合が急増しました。しかし、それに伴って発生したのが「フィジカル商品との同時購入による混乱」です。

たとえば、注文単位で配送情報を物流センターに自動連携しているのですが、デジタル商品がカートに含まれていると、センター側で「何を発送すればいいのか?」と混乱を招いてしまうケースがありました。

こうした事態を防ぐには「1つの注文の中でデジタル商品と物理商品を同時に購入させない」という制御が必要です。今回は、Shopifyのテーマファイル(Liquid)を少しだけ修正するだけで実現できる、シンプルな「カート内同時購入制限」の方法をご紹介します。

こんなイメージ

仕組みとしてはとてもシンプルです。

まず、Shopifyの商品管理画面で、それぞれの商品に「商品タイプ(product.type)」を設定します。たとえば、動画やPDFといった無形の商品には「デジタルコンテンツ」、Tシャツやグッズなど発送を伴う商品には「フィジカル商品」といった具合に分類します。

次に、カートページでその商品タイプをチェックします。Liquidコードを使えば、カート内の商品をひとつずつ確認し、「デジタル」と「フィジカル」の両方が混在しているかどうかを判定することができます。

そして両方が同時に入っていた場合は、「ご購入手続きへ」ボタンを無効化したり、注意メッセージを表示したりして、ユーザーに対して注文を分けるよう促します。

どのファイルをカスタマイズするの?

では実際に、どのテンプレートファイルをカスタマイズすればいいのでしょうか?

今回の目的は、「カートに特定の組み合わせが入っている場合に、“ご購入手続きへ”ボタンを無効化すること」です。そのため、編集すべきファイルは「sections/main-cart-footer.liquid」になります。

この「main-cart-footer.liquid」は、カートページの下部に表示される合計金額や「ご購入手続きへ」ボタンなどのパーツを描画しているファイルです。カート画面の最終ステップとして、購入に進むための重要な操作エリアを構成しているため、今回のような「購入制御のロジック」を加えるには最適な場所といえます。

次は、このファイルに追加する具体的なLiquidコードをご紹介します。

挿入するLiquidコード

では、実際にどんなLiquidコードを挿入すればよいのかをご紹介します。カートページ下部の「main-cart-footer.liquid」 内であれば、基本的にどこに書いてもOKです。

処理の前後関係を気にする必要はなく、テンプレートの上部にまとめて記述しておくのが見通しとしては良いでしょう。

{% assign hasDigital = false %}
{% assign hasPhysical = false %}

{% for item in cart.items %}
{% if item.product.type == 'デジタルコンテンツ' %}
{% assign hasDigital = true %}
{% else %}
{% assign hasPhysical = true %}
{% endif %}
{% endfor %}

{% if hasDigital and hasPhysical %}
<p class="cart-error">⚠️ デジタル商品と物理商品は同時に購入できません。</p>
<style>
button[name="checkout"] {
opacity: 0.5;
pointer-events: none;
}
</style>
{% endif %}

ここで使われているのが、Liquidでよく用いられる「フラグ(真偽)」という考え方です。hasDigitalhasPhysicalという変数を「true / false」で切り替え、カート内の状態に応じて処理を分岐しています。

このようなフラグの考え方はShopifyカスタマイズにおいて非常に便利なので、初心者の方にもおすすめです。詳しく学びたい方は、以下の記事もぜひチェックしてみてください。

【Shopify Liquid】ループの記録係!1回のみ実行に有用な「フラグ(Flag)」サンプルコード

このコードの動きはとてもシンプルです。

まず、カート内の商品を1つずつチェックしていき、商品タイプが「デジタルコンテンツ」である商品が1つでも入っていれば、変数「hasDigital」という変数が「真(true)」になります。

一方で、「デジタルコンテンツ」ではない商品(=フィジカル商品など)が1つでも含まれていれば、変数「hasPhysical」が「真」になります。

この2つのフラグを使って、「デジタルコンテンツ」と「非デジタルコンテンツ」が同時にカートに含まれている状態を判定します。条件分岐の部分がこちらです。

{% if hasDigital and hasPhysical %}

この条件に一致した場合は、エラーメッセージを表示し、同時に以下のようなCSS制御を加えます。

button[name="checkout"] {
opacity: 0.5;
pointer-events: none;
}

つまり、「ご購入手続きへ」ボタンが半透明になり、クリックできなくなるというわけです。見た目と機能の両面から、ユーザーに「このままでは購入できない」ことを直感的に伝える、非常にシンプルで効果的な実装です。

まとめ

いかがでしょうか?

今回ご紹介した方法は、商品タイプに応じてカート内の商品構成をチェックし、「デジタルコンテンツ」と「フィジカル商品」が同時に含まれていた場合に、購入ボタンを無効化するというシンプルなLiquidカスタマイズです。

特別なアプリを使うことなく、Shopifyの標準機能とわずかなコードで実装できるため、配送や自動処理の混乱を防ぎたい方にはとても有効な手法といえるでしょう。

ただし、この方法には1つ注意点があります。Liquidはページの再読み込み時にしか反映されないため、ユーザーがカート内の商品を削除しても、その場では状態が更新されません。そのため、カートの状態を正しく判定させるには、「リロード」ボタンを設置する、もしくは商品削除時に自動でページをリロードさせるなどの工夫が必要です。

また、この方法が適用されるのはカートページ上での制御に限られます。商品ページ上でのカート通知(スライドダウン表示)、いわゆるカート通知モーダル(cart notification)やドロワーカート(cart drawer)での同様の制御については以下のページをチェックしてみてください。

カートのノーティフィケーションやドロワーで1注文での同時購入を防ぐ方法は可能?

今回の方法、ぜひあなたのショップにも取り入れてみてください!

Shopify小技のフリーマーケット

Shopifyを運営する中で、「こんなことできないのか?」という疑問は尽きません。特に初心者にとっては、難しく感じるけれども、実はすぐに活用できる小技がたくさんあります。
当サイトでは、実際に試してみて有効だったShopifyの小技を、誰でも簡単に再利用できるよう提供しています。

少し高度なLiquidのテクニックやアプリを使わずに実装できる機能、そしてカスタマイズのヒントになるアイデアなど、さまざまな情報をご用意しています。

現在、出品者は私1人ですが、 これからさらに充実させていく予定です!もしもShopifyでの設定やカスタマイズで悩んでいる方がいれば、お気軽にお問い合わせください。

もっと知りたい

このブログと運営者について

BLOG More

Js

2週間前

Shopifyのカスタマイズに役立つJavaScript「配列メゾット」11選を初心者向けに解説

「2005年新着!夏の水着一覧」という配列があるとします。最安値順に並び替えたいとき、「.sort()」というメソッドを使えば‥..

Js

2週間前

ShopifyではLiquidがあるのになぜJavaScriptが多用されるの?

その理由を一言で言えば、「Liquidは表示前、JavaScriptは表示後に働くから」です。..

Liquid

3週間前

Shopify 関連やおすすめ商品リストが自動生成「recommendations」活用・応用シーン

しかしカートページには、そもそも表示中の商品が存在しないため、このレコメンドの仕組みが機能しないのです。..

Liquid

4週間前

【Shopify Liquid】関連商品・おすすめ商品作成に用いられるオブジェクト「recommendations」について

このオブジェクトは、顧客の行動やストア内でのさまざまなデータを基に、自動的に関連商品を選出します。..

SEO

1か月前

Google、AIモードの導入を発表!収益減少が懸念される中、最も有力なマネタイズとは

このホテル、評価高いし、割引ついてるよ。数ステップで簡単に予約できるけど、今やる?..

SEO

1か月前

AI時代のSEOはオワコン?その真実と「違います」と言える4つの理由

たとえば「近くのコンビニを教えて」といったシンプルな質問に、毎回AIが複雑な推論や自然言語生成をしていたら、とんでもないコストになります。..

設定

1か月前

【Shopify豆知識】ヘッドレス(Headless)ってなに?

少し不気味で怪談を連想させるような響きですが、実際にはShopifyのメリットとして注目されている仕組みのひとつです。..

Liquid

1か月前

【Shopify小技】商品の「カートに追加」の仕組みをシンプルに解説(サンプルコード))

この仕組みにはLiquidだけでなく、JavaScriptやAjax、さらにはサーバー側で動くRubyなど、複数の技術が関わっている..

Liquid

2か月前

カートのノーティフィケーションやドロワーで1注文での同時購入を防ぐ方法は可能?

ノーティフィケーション(画面上部に一瞬表示される通知型カート)については、やや難易度が高めです。..

STORY

2か月前

なぜ鳥の巣はあんなに頑丈なのか?成功における「うまくいかない瞬間」の重要性

鳥の巣の初期段階のように、私たちの挑戦も、最初は失敗と不安定の連続です。..

Liquid

2か月前

【Shopify Liquid】商品ページの「オプション」を色か画像にしたい

そもそもShopifyの商品オプションに画像や色を登録できるのか?..

STORY

2か月前

現代言語哲学の巨人が教えてくれた「失敗する人の口癖」とは

あの時もし、あの会社に転職していたら・・..

アプリ

2か月前

【Shopifyアプリ】商品ページから簡単に見積もりを送信!履歴から下書き注文作成も可能

旅行会社、工事や建築、リフォーム業、OEM制作、ノベルティ制作、レンタル業なども十分対応できる‥..

STORY

2か月前

40代・50代にとって新たな挑戦が「苦痛」である理由・・私が救われたニーチェの言葉

苦しみがあるからこそ、深みが生まれる。..

SEO

2か月前

【ローカルSEO】AI時代「ラーメン屋」で検索上位のためのコツ&対策キーワード

ラーメンとチャーハンの欲張りセット、絶賛販売中!新宿駅から徒歩3分..

STORY

2か月前

中卒のシングルマザーが小惑星を発見!? スタンダードを破る成功者たち「ダークホース」

彼女は15歳で高校を中退し、高卒認定試験にも不合格。いわゆる「成功のレール」からは大きく外れた人生を歩んでいました。..

STORY

2か月前

新たな挑戦をするほどタバコや酒、スマホの依存が強くなる理由「悪循環の消防士たち」とは

この消防士たち、なんと「中毒」や「依存」という形で、僕たちを無理やり落ち着かせようとする。..

Liquid

2か月前

【Shopify Liquid】商品ページ「バリエーションの在庫ステータス」その仕組みについて

ブロックを複数箇所に設置しても、動的操作ができるのは1箇所のみという制限があります。..

設定

2か月前

【備忘録】Shopify通知・メルマガ 外部ドメインのメールアドレス認証 (CNAME、DMARC)

自分の備忘録として認証方法の具体的な手順を紹介したいと思います。..

STORY

3か月前

収入だけじゃないよ!40代男性「IT関連」副業のメリット5選と個人的な感想

40代男性にとってこのスキルアップは、単なる知識の習得以上の意味を持つことが多いのではないでしょうか。..

Liquid

3か月前

【Shopify Liquid】店舗受取を希望する購入者への「注文通知メール」をカスタマイズ

「注文通知メール」にコピペすればOKなのでは?と思われがちですが、なぜか店舗情報が上手く表示されません。..

設定

3か月前

Shopify「店舗受取」運用に必要な基本的なフローと操作まとめ

アパレルや雑貨など「実物を見てから購入したい」お客様に対しても、あらかじめ在庫を確保しておくことで、店舗でのスムーズな購買体験を提供できます。..

設定

3か月前

【Shopify小技】飲食店でのテイクアウトに応用可能!「店舗受取専用」商品を作成する方法

「どこで店舗受取専用の商品を作成すればいいの?」と迷ってしまう人も多いのではないでしょうか?..

Liquid

3か月前

【Shopify Liquid】恥ずかしいけど「CONTAINS」2つの使い方に今日気づいた‥

何の疑問も持っていなかった私、ちょっぴり衝撃でした。..

Liquid

3か月前

【Shopify Liquid】毎月「7」のつく日だけ!限定セールを自動表示する方法

Liquidにおける日にちの自動計算の仕組みはもちろん、for文やif文、フラグの概念も理解しやすくなるはずです。..

アプリ

3か月前

【Shopifyアプリ】注文に「任意の連番」をつける事もできる!「SeriaLogic」の使い方を解説

チケット購入順に入場番号を自動で割り振る事はできないの?..

Liquid

4か月前

【Shopify Liquid】土日など休日はスキップ!自動で最短の発送日を算出して案内する方法

Liquidを使って土日や祝日をスキップし、自動で最短の発送日を算出する方法を紹介します。..

Liquid

4か月前

【Shopify小技】15時までの購入で当日発送と案内&注文メール通知に実装

たとえば、「15時までの注文は当日発送」といった案内を、自動で表示できたら便利だと思いませんか?..

Js

4か月前

【Shopify小技】セール終了の日付と時間までのカウントダウンをJavascriptで実装

こうした視覚的な要素は、購入の後押しとなり、より多くの顧客を引き込む効果が期待できます。..

Liquid

4か月前

【Liquid日付計算】注文通知メールをカスタマイズ!支払期限を翌週月曜日の日付にする

特に「銀行振込」や「コンビニ決済」のような後払いの決済方法では、支払い期限を明示することが重要です。..