Shopify中能否在JSON schema标签内使用Liquid对象?
哎,刚好之前研究过这个问题,很遗憾的是——Shopify的{% schema %}标签内部的JSON内容是不支持直接使用Liquid对象的,包括你想加的{{ product.id }}这种动态值。
为什么不行?
Shopify处理主题模板的顺序是先解析{% schema %}里的JSON结构(用来生成主题编辑器的配置界面),这个阶段Liquid还没开始渲染,所以动态变量根本不会被解析。而且schema里的配置项ID必须是固定字符串,因为Shopify会把设置值和固定ID绑定存储,动态ID的话主题编辑器根本没法提前识别这些字段,自然也没法保存对应的设置值。
替代实现方案
既然直接在schema里加动态ID走不通,我们可以换个思路来实现“每个产品有独立自定义文本”的需求,这里推荐几个靠谱的方案:
使用产品元字段(Metafields)(最推荐)
这是Shopify官方支持的产品级自定义字段方案:- 先在Shopify后台给产品添加一个元字段(比如命名空间设为
custom,键设为text_custom_1,类型选“单行文本”) - 在
product-template.liquid里直接调用这个元字段的值:
{{ product.metafields.custom.text_custom_1.value }}这样每个产品都能单独设置自定义文本,完全满足你的需求,而且不需要依赖主题编辑器的schema设置。
- 先在Shopify后台给产品添加一个元字段(比如命名空间设为
主题设置+产品标签/选项匹配
如果一定要用主题编辑器的设置界面,可以先在schema里创建多个固定ID的文本字段:{% schema %} { "name": "Product pages", "settings": [ { "type": "text", "id": "text_custom_1", "label": "Custom text for Product A" }, { "type": "text", "id": "text_custom_2", "label": "Custom text for Product B" } ] } {% endschema %}然后在模板里根据产品的标签或选项来判断显示哪个字段:
{% if product.tags contains "product-a" %} {{ section.settings.text_custom_1 }} {% elsif product.tags contains "product-b" %} {{ section.settings.text_custom_2 }} {% endif %}不过这个方案扩展性差,适合产品数量不多的场景。
自定义Liquid片段+硬编码产品ID
如果你只有少量产品需要自定义内容,可以写一个Liquid片段(比如snippets/product-custom-text.liquid),里面用case语句匹配产品ID:{% case product.id %} {% when 123456789 %} 这是产品1的自定义文本 {% when 987654321 %} 这是产品2的自定义文本 {% else %} 默认显示的文本 {% endcase %}然后在
product-template.liquid里引入这个片段:{% render 'product-custom-text' %}这个方法不需要依赖后台设置,但产品多了的话维护起来会很麻烦。
内容的提问来源于stack exchange,提问作者simon

