Shopify Liquid如何从区块设置获取完整产品对象?
问题:在Shopify Liquid中从区块设置获取完整Product对象
我希望从区块(block)设置中获取完整的product对象,但目前仅能返回handle。是否可以无需逐个指定产品就能获取完整对象?以下代码对集合(collection)有效,但对区块无效:
{%- liquid assign ss = section.settings assign collection = collections[ss.based_on_collection] -%} {% assign productsArray = "" %} {% if ss.carousel_type == 'manual' %} {% for block in section.blocks %} {% assign productJSON = block.settings.product | json %} {% if productsArray == "" %} {% assign productsArray = productJSON %} {% else %} {% assign productsArray = productsArray | append: "," | append: productJSON %} {% endif %} {% endfor %} {% elsif ss.carousel_type == 'collection' %} {% for product in collection.products %} {% assign productJSON = product | json %} {% if productsArray == "" %} {% assign productsArray = productJSON %} {% else %} {% assign productsArray = productsArray | append: "," | append: productJSON %} {% endif %} {% endfor %} {% endif %} {% assign productsArray = "[" | append: productsArray | append: "]" %}
我可以通过如下方式用all_products实现,但性能开销较大,希望避免使用;也可在JavaScript文件中调用Storefront API实现,但我希望仅用Liquid完成,是否可行?
{% assign productHandle = block.settings.product %} {% assign product = all_products[productHandle] %}
回答
在Shopify Liquid中,区块设置里的product类型字段默认仅返回产品handle,没有直接的方法能批量获取完整Product对象而不依赖all_products或外部API。不过可以通过优化手段降低all_products的性能影响:
- 控制
all_products调用数量
Shopify对all_products有最多20个产品的调用限制,若手动选择的产品数量不超过这个阈值,完全可以安全使用。同时可通过逻辑优化减少冗余操作:
{% if ss.carousel_type == 'manual' %} {% assign productsArray = "" %} {% for block in section.blocks %} {% assign product = all_products[block.settings.product] %} {% if product %} {% assign productJSON = product | json %} {% assign productsArray = productsArray | append: "," | append: productJSON %} {% endif %} {% endfor %} {% assign productsArray = productsArray | strip %} {% if productsArray != "" %} {% assign productsArray = "[" | append: productsArray | remove_first: "," | append: "]" %} {% else %} {% assign productsArray = "[]" %} {% endif %} {% endif %}
- 简化JSON拼接逻辑
使用Liquid的capture标签替代繁琐的空值判断,让代码更简洁:
{% if ss.carousel_type == 'manual' %} {% capture productsJSON %} {% for block in section.blocks %} {% assign product = all_products[block.settings.product] %} {% if product %} {{ product | json }}, {% endif %} {% endfor %} {% endcapture %} {% assign productsArray = productsJSON | strip | remove_last: "," %} {% assign productsArray = "[" | append: productsArray | append: "]" %} {% endif %}
- 性能补充说明
all_products的性能开销主要来自超限制调用或批量拉取大量数据,若手动选品数量在20以内,性能影响几乎可忽略。- 无法通过Liquid直接从区块设置批量获取完整Product对象是Shopify的设计限制——区块字段仅返回引用(handle)而非完整对象,必须通过
all_products或API拉取完整数据。
内容的提问来源于stack exchange,提问作者dustin
相关产品推荐
相关产品推荐

