我对Shopify来说是个新人,在试图解决我的问题时,我一直在玩这个星期左右而没有太大的成功。
我目前正在使用布鲁克林模板,他们代表产品页面的方式并不能精确地提供最佳用户体验。默认情况下,它表示图像的方式是将所有产品变体图像始终显示给客户,即使他实际上并没有纠正该变体(即产品的特定颜色)。它还以垂直方式显示所有产品图像,如果每个产品变体有多张图片,则导致用户导航非常令人沮丧。
我在网上找到了一个教程(http://littlesnippets.ca/blogs/tutorials/15665261-grouping-images-with-variants),该教程解决了我的问题,隐藏了客户未选择的变体图片,并在用户点击后显示。(你可以在这里看到我想要的一个例子http://group-variant-images.myshopify.com/collections/frontpage/products/anson-chair)。这或多或少看起来我现在的网站(https://themes.shopify.com/themes/brooklyn/styles/brooklyn/preview)。
问题在于该教程正在应用于未使用Ii所做的确切主题/功能的网站,尽管它很相似。 我没有将这些更改应用到我的主题,有人可以帮我一把吗?
这是我的product.liquid代码片段:
<!-- /templates/product.liquid -->
<div itemscope itemtype="http://schema.org/Product">
<meta itemprop="url" content="{{ shop.url }}{{ product.url }}">
<meta itemprop="image" content="{{ product.featured_image.src | img_url: 'grande' }}">
{% assign current_variant = product.selected_or_first_available_variant %}
<div class="grid product-single">
<div class="grid__item large--seven-twelfths medium--seven-twelfths text-center">
<div class="product-single__photos">
{% assign featured_image = current_variant.featured_image | default: product.featured_image %}
{% comment %}
Display current variant image, or default first
{% endcomment %}
<div class="product-single__photo-wrapper">
<img class="product-single__photo" id="ProductPhotoImg" src="{{ featured_image | img_url: 'grande' }}" {% if settings.product_zoom_enable %}data-mfp-src="{{ featured_image | img_url: '1024x1024' }}"{% endif %} alt="{{ featured_image.alt | escape }}" data-image-id="{{ featured_image.id }}">
</div>
{% comment %}
Display rest of product images, not repeating the featured one
{% endcomment %}
{% for image in product.images %}
{% unless image contains featured_image %}
<div class="product-single__photo-wrapper">
<img class="product-single__photo" src="{{ image.src | img_url: 'grande' }}" {% if settings.product_zoom_enable %}data-mfp-src="{{ image.src | img_url: '1024x1024' }}"{% endif %} alt="{{ image.alt | escape }}" data-image-id="{{ image.id }}">
</div>
{% endunless %}
{% endfor %}
</div>
</div>
<div class="grid__item product-single__meta--wrapper medium--five-twelfths large--five-twelfths">
<div class="product-single__meta">
{% if settings.product_vendor_enable %}
<h2 class="product-single__vendor" itemprop="brand">{{ product.vendor }}</h2>
{% endif %}
<h1 class="product-single__title" itemprop="name">{{ product.title }}</h1>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
{% comment %}
Optionally show the 'compare at' or original price of the product.
{% endcomment %}
{% if product.compare_at_price_max > product.price %}
<span class="product-single__price--wrapper">
<span class="visually-hidden">{{ 'products.general.regular_price' | t }}</span>
<span id="ComparePrice" class="product-single__price--compare-at">
{% if current_variant.compare_at_price > current_variant.price %}
{{ current_variant.compare_at_price | money }}
{% endif %}
</span>
<span class="visually-hidden">{{ 'products.general.sale_price' | t }}</span>
</span>
{% endif %}
<span id="ProductPrice" class="product-single__price{% if product.compare_at_price > product.price %} on-sale{% endif %}" itemprop="price">
{{ current_variant.price | money }}
</span>
<hr class="hr--small">
<meta itemprop="priceCurrency" content="{{ shop.currency }}">
<link itemprop="availability" href="http://schema.org/{% if product.available %}InStock{% else %}OutOfStock{% endif %}">
<form action="/cart/add" method="post" enctype="multipart/form-data" class="product-single__form" id="AddToCartForm">
<select name="id" id="ProductSelect" class="product-single__variants">
{% for variant in product.variants %}
{% if variant.available %}
<option {% if variant == product.selected_or_first_available_variant %} selected="selected" {% endif %} data-sku="{{ variant.sku }}" value="{{ variant.id }}">{{ variant.title }} - {{ variant.price | money_with_currency }}</option>
{% else %}
<option disabled="disabled">
{{ variant.title }} - {{ 'products.product.sold_out' | t }}
</option>
{% endif %}
{% endfor %}
</select>
{% comment %}
<div class="product-single__quantity">
<label for="Quantity" class="product-single__quantity-label js-quantity-selector">{{ 'products.product.quantity' | t }}</label>
<input type="number" hidden="hidden" id="Quantity" name="quantity" value="1" min="1" class="js-quantity-selector">
</div>
{% endcomment %}
<div class="product-single__add-to-cart">
<button type="submit" name="add" id="AddToCart" class="btn">
<span id="AddToCartText">{{ 'products.product.add_to_cart' | t }}</span>
</button>
</div>
</form>
</div>
<div class="product-single__description rte" itemprop="description">
{{ product.description }}
</div>
{% if settings.social_sharing_products %}
{% include 'social-sharing' %}
{% endif %}
</div>
</div>
</div>
{% if collection %}
<hr class="hr--clear">
<div class="text-center">
<a href="{{ collection.url }}" class="return-link">← {{ 'products.general.collection_return' | t: collection: collection.title }}</a>
</div>
{% endif %}
</div>
{% comment %}
*IMPORTANT:*
This theme uses a customized version of `option_selection.js` to support using radio inputs for color and size variants. The custom version is in `variant_selection.js`.
If you wish to enable the default dropdowns for size and color
you can change the liquid asset tag below from:
{{ 'variant_selection.js' | asset_url | script_tag }}
to
{{ 'option_selection.js' | shopify_asset_url | script_tag }}
If you use the default `option_selection.js` the labels for the dropdowns will appear outside the dropdown.
You will also need to change `.radio-wrapper` to `.selector-wrapper` below.
{% endcomment %}
{{ 'variant_selection.js' | asset_url | script_tag }}
<script>
var selectCallback = function(variant, selector) {
timber.productPage({
money_format: "{{ shop.money_format }}",
variant: variant,
selector: selector,
translations: {
addToCart : {{ 'products.product.add_to_cart' | t | json }},
soldOut : {{ 'products.product.sold_out' | t | json }},
unavailable : {{ 'products.product.unavailable' | t | json }}
}
});
};
jQuery(function($) {
new Shopify.OptionSelectors('ProductSelect', {
product: {{ product | json }},
onVariantSelected: selectCallback,
enableHistoryState: true
});
// Add label if only one product option and it isn't 'Title'. Could be 'Size'.
{% if product.options.size == 1 and product.options.first != 'Title' %}
$('.radio-wrapper:eq(0)').prepend('<label for="ProductSelect-option-0" class="single-option-radio__label">{{ product.options.first | escape }} </label>');
{% endif %}
// Hide drop-down selectors if we only have 1 variant and its title contains 'Default'.
{% if product.variants.size == 1 and product.variants.first.title contains 'Default' %}
$('.selector-wrapper').hide();
{% endif %}
});
</script>
答案 0 :(得分:2)
Shopify的管理界面仅允许每个变体生成一个产品图像。因此,做你想做的事情并不像你希望的那么容易。通过Shopify API,您可以将metafields
添加到products
和product variants
,在这些metafields
中,您可以存储所需的任何信息 - 包括指向其他图片的链接。以下是metafields
变体文档的链接:https://docs.shopify.com/api/reference/product_variant
由于管理界面并不能让您直接修改元数据,因此您有以下几种选择:
无论哪种方式,你都需要提出某种属性名称约定,这样你就知道你正在处理图像,因为metafields
接受你想要放入它们的任何东西。
一旦您能够为您的产品变体定义图像,您就需要更新liquid / javascript中的逻辑以完成所需的功能。你可以用几种不同的方式做到这一点,不同的人会根据搜索引擎优化有不同的意见,但我对阻力最小的路径的建议就是做这样的事情:
{% for v in product.variants %}
<div id="variant_{{ v.id }}">
{% for m in v.metafields %}
{% if m.key contains "WHATEVER_CONVENTION_YOU_USED_TO_DENOTE_IMAGES" %}
{% comment %}
OUTPUT THE IMAGE TAG - PROBABLY WRAPPED IN AN ANCHOR
{% endcomment %}
{% endif %}
{% endfor %}
</div>
{% endfor %}
您需要合并一些逻辑来显示和隐藏基于变体的div。请注意<div id="variant_{{ v.id }}">
这种方法而不是使用api来填充js对象的原因是你的链接已经在DOM中了,你可以在页面加载时创建javascript处理程序。如果您等到填充图像和链接,直到用户选择变体,那么您将不得不处理动态创建的节点的事件处理。
希望这一切能指导你朝着一个好方向前进。如果您有任何疑问或需要帮助,请随时通过我的个人资料与我联系。
附加说明:优秀的软件开发人员会注意到上面代码中的O(n ^ 2)时间复杂度。 Shopify在页面加载时不执行您的后端代码,而是在上传或修改主题时执行和缓存。因此,较差的O(n ^ 2)时间复杂度不会影响页面加载性能。
作为一个有趣的事实,这就是Shopify无法为current_time或random创建Liquid标签的原因。它们的缓存机制可以防止站点在Shark Tank上出现时崩溃,这也取决于它们的液体标签,过滤器和块不会返回可变结果的事实。因此,他们可以缓存生成的HTML并直接从他们的缓存服务器提供它......因此像random或current_time这样的标签只能运行一次。
答案 1 :(得分:0)
您可以尝试variant-image-automator付费应用。这会隐藏产品页面中不必要的图像。