同じ商品タイプを同時に購入できないようにしたい

Topic summary

課題:
Shopifyカートで特定の商品タイプの組み合わせを制限したい。具体的には:

  • 商品グループAとBが同時にカートに入った場合
  • 商品グループB同士の異なる商品が複数カートに入った場合

これらの条件でチェックアウトボタンを非表示にしたい。

提案された解決策:
NIIGAKI_HYUGA氏がLiquidコードを提供:

  • typeA_counttypeB_countでカウント
  • typeB_unique_products変数で商品グループBの異なる商品IDを追跡
  • 商品IDをカンマ区切りで格納し、split/sizeメソッドでユニーク商品数を計算
  • 条件に応じてチェックアウトボタンの表示/非表示を制御

現状:
質問者が実装を試したが、商品グループBの商品がカートに入った際、product.idに関係なくチェックアウトが常に表示される問題が発生。解決には至っていない状態で議論が継続中。

Summarized with AI on November 13. AI used: claude-sonnet-4-5-20250929.

下記の書き方で商品グループAと商品グループBが一緒にカートに入ったときに
チェックアウトが表示されないようにしてるのですが、
それにプラスして商品グループB同士の違う商品がカートに入ったときでもチェックアウトが表示されないようにすることは可能でしょうか?

{%- for item in cart.items -%}
{%- if item.product.type == ‘商品グループA’ -%}
{% assign typeA = true %}
{%- endif -%}
{%- if item.product.type == ‘商品グループB’ -%}
{% assign typeB = true %}
{%- endif -%}
{%- endfor -%}
{%- unless typeA == true and typeB == true -%}
購入ボタン
{%- endunless -%}

@20220314

初めまして。新垣です。

こちらはいかがでしょうか。

{% assign typeA_count = 0 %}
{% assign typeB_count = 0 %}

{%- for item in cart.items -%}
  {%- if item.product.type == '商品グループA' -%}
    {% assign typeA_count = typeA_count | plus: 1 %}
  {%- elsif item.product.type == '商品グループB' -%}
    {% assign typeB_count = typeB_count | plus: 1 %}
  {%- endif -%}
{%- endfor -%}

{%- if typeA_count > 0 and typeB_count > 0 -%}
  #AタイプとBタイプの商品が同時に1点以上ある場合チェックアウトを非表示にする
{%- elsif typeB_count > 1 -%}
  #商品グループBが2つ以上ある場合もチェックアウトを非表示にする
{%- else -%}
  購入ボタン
{%- endif -%}

参考になりましたら幸いです。

1 Like

参考になりましたありがとうございます。

商品グループB同士の同じproduct_idの場合はチェックアウトを表示したいのですが可能でしょうか?

下記のコードをお試しください。

{% assign typeA_count = 0 %}
{% assign typeB_count = 0 %}
{% assign typeB_unique_products = '' %}

{%- for item in cart.items -%}
  {%- if item.product.type == '商品グループA' -%}
    {% assign typeA_count = typeA_count | plus: 1 %}
  {%- elsif item.product.type == '商品グループB' -%}
    {% assign typeB_count = typeB_count | plus: 1 %}
    {% unless typeB_unique_products contains item.product.id %}// typeB_unique_productsにカート内itemのidが含まれていない場合
      {% assign typeB_unique_products = typeB_unique_products | append: item.product.id | append: ',' %} // typeB_unique_productsにカート内itemのidを格納
    {% endunless %}
  {%- endif -%}
{%- endfor -%}

// カートに含まれる商品グループBの異なる商品の数を計算
{%- assign typeB_unique_count = typeB_unique_products | split: ',' | size | minus: 1 -%}

{%- if typeA_count > 0 and typeB_count > 0 -%}
  #AタイプとBタイプの商品が同時に1点以上ある場合チェックアウトを非表示にする
{%- elsif typeB_unique_count > 1 -%}
  #商品グループBの異なる商品が2つ以上ある場合もチェックアウトを非表示にする
{%- else -%}
  購入ボタン
{%- endif -%}

// カートに含まれる商品グループBの異なる商品の数を計算の部分でminus:1をしているのは、splitメソッドによって追加される余分な空の要素を除外するためです。

ありがとうございます。

試してみたのですが

typeBの商品が入ったときはidに関わらずチェックアウトが出る状態になってしまいました、、