様々な開発言語や環境、用途に応じた実際に動作するアプリやテーマのサンプルコードを、公式、非公式問わず集める場所です。自分のコードをもとにした質問をしたり、希望を書くだけでも構いません。
dawnにて販売ページを使用していますが、バリエーション毎の在庫の有無がバリエーションを切り替えなければ表示できず、非常にストレスがあります
下記のカスタムLiquidで表示させることはできたのですがプルダウンと合わせて表示したりわかりやすくする方法はありますか?
{%- for variant in product.variants -%}
<div>
{%- assign is_in_stock = false -%}
{%- if 0 < variant.inventory_quantity -%}{%- assign is_in_stock = true -%}{%- endif -%}
{{ variant.title | escape }} -
{%- if is_in_stock -%}
在庫あり
{%- elsif is_in_stock == false and variant.inventory_policy == 'continue' -%}
在庫なし 販売を続ける
{%- elsif is_in_stock == false and variant.incoming -%}
在庫なし 再入荷待ち 入荷予定日:{%- if variant.next_incoming_date -%}{{ variant.next_incoming_date | date:"%Y/%m/%d" }}{%- else -%}未定{%- endif -%}
{%- elsif is_in_stock == false -%}
在庫なし
{%- endif -%}
</div>
{%- endfor -%}
解決済! ベストソリューションを見る。
成功
失礼しました。
下記の在庫状況の文字列の定義位置がよくありませんでした。
{%- assign variantOptionInventoryStatus = '在庫なし' -%}
また、不要な"}"が紛れ込んでいたので合わせて修正しました。
<variant-selects class="no-js-hidden" data-section="{{ section.id }}" data-url="{{ product.url }}" {{ block.shopify_attributes }}>
{%- for option in product.options_with_values -%}
<div class="product-form__input product-form__input--dropdown">
<label class="form__label" for="Option-{{ section.id }}-{{ forloop.index0 }}">
{{ option.name }}
</label>
<div class="select">
<select id="Option-{{ section.id }}-{{ forloop.index0 }}"
class="select__select"
name="options[{{ option.name | escape }}]"
form="{{ product_form_id }}"
>
{%- for value in option.values -%}
{%- assign variantOptionInventoryStatus = '在庫なし' -%}
{%- for variant in product.variants -%}
{%- for variantOption in variant.options -%}
{%- if variantOption == value -%}
{% if variant.inventory_quantity > 0 %}
{%- assign variantOptionInventoryStatus = '在庫あり' -%}
{% endif %}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
<option value="{{ value | escape }}" {% if option.selected_value == value %}selected="selected"{% endif %}>
{{ value }} - {{ variantOptionInventoryStatus }}
</option>
{%- endfor -%}
</select>
{% render 'icon-caret' %}
</div>
</div>
{%- endfor -%}
<script type="application/json">
{{ product.variants | json }}
</script>
</variant-selects>
なお、
異なるoptionのvalueに同一の値が入るとうまく動作しないです。
例えば、アパレルを例にとると、
かなり特殊な状況ですが、色もサイズも数字で表すというようなことをされているとうまく動作しません。
[例]
色: 1,2,3
サイズ: 1,2,3
エッジケースですので、この点の改良については、必要とされている方がいらっしゃれば考えてみます。
ご参考まで。
(キュー田辺)
variantのoptionが2つ以上ある場合を考慮しますと、
質問者様に記載いただいているような、「入荷待ち」のような情報まで、
ドロップダウンに記載するのは難しいかもしれません。
例えば、商材がアパレルだったとします。
optionとして、サイズと色の2種類があったとします。
この時、ある商品に下記のように4種類のvariantが存在したとします。
1. WHITE / S
2. WHITE / M
3. BLACK / S
4. BLACK / M
WHITE / Sが入荷待ちで、WHITE / Mが入荷予定がなかったとします。
この時、「色」を選択するドロップダウン中の、
WHITEという選択肢において、入荷待ちなのか入荷予定がないのかを、
一意に決定することができません。
どこまでできるか考えてみたのですが、
在庫の有無くらいは、ドロップダウンに追加できそうです。
Dawnをお使いとのことで、
セクション(sections) > main-product.liquidのドロップダウンを出力する箇所を下記のように変更することでできそうです。
(十分な検証はできていないので、うまく動作しないパターンがあるかもしれません。)
<variant-selects class="no-js-hidden" data-section="{{ section.id }}" data-url="{{ product.url }}" {{ block.shopify_attributes }}>
{%- for option in product.options_with_values -%}
<div class="product-form__input product-form__input--dropdown">
<label class="form__label" for="Option-{{ section.id }}-{{ forloop.index0 }}">
{{ option.name }}
</label>
<div class="select">
<select id="Option-{{ section.id }}-{{ forloop.index0 }}"
class="select__select"
name="options[{{ option.name | escape }}]"
form="{{ product_form_id }}"
>
<option value="{{ value | escape }}" {% if option.selected_value == value %}selected="selected"{% endif %}>
{{ value }}
</option>
{%- endfor -%}
</select>
{% render 'icon-caret' %}
</div>
</div>
{%- endfor -%}
<script type="application/json">
{{ product.variants | json }}
</script>
</variant-selects>
<variant-selects class="no-js-hidden" data-section="{{ section.id }}" data-url="{{ product.url }}" {{ block.shopify_attributes }}>
{%- for option in product.options_with_values -%}
<div class="product-form__input product-form__input--dropdown">
<label class="form__label" for="Option-{{ section.id }}-{{ forloop.index0 }}">
{{ option.name }}
</label>
<div class="select">
<select id="Option-{{ section.id }}-{{ forloop.index0 }}"
class="select__select"
name="options[{{ option.name | escape }}]"
form="{{ product_form_id }}"
>
{%- assign variantOptionInventoryStatus = '在庫なし' -%}
{%- for value in option.values -%}
{%- for variant in product.variants -%}
{%- for variantOption in variant.options -%}}
{%- if variantOption == value -%}
{% if variant.inventory_quantity > 0 %}
{%- assign variantOptionInventoryStatus = '在庫あり' -%}
{% endif %}
{%- endif -%}}
{%- endfor -%}
{%- endfor -%}
<option value="{{ value | escape }}" {% if option.selected_value == value %}selected="selected"{% endif %}>
{{ value }} - {{ variantOptionInventoryStatus }}
</option>
{%- endfor -%}
</select>
{% render 'icon-caret' %}
</div>
</div>
{%- endfor -%}
<script type="application/json">
{{ product.variants | json }}
</script>
</variant-selects>
ご要望通りの回答ではなく恐縮ですが、
何かの参考になれば幸いです。
(キュー田辺)
ご回答ありがとうございます。
提案いただいた通りバリエーション毎に在庫のあり、なしがドロップダウンに追加されるだけで
とてもありがたいです。
記載いただいたコードを試したところ在庫のないバリエーションも全て「在庫あり」で表示されてしまいます。
上手く作動させることはできそうでしょうか?
成功
失礼しました。
下記の在庫状況の文字列の定義位置がよくありませんでした。
{%- assign variantOptionInventoryStatus = '在庫なし' -%}
また、不要な"}"が紛れ込んでいたので合わせて修正しました。
<variant-selects class="no-js-hidden" data-section="{{ section.id }}" data-url="{{ product.url }}" {{ block.shopify_attributes }}>
{%- for option in product.options_with_values -%}
<div class="product-form__input product-form__input--dropdown">
<label class="form__label" for="Option-{{ section.id }}-{{ forloop.index0 }}">
{{ option.name }}
</label>
<div class="select">
<select id="Option-{{ section.id }}-{{ forloop.index0 }}"
class="select__select"
name="options[{{ option.name | escape }}]"
form="{{ product_form_id }}"
>
{%- for value in option.values -%}
{%- assign variantOptionInventoryStatus = '在庫なし' -%}
{%- for variant in product.variants -%}
{%- for variantOption in variant.options -%}
{%- if variantOption == value -%}
{% if variant.inventory_quantity > 0 %}
{%- assign variantOptionInventoryStatus = '在庫あり' -%}
{% endif %}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
<option value="{{ value | escape }}" {% if option.selected_value == value %}selected="selected"{% endif %}>
{{ value }} - {{ variantOptionInventoryStatus }}
</option>
{%- endfor -%}
</select>
{% render 'icon-caret' %}
</div>
</div>
{%- endfor -%}
<script type="application/json">
{{ product.variants | json }}
</script>
</variant-selects>
なお、
異なるoptionのvalueに同一の値が入るとうまく動作しないです。
例えば、アパレルを例にとると、
かなり特殊な状況ですが、色もサイズも数字で表すというようなことをされているとうまく動作しません。
[例]
色: 1,2,3
サイズ: 1,2,3
エッジケースですので、この点の改良については、必要とされている方がいらっしゃれば考えてみます。
ご参考まで。
(キュー田辺)
サポートの選択肢が増えていく中、最適となる選択の判断が難しくなっているかと存じます。今回は問題の解決に最適となるサポートの選択方法を、紹介させて頂きます。 選択肢のご紹介...
By Mirai Oct 6, 20242023年初頭、Shopifyペイメントアカウント、及びShopifyアカウント全体のセキュリティを強化する為の変更が適用されました。ユーザーのアカウントセキュリティを強化す...
By Mirai Sep 29, 2024概要: 年末/年明けは、消費者が最もショッピングを行う時期の一つです。特に、ブラックフライデー・サイバーマンデー(BFCM)は、世界中で注目される大規模なセールイベントであ...
By JapanGuru Sep 25, 2024