商品詳細画面
商品の詳細ページです。
商品管理から自由項目や商品詳細・商品詳細サブなどに任意の文言やHTMLタグ、Liquid(変数や構文)を設定できるので、商品ごとにデザインを変えられます。
さらに対象の商品に対して複数のSKUが紐づいている場合、数量の上にSKUを選択するためのプルダウンがJavasSriptによって生成されます。
商品詳細画面で利用できるデフォルトの機能は以下の通りです。
- お気に入りボタン
- カートに商品を追加ボタン(画面遷移なしで商品をカートに追加します)
- 購入手続きへボタン(商品をカートに追加後、カート画面へ遷移します)
- レビュー機能 (管理画面のレビュー管理 (opens in a new tab)から制御可能)
- 併売商品情報表示
- 関連商品表示(管理画面のショップの機能設定 (opens in a new tab)および関連商品管理 (opens in a new tab)から制御可能)
参考情報
ショップのパス
ドメイン/shop/products/SKUコード(マスター)
テーマ管理のファイルパス
ec_force/shop/products/show.html.liquid
ec_force/shop/products/show.html+smartphone.liquid
JS タグ
{{ 'shop/products' | javascript_include_tag }}
必要なコンポーネント
※任意とあるもの以外はシステム上必要なコンポーネントとなりますので、必ず使用するようにしてください。
{{ 'shop/products' | javascript_include_tag }}
<!-- 商品詳細画面 -->
<div id="product-show-view">
<!-- 商品カテゴリーパンくずリスト(任意) -->
{% for ancestry in product_categories_ancestry %}
<ol>
<li>{{ 'TOP' | link_to: '/shop' }}</li>
{% for path in ancestry %}
<li><a href="/shop/product_categories/{{ path.slug }}">{{ path.name }}</a></li>
{% endfor %}
<li>{{ product.name }}</li>
</ol>
{% endfor %}
<!-- カートに商品を追加用のメッセージ(任意) -->
<div id="cart-addition-success" style="display:none;">カートに商品を追加しました。</div>
<div id="cart-addition-failure" style="display:none;">
<div id="addition-failure-message"></div>
<div id="btn-show-addition-failure-details" style="display:none;">さらに詳しく</div>
<div id="addition-failure-details" style="display:none;"></div>
<div id="btn-hide-addition-failure-details" style="display:none;">閉じる</div>
</div>
<!-- 商品画像(任意) -->
{% if product.thumbnail.url %}
{% assign src = product.thumbnail.url %}
{% assign alt = product.name %}
{% else %}
{% assign src = 'missing' | image_url %}
{% assign alt = '' %}
{% endif %}
{% if product.master.thumbnails.size > 0 %}
{% if product.master.option_values_presentation %}
{% assign alt = product.name | append: ' ' | append: product.master.option_values_presentation %}
{% else %}
{% assign alt = product.name %}
{% endif %}
{% endif %}
<img src="{{ src }}" alt="{{ alt }}" id="main-img">
<div id="sub-images-view"></div>
<!-- 商品名 -->
{{ product.name }}
<!-- 商品詳細(任意) -->
{{ product.parsed_description }}
<!-- 商品バッジ(任意) -->
{% if pre_order_badge_flg_hash[product.master.id] or delivery_group_badge_flg_hash[product.id] or concurrent_purchase_group_badge_flg_hash[product.id] or campaign_badge_flg_hash[product.id] %}
<!-- 商品予約マーク(任意) -->
{% if pre_order_badge_flg_hash[product.master.id] %}
予約商品
{% endif %}
<!-- 配送温度帯ラベル(任意) -->
{% for delivery_group_name in product.delivery_group_names %}
{{ delivery_group_name }}
{% endfor %}
<!-- 同時購入グループバッジ(任意) -->
<!-- 「バッジ表示名」を表示したい場合、product.concurrent_purchase_group_names を product.concurrent_purchase_badge_names に修正してください。 -->
{% for concurrent_purchase_group_name in product.concurrent_purchase_group_names %}
{{ concurrent_purchase_group_name }}
{% endfor %}
<!-- キャンペーンバッジ(任意) -->
{% assign badges = campaign_badge_flg_hash[product.id] | liquid_render_badges %}
{% for render_badge in badges %}
{{ render_badge | hash: 'value' }}
{% endfor %}
{% endif %}
<!-- 予約関連情報(任意) -->
{% if enabled_pre_order and product.master.pre_order.is_pre_order? %}
お届け予定時期:{{ product.master.pre_order.pre_ordered_delivery_description }}
{{ pre_order_settings.notes }}
{% endif %}
<!-- 注意喚起文(任意) -->
{{ product.caution }}
<!-- キャンペーン機能カウントダウン表示(任意) -->
{% if display_countdown_flg %}
<span>{{ campaign_end_date_left }}</span>
{% endif %}
<!-- キャンペーン割引率表示(任意) -->
{{ campaign_discount_rate }}
<!-- キャンペーン割引額表示(任意) -->
{{ campaign_discount_amount }}
<!-- キャンペーン詳細表示(任意) -->
{{ campaign_description }}
<!-- 通常価格(任意) -->
<span id="list-price">{{ product.master.list_price | number_to_currency: format: '%n %u' }}</span>
<!-- 通常価格(税込)(任意)-->
<span id="list-price-include-tax">{{ product.master.list_price_include_tax | number_to_currency: format: '%n %u' }}</span>
<!-- 販売価格 -->
<span id="sales-price">{{ product.first_price | number_to_currency: format: '%n %u' }}</span>
<!-- 販売価格(税込) -->
<span id="sales-price-include-tax">{{ product.first_price_include_tax | number_to_currency: format: '%n %u' }}</span>
<!-- メーカー(任意) -->
{{ product.maker.name }}
<!-- メーカーURL(任意) -->
{{ product.maker.url }}
<!-- 自由入力1(任意) -->
{{ product.option01 }}
<!-- 自由入力2(任意) -->
{{ product.option02 }}
<!-- 自由入力3(任意) -->
{{ product.option03 }}
<!-- 自由入力3(任意) -->
{{ product.option03 }}
<!-- 自由入力4(任意) -->
{{ product.option04 }}
<!-- 自由入力5(任意) -->
{{ product.option05 }}
<!-- 自由入力6(任意) -->
{{ product.option06 }}
<!-- 自由入力7(任意) -->
{{ product.option07 }}
<!-- 自由入力8(任意) -->
{{ product.option08 }}
<!-- 自由入力9(任意) -->
{{ product.option09 }}
<!-- 自由入力10(任意) -->
{{ product.option10 }}
<!-- カテゴリー(任意) -->
{% assign _category = '' %}
{% for category in product.product_categories %}
{% if category.product_category_visibility %}
{% unless _category == '' %}
{% assign _category = _category | append: ', ' %}
{% endunless %}
{% assign _category = _category | append: category.name %}
{% endif %}
{% endfor %}
{{ _category }}
<!-- 商品ラベル(検索表示設定を反映する) (任意)-->
{% for label in product.labels %}
{% if label.search_form_visibility %}
<!-- ラベルID (任意)-->
{{ label.id }}
<!-- ラベルの名前(任意)-->
{{ label.name }}
<!-- ラベルの色(任意) -->
{{ label.color }}
{% endif %}
{% endfor %}
<!-- 商品ラベル(検索表示設定を反映しない) (任意)-->
{% for label in product.labels %}
<!-- ラベルID (任意)-->
{{ label.id }}
<!-- ラベルの名前(任意)-->
{{ label.name }}
<!-- ラベルの色(任意) -->
{{ label.color }}
{% endfor %}
<!-- マスターSKU詳細(任意) -->
{{ product.master.parsed_description }}
<!-- 予約受付期間外時のメッセージ(任意) -->
{% if enabled_pre_order and valid_pre_order_variant == false %}
予約受付期間外のためカートに商品を追加できません。
{% endif %}
<!-- 併売の場合はフォームを隠す -->
{% if base_info.multiple_co_selling_products and product.has_co_selling_product? %}
{% assign style = 'display:none;' %}
{% else %}
{% assign style = '' %}
{% endif %}
<!-- 商品選択フォーム -->
<form id="add-shop-cart-form" action="/shop/cart/add" method="post" style="{{ style }}">
<!-- 規格選択 -->
<input id="variant-id" type="hidden" name="variant_id" value="{{ product.master.id }}">
<div id="option_types"></div>
<!-- 数量選択 -->
<label>数量</label>
<input id="text-out-of-stock" value="在庫切れ" disabled style="display:none;">
<select id="quantity" name="quantity" style="display:none;"></select>
<!-- 再入荷お知らせ -->
<a id="btn-stock-waiting-list" href="javascript:void(0);" style='display:none;'>再入荷お知らせ</a>
<!-- カートに商品を追加(任意) -->
<button id="btn-add-async" type="button" style="display:none;">カートに商品を追加</button>
<!-- カート追加 -->
{% if valid_pre_order_variant %}
<button id="btn-add-async" type="button" style="display:none;">カートに商品を追加</button>
<button id="btn-add" style="display:none;">購入手続きへ</button>
{% endif %}
</form>
<!-- 併売商品が設定されている場合 -->
{% if product.has_co_selling_product? %}
<!--「ショップ管理 > 各種設定 > ショップの機能設定」の「併売商品複数設定」が有効の場合 -->
{% if base_info.multiple_co_selling_products? %}
<div id="co-selling-product-view">
<ul>
<li class="co-selling-tab">
<a id="co-selling-single-tab" href="#co-selling-single">通常購入</a>
</li>
<li class="co-selling-tab">
<a id="co-selling-recurring-tab" href="#co-selling-recurring">定期購入</a>
</li>
<li class="co-selling-tab">
<a id="co-selling-relations-tab" href="#co-selling-relations">関連商品</a>
</li>
</ul>
<div>
<!-- 単品商品 -->
<div id="co-selling-single">
{% for co_selling_product in co_selling_products["single"] %}
<div class="co-selling-list" data-product-id="{{ co_selling_product["id"] }}">
{{ co_selling_product["name"] }}
<span class="co-list_price">{{ co_selling_product["list_price"] }}</span>
<span class="co-list_price_include_tax">{{ co_selling_product["list_price_include_tax"] }}</span>
<span class="co-sales_price">{{ co_selling_product["sales_price"] }}</span>
<span class="co-sales_price_include_tax">{{ co_selling_product["sales_price_include_tax"] }}</span>
{% if co_selling_product["labels"] or co_selling_product["delivery_group_names"] %}
{% for co_selling_label in co_selling_product["labels"] %}
{{ co_selling_label["name"] }}
{% endfor %}
{% for delivery_group_name in co_selling_product["delivery_group_names"] %}
{{ delivery_group_name }}
{% endfor %}
{% endif %}
{% if co_selling_product["invalid_pre_order"] %}
予約受付期間外のためカートに商品を追加できません。
{% endif %}
<p class="co-campaign" style="display: none;">
セール終了まで<span class="co-campaign-text"></span>
</p>
<form class="co-add-shop-cart-form" action="/shop/cart/add" method="post">
<input class="co-variant-id" type="hidden" name="variant_id" value="{{ co_selling_product["master"]["id"] }}">
<div class="co-option_types">
<div class="co-form-input-group">
<input class="co-text-out-of-stock" value="在庫切れ" disabled style="display:none;">
<select class="co-quantity" name="quantity" style="display:none;"></select>
<a class="co-btn-stock-waiting-list" href="javascript:void(0);" style="display:none;">再入荷お知らせ</a>
{% unless co_selling_product["invalid_pre_order"] %}
<button class="co-btn-add-async" type="button" style="display:none;">カートに商品を追加</button>
<button class="co-btn-add" style="display:none;">購入手続きへ</button>
{% endunless %}
</div>
</div>
</form>
</div>
{% endfor %}
</div>
<!-- 定期商品 -->
<div id="co-selling-recurring">
{% for co_selling_product in co_selling_products["recurring"] %}
<div class="co-selling-list" data-product-id="{{ co_selling_product["id"] }}">
{{ co_selling_product["name"] }}
<span class="co-list_price">{{ co_selling_product["list_price"] }}</span>
<span class="co-list_price_include_tax">{{ co_selling_product["list_price_include_tax"] }}</span>
<span class="co-sales_price">{{ co_selling_product["sales_price"] }}</span>
<span class="co-sales_price_include_tax">{{ co_selling_product["sales_price_include_tax"] }}</span>
{% if co_selling_product["labels"] or co_selling_product["delivery_group_names"] %}
{% for co_selling_label in co_selling_product["labels"] %}
{{ co_selling_label["name"] }}
{% endfor %}
{% for delivery_group_name in co_selling_product["delivery_group_names"] %}
{{ delivery_group_name }}
{% endfor %}
{% endif %}
{% if co_selling_product["invalid_pre_order"] %}
予約受付期間外のためカートに商品を追加できません。
{% endif %}
<p class="co-campaign" style="display: none;">
セール終了まで<span class="co-campaign-text"></span>
</p>
<form class="co-add-shop-cart-form" action="/shop/cart/add" method="post">
<input class="co-variant-id" type="hidden" name="variant_id" value="{{ co_selling_product["master"]["id"] }}">
<div class="co-option_types">
<div class="co-form-input-group">
<input class="co-text-out-of-stock" value="在庫切れ" disabled style="display:none;">
<select class="co-quantity" name="quantity" style="display:none;"></select>
<a class="co-btn-stock-waiting-list" href="javascript:void(0);" style="display:none;">再入荷お知らせ</a>
{% unless co_selling_product["invalid_pre_order"] %}
<button class="co-btn-add-async" type="button" style="display:none;">カートに商品を追加</button>
<button class="co-btn-add" style="display:none;">購入手続きへ</button>
{% endunless %}
</div>
</div>
</form>
</div>
{% endfor %}
</div>
<!-- 関連商品 -->
<div id="co-selling-relations">
{% for relation_product in relation_products %}
<div class="co-selling-list" data-product-id="{{ relation_product["id"] }}">
{{ relation_product["name"] }}
<span class="co-list_price">{{ relation_product["list_price"] }}</span>
<span class="co-list_price_include_tax">{{ relation_product["list_price_include_tax"] }}</span>
<span class="co-sales_price">{{ relation_product["sales_price"] }}</span>
<span class="co-sales_price_include_tax">{{ relation_product["sales_price_include_tax"] }}</span>
{% if relation_product["labels"] or relation_product["delivery_group_names"] %}
{% for co_selling_label in relation_product["labels"] %}
{{ co_selling_label["name"] }}
{% endfor %}
{% for delivery_group_name in relation_product["delivery_group_names"] %}
{{ delivery_group_name }}
{% endfor %}
{% endif %}
{% if relation_product["invalid_pre_order"] %}
予約受付期間外のためカートに商品を追加できません。
{% endif %}
<p class="co-campaign" style="display: none;">
セール終了まで<span class="co-campaign-text"></span>
</p>
<form class="co-add-shop-cart-form" action="/shop/cart/add" method="post">
<input class="co-variant-id" type="hidden" name="variant_id" value="{{ relation_product["master"]["id"] }}">
<div class="co-option_types">
<div class="co-form-input-group">
<input class="co-text-out-of-stock" value="在庫切れ" disabled style="display:none;">
<select class="co-quantity" name="quantity" style="display:none;"></select>
<a class="co-btn-stock-waiting-list" href="javascript:void(0);" style="display:none;">再入荷お知らせ</a>
{% unless relation_product["invalid_pre_order"] %}
<button class="co-btn-add-async" type="button" style="display:none;">カートに商品を追加</button>
<button class="co-btn-add" style="display:none;">購入手続きへ</button>
{% endunless %}
</div>
</div>
</form>
</div>
{% endfor %}
</div>
</div>
</div>
<!-- 「ショップ管理 > 各種設定 > ショップの機能設定」の「併売商品複数設定」が無効の場合 -->
{% else %}
<button id="btn-single-product" disabled>単品購入</button>
<button id="btn-recurring-product">定期購入</button>
{% endif %}
{% endif %}
<!-- お気に入り登録 -->
{% assign is_favorite = product.id | check_current_customer_favorite %}
{% if is_favorite %}
{% if customer_signed_in %}
<form action="/shop/products/{{ product.master.sku }}/unfavorite?customer_return_to=%2Fshop%2Fproducts%2F{{ product.master.sku }}" method="post">
<button data-disable-with="解除中..." type="submit">
お気に入りに追加済み
</button>
</form>
{% endif %}
{% else %}
<form action="/shop/products/{{ product.master.sku }}/favorite?customer_return_to=%2Fshop%2Fproducts%2F{{ product.master.sku }}" method="post">
<button data-disable-with="登録中..." type="submit">
お気に入りに追加
</button>
</form>
{% endif %}
<!-- 商品テキスト(商品カテゴリ) -->
{% for product_extra_text in product.extra_text_from_product_category %}
{{ product_extra_text }}
{% endfor %}
<!-- レビューコンテンツ -->
{% if base_info.use_review? %}
<!-- レビュー一覧 -->
{% assign is_readable = product.id | check_review_reading_rule %}
{% if is_readable %}
{% if reviews.size == 0 %}
この商品のレビューはありません。
{% else %}
<!-- レビュー件数(任意) -->
{{ reviews.size }} 件のレビュー
<!-- レビュー平均点(任意) -->
{{ product.average_star }}
{% for review in reviews %}
<!-- レビューのリアクション機能を利用する場合、画面制御に id 属性を利用するため変更不可 -->
<div id="review-{{ review.id }}">
<!-- レビュータイトル -->
{{ review.title }}
<!-- レビュー投稿日時(任意) -->
{{ review.created_at | date: '%Y/%m/%d %H:%M:%S' }}
<!-- 投稿者 -->
{{ review.name }}
<!-- 評価 -->
{{ review.display_star }}
<!-- レビューコメント -->
{{ review.comment | simple_format }}
<!-- レビューのリアクション(参考になった) -->
{% if base_info.review_reaction? %}
<!-- レビューにリアクションした人数 -->
{% unless review.reactions_count == 0 %}
{{ review.reactions_count }}人が「参考になった」と回答しています。
{% endunless %}
{% unless review.customer.id == current_customer&.id %}
{% if reacted_review_ids contains review.id %}
ご意見ありがとうございます。
<!-- レビューのリアクション(参考になった)の取り消し -->
{% if base_info.review_reaction_cancellation? %}
<a data-method="post" href="/shop/products/review_reaction_cancellation?customer_return_to=%2Fshop%2Fproducts%2F{{ product.master.sku }}&review_id={{ review.id }}#review-{{ review.id }}">取り消し</a>
{% endif %}
{% else %}
<form action="/shop/products/review_reaction?customer_return_to=%2Fshop%2Fproducts%2F{{ product.master.sku }}#review-{{ review.id }}" method="post">
<input name="review_id" type="hidden" value="{{ review.id }}">
<button type="submit" data-disable-with="参考になった">
参考になった
</button>
</form>
{% endif %}
{% endunless %}
{% endif %}
</div>
{% endfor %}
{% endif %}
{% endif %}
<!-- レビュー投稿フォーム -->
{% assign is_writable = product.id | check_review_writing_rule %}
{% if is_writable %}
<!-- フラッシュメッセージ -->
{{ 'notice' | flash: 'alert alert-success', 'text' }}
{{ 'alert' | flash: 'alert alert-danger', 'text' }}
{{ 'error' | flash: 'alert alert-danger', 'text' }}
<form action="/shop/products/{{ product.id }}/review" method="post">
<!-- 投稿者名 -->
<label for="review_name">投稿者名</label>
<input class="validate[required]" type="text" name="review[name]" id="review_name">
<!-- メールアドレス -->
<label for="review_email">メールアドレス</label>
<input class="validate[required,custom[email]]" type="text" {% if customer_signed_in %}disabled{% endif %} name="email" value="{{ current_customer.email }}" id="review_email">
<!-- 評価 -->
<label for="review_star">おすすめレベル</label>
<select class="validate[required,custom[number]]" name="review[star]" id="review_star">
<option value="5">★★★★★</option>
<option value="4">★★★★</option>
<option value="3">★★★</option>
<option value="2">★★</option>
<option value="1">★</option>
</select>
<!-- タイトル -->
<label for="review_title">タイトル</label>
<input class="validate[required,maxSize[20]]" type="text" name="review[title]" id="review_title">
<!-- コメント -->
<label for="review_comment">コメント</label>
<textarea class="validate[required,maxSize[400]]" name="review[comment]" id="review_comment"></textarea>
<!-- 投稿ボタン -->
<button name="button" type="submit">投稿する</button>
</form>
{% endif %}
{% endif %}
<!-- 関連商品 (「ショップ管理 > 各種設定 > ショップの機能設定」の「併売商品複数設定」が有効の場合、任意) -->
{% if base_info.use_related_products_on_detail? and product.active_related_products.size != 0 %}
<!-- 関連商品一覧 -->
{% for related_product in product.active_related_products %}
<!-- 関連商品画像(任意) -->
<a href="/shop/products/{{ related_product.master.sku }}">
{% if related_product.thumbnail.url %}
{% assign src = related_product.thumbnail.url %}
{% else %}
{% assign src = 'missing' | image_url %}
{% endif %}
<img src="{{ src }}">
</a>
<!-- 関連商品名 -->
<a href="/shop/products/{{ related_product.master.sku }}">{{ related_product.name | truncate: 35 }}</a>
<!-- 商品バッジ(任意) -->
{% if pre_order_badge_flg_hash[related_product.master.id] or delivery_group_badge_flg_hash[related_product.id] or concurrent_purchase_group_badge_flg_hash[related_product.id] or campaign_badge_flg_hash[related_product.id] %}
<!-- 商品予約マーク(任意) -->
{% if pre_order_badge_flg_hash[related_product.master.id] %}
予約商品
{% endif %}
<!-- 配送温度帯ラベル(任意) -->
{% for delivery_group_name in related_product.delivery_group_names %}
{{ delivery_group_name }}
{% endfor %}
<!-- 同時購入グループバッジ(任意) -->
<!-- 「バッジ表示名」を表示したい場合、related_product.concurrent_purchase_group_names を related_product.concurrent_purchase_badge_names に修正してください。 -->
{% for concurrent_purchase_group_name in related_product.concurrent_purchase_group_names %}
{{ concurrent_purchase_group_name }}
{% endfor %}
<!-- キャンペーンバッジ(任意) -->
{% assign badges = campaign_badge_flg_hash[related_product.id] | liquid_render_badges %}
{% for render_badge in badges %}
{{ render_badge | hash: 'value' }}
{% endfor %}
{% endif %}
<!-- 販売価格 -->
{{ related_product.master.list_price | number_to_currency: format: '%n %u' }}
<!-- カート追加 -->
<form action="/shop/cart/add" method="post">
<input name="variant_id" type="hidden" value="{{ related_product.related_product_variants_id }}">
<button>カートに追加する</button>
</form>
{% endfor %}
{% endif %}
</div>
<!-- Google検索結果画面に商品が持つレビュー数やおすすめレベルを表示-->
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "{{ product.name }}",
"description": "{{ description }}",
{% if product.thumbnail.url %}
"image": "{{ product.thumbnail.url| escape }}",
{% else %}
"image": "{{ 'missing' | image_url }}",
{% endif %}
"offers": {
"@type": "Offer",
{% if product.out_of_stock? %}
"availability": "https://schema.org/OutOfStock",
{% else %}
"availability": "https://schema.org/InStock",
{% endif %}
"price": "{{ product.first_price_include_tax }}",
"priceCurrency": "JPY"
{% assign is_readable = product.id | check_review_reading_rule %}
{% if product.reviews_count > 0 and base_info.use_review? and is_readable %}
},
"aggregateRating" : {
"@type": "AggregateRating",
"reviewCount": "{{ product.reviews_count }}",
"ratingValue": "{{ product.average_star_eval }}"
},
"review": [
{% for review in reviews %}
{% if review.name == empty %}
{% continue %}
{% endif %}
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "{{ review.name }}"
},
"datePublished": "{{ review.created_at | date: "%Y-%m-%d" }}",
"reviewBody": "{{ review.comment }}",
"reviewRating": {
"@type": "Rating",
"ratingValue": "{{ review.star }}"
}
{% if forloop.last %}
}
{% else %}
},
{% endif %}
{% endfor %}
]
{% else %}
}
{% endif %}
}
</script>
画面イメージ
※こちらは、上記で紹介しているコンポーネントのコードにデフォルトデザインをCSSであてたイメージになります。コンポーネントのコードのみだと、このような表示にはなりませんのでご注意ください。