在 Liquid 中使用 metafields
创建 metafield 后,你可以在 theme 中用 Liquid 读取并展示它的值。本指南介绍访问语法、各类型的渲染方式,以及如何处理缺失值。
关于 metafields 是什么、如何构成,见概述;完整的类型列表见类型。
访问 metafield
通过父资源、namespace 和 key 访问 metafield:
{{ resource.metafields.namespace.key }}
- 父资源(parent resource)——metafield 所挂载的那个对象。在 Liquid 中,你从暴露了
metafields属性的对象上读取 metafield,并通过相应页面访问:商品页用product,集合页用collection。某个对象是否暴露metafields,以该对象的参考页为准。 - namespace(命名空间)——把相关 metafield 归在一起、避免 key 冲突的容器(例如
custom)。 - key(键)——metafield 自身的名字(例如
spec_text)。
这返回一个 metafield object,而不是存储的值。要输出值,需追加 .value。
例如,假设某商品在 custom 命名空间下有一个名为 spec_text 的 single_line_text_field(单行文本)metafield,值为 100% cotton:
{{ product.metafields.custom.spec_text.value }}
100% cotton
🚧 注意
访问 metafield 始终返回一个 metafield object,即使该 metafield 不存在,结果也不是
nil。判断是否有值要检测.value,而不是 metafield 本身。见处理缺失值。
渲染各类型
如何读取 .value 取决于 metafield 的类型。下面每个示例都假设该商品在 custom 命名空间下有对应名字的 metafield。
文本、数字、日期、布尔、颜色和 URL
这些标量类型直接从 .value 返回值。例如上面的单行文本字段 spec_text(值为 100% cotton):
{{ product.metafields.custom.spec_text.value }}
100% cotton
multi_line_text_field、number_integer、number_decimal、date、date_time、boolean、color、url 都适用同样的写法。
JSON
对于 json 类型的 metafield,.value 是一个已解析的对象。按属性名访问嵌套属性。假设 details_json 的值为 {"foo": "bar"}:
{{ product.metafields.custom.details_json.value.foo }}
bar
度量(重量、体积、尺寸)
这些类型返回一个 measurement object。分别读取数值和单位。例如一个值为 20 千克的 weight 字段 net_weight:
{{ product.metafields.custom.net_weight.value.value }} {{ product.metafields.custom.net_weight.value.unit }}
20 KILOGRAMS
评分
rating 类型的 metafield 返回一个 rating object。例如一个满分为 10、评为 4 分的 review_score:
{{ product.metafields.custom.review_score.value.value }} / {{ product.metafields.custom.review_score.value.scale_max }}
4 / 10.0
文件(图片)
file_reference 类型的 metafield 把文件挂在 value.image 下。例如一个存有图片的 spec_file,可直接输出图片 URL,或将 value 传给 img_url 过滤器进行缩放:
<img src="{{ product.metafields.custom.spec_file.value.image.src }}">
<img src="{{ product.metafields.custom.spec_file.value | img_url: '400x' }}">
处理缺失值
由于访问 metafield 永远不会返回 nil,请在 .value 上做判断后再输出:
{% if product.metafields.custom.spec_text.value != blank %}
<p>Material: {{ product.metafields.custom.spec_text.value }}</p>
{% endif %}
用 metafield 过滤器渲染
无需自己读取 .value 再拼装标记,metafield_tag 和 metafield_text 过滤器会根据 metafield 的类型直接输出内容:
metafield_tag把值包进适配该类型的 HTML 元素,并带上metafield-<类型>的 class——可直接放进页面。metafield_text把值作为纯文本返回,适合需要原始字符串的场景。
以上面的 spec_text 字段(100% cotton)为例:
{{ product.metafields.custom.spec_text | metafield_tag }}
{{ product.metafields.custom.spec_text | metafield_text }}
<span class="metafield-single_line_text_field">100% cotton</span>
100% cotton