Liquid Snippets by ALSEL
🛍️ 商品表示初級

商品オプションのボタン・ドロップダウン表示

商品バリアント選択フォームを、ボタンスタイルまたはドロップダウンスタイルで出力するスニペット。テーマ設定で表示方式を切り替えられ、パディング(上下)もカスタマイズ可能。

用途
商品詳細ページのオプション選択部分(色・サイズなど)に組み込み、買い手が選びやすいインターフェイスを提供する。ボタン形式なら視認性が高く、ドロップダウンはスペース効率が良い。
設置場所
snippets/product-block-options.liquid に配置し、product セクション内で `{% render 'product-block-options', block: block, product: product %}` で呼び出す。テーマカスタマイザーで「オプション表示スタイル」と「上下パディング」を設定できるブロック仕様。
注意点
product.options_with_values が存在しないテーマでは `unless` 条件が常に true になり、エラーになるため事前に product オブジェクトが正しく渡されているか確認が必要。ボタンスタイルではラジオボタン、ドロップダウンでは select 要素を使い分けているので、フォーム送信時に name 属性の値が option-{オプション名} になっていることを確認する。CSS クラス(size-buttons、form-select など)がテーマの Bootstrap 等に依存しているため、スタイル名を変更する場合は別途 CSS を用意する。
タグ:productvariantoptionformbutton-styledropdown

コード

52 行 / liquid
{% liquid 
  assign pt = block.settings.pt | prepend: 'pt-'
  assign pb = block.settings.pb | prepend: 'pb-'
%}

{% unless product.has_only_default_variant %}
  <ul 
    class="product-options list-unstyled mb-0 {{ pt }} {{ pb }}"
    aria-label="{{ 'product.product_options' | t }}">
    {% for option in product.options_with_values %}
      <li class="py-3">
        {% if block.settings.options_style == 'buttons' %}       
          <p class="mb-1">
            {{ option.name }}
          </p>
          <ul class="size-buttons list-unstyled">
            {% for value in option.values %}
              <li>
                <input 
                  class="visually-hidden" 
                  type="radio" 
                  name="option-{{ option.name | handleize }}" 
                  id="option-{{ option.name | handleize }}-{{ value | handleize }}" 
                  value="{{ value | escape }}"
                  {% if option.selected_value == value %}checked{% endif %}>
                <label for="option-{{ option.name | handleize }}-{{ value | handleize }}">
                  {{ value }}
                </label>
              </li>
            {% endfor %}
          </ul>
        {% else %}
          <label class="form-label" for="option-{{ option.name | handleize }}">
            {{ option.name }}
          </label>
          <select
            id="option-{{ option.name | handleize }}"
            name="option-{{ option.name | handleize }}"
            class="form-select">
            {% for value in option.values %}
              <option 
                value="{{ value | escape }}" {% if value == option.selected_value %}selected{% endif %}>
                {{ value }}
              </option>
            {% endfor %}
          </select>
        {% endif %}
      </li>
    {% endfor %}
  </ul>
{% endunless %}

出典・ライセンス

License:
MIT

このコードは kondasoft 著作の MIT ライセンスソースです。 原本の著作権は kondasoft が保有します。日本語訳は ALSEL によるものです。

関連項目

🛍️ 商品表示上級

商品ブロック内のLiquid実行

セクションブロック内で管理画面から入力した Liquid コードを直接実行し、パディング設定で上下の余白を制御するスニペット。テーマカスタマイザーでコード記述が可能。

📁 ks-bootshop·MIT·8
🛍️ 商品表示初級

商品ページの見出し

商品詳細ページの商品名を h1 見出しで表示するブロック。テーマカスタマイザーから見出しサイズと上下の余白(padding)を調整できる。

📁 ks-bootshop·MIT·8
🛍️ 商品表示中級

商品レビューバッジの表示

Loox と JudgeMe 両方のレビュー集約アプリに対応したレーティングバッジを商品ページに埋め込む。メタフィールドから平均評価とレビュー数を取得し、各アプリの UI コンポーネントを描画する。

📁 ks-bootshop·MIT·9
🛍️ 商品表示中級

定期販売プランのデータ属性を動的に生成

商品の定期販売プラン(Selling Plans)をループで取得し、data 属性として HTML に埋め込むスニペット。JavaScript で定期販売オプションを制御するためのデータ基盤として機能する。

📁 theme-tools·MIT·10
🛍️ 商品表示初級

商品ページの区切り線

商品詳細ページで、セクション間に区切り線を挿入するブロック。パディング、高さ、背景色、透明度をカスタマイズできる。

📁 ks-bootshop·MIT·15
🛍️ 商品表示初級

商品画像のプリロード出力

商品オブジェクトから image_tag フィルターを使い、preload 属性付きで画像を出力するスニペット。複数商品のループ内でも使える基本的なパターン。

📁 theme-tools·MIT·16