You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的性能影响:

  1. 控制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 %}
  1. 简化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 %}
  1. 性能补充说明
  • all_products的性能开销主要来自超限制调用或批量拉取大量数据,若手动选品数量在20以内,性能影响几乎可忽略。
  • 无法通过Liquid直接从区块设置批量获取完整Product对象是Shopify的设计限制——区块字段仅返回引用(handle)而非完整对象,必须通过all_products或API拉取完整数据。

内容的提问来源于stack exchange,提问作者dustin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:16:23