使用 Shopify Liquid 模板访问元字段中的 JSON 块
Posted
技术标签:
【中文标题】使用 Shopify Liquid 模板访问元字段中的 JSON 块【英文标题】:Access JSON lumps in metafields with Shopify Liquid templates 【发布时间】:2017-03-28 16:39:45 【问题描述】:我想知道是否有人知道我是否可以在 Liquid 中访问 JSON,如下例所示。
我为供应商页面创建了一个元字段,其命名空间为suppliers_details
,键为suppliers
,值为:
name: "Supplier Name One",
address: "Supplier Address One"
,
name: "Supplier Name Two",
address: "Supplier Address Two"
在我的模板中:
% assign suppliers = page.metafields.suppliers.suppliers %
% for supplier in suppliers %
<p> supplier.name </p>
<p> supplier.address </p>
% endfor %
这不起作用,因为我无法将数据更改为模板可以用来迭代的格式,有没有办法做到这一点?
干杯
【问题讨论】:
【参考方案1】:现在支持它并且改变了游戏规则! Shopify 发布了一种名为“json_string”的新元字段格式类型,可让您通过普通液体点表示法直接访问每个节点的值。我知道这将使每个人的生活更轻松。摘自文档 (https://help.shopify.com/en/themes/liquid/objects/metafield):
这是 Shopify 开发人员在 Shopify 论坛上发布的可能有帮助的最初帖子之一:https://ecommerce.shopify.com/c/api-announcements/t/new-json_string-value-type-for-metafield-object-540896
【讨论】:
【参考方案2】:无法使用 Liquid 解析 JSON,或者至少不是默认方式。
您可以编写一些代码将其拆分为多个部分,但您将无法链接对象:
% capture string %name:"Supplier Name One",address:"Supplier Address One",name:"Supplier Name Two",address:"Supplier Address Two"% endcapture %
% assign jsplit = string | replace: ',', '@@' %
% assign jsplit = jsplit | replace: '' %
% assign jsplit = jsplit | replace: '' %
% assign jsplit = jsplit | split: '@@' %
% for json in jsplit %
% assign splitByComma = json | split: ',' %
% for comma in splitByComma %
% assign splitByDots = comma | split: ':' %
<p> splitByDots[1] </p>
% endfor %
% endfor %
你会得到想要的结果,但不是你想象的那样。
最好的方法是将字符串传递给 javascript,在那里解析它并通过 JS 填充 DOM。
【讨论】:
谢谢。并且没有使用 Shopify 来包含 YAML 文件并解析它们的功能(正如 Jekyll 允许的那样)? 不,当然不是。为什么 Shopify 会使用浏览器中没有模拟的格式? JSON 是浏览器中客户端计算的标准数据结构,因此您得到 JSON。由于 JSON 是一个字符串,我们很幸运将它们存储在元字段中,然后使用我们可信赖的 JS 渲染其中的数据。 用 JS 构建它的一个问题是 SEO。如果这是一个菜单或需要对 SEO 友好的东西,使用 JS 构建它会影响您的 SEO。 老兄......这是解决这个问题的最疯狂和绝对唯一的方法。我在流口水。我的项目完成了。我有 200 种产品,它们都具有独特的属性但没有变体,我只希望在确认电子邮件中显示独特的信息。所以我标记我的产品,并在发送收据之前解析 json 标签。如此史诗。谢谢。【参考方案3】:Shopify 已弃用“json_string”元字段并提供“json”元字段选项。
要使用点符号访问数据,您需要在键后使用 .value。
例如,如果我有这个 JSON:
name: "Supplier Name One",
address: "Supplier Address One"
,
name: "Supplier Name Two",
address: "Supplier Address Two"
我会这样访问它:
% assign suppliers = page.metafields.suppliers.suppliers.value %
% for supplier in suppliers %
<p> supplier.name </p>
<p> supplier.address </p>
% endfor %
【讨论】:
【参考方案4】:我认为它现在正在工作,下面是我的 json ,它是产品元字段 & valueType 是 json 字符串
[
"question":"hello this is question",
"answer":"Hello This is answer"
,
"question":"hello this is question2 ",
"answer":"Hello This is answer 2"
]
Blow 是液体代码
% assign qas = product.metafields.manifester.product_qa % // product.metafields.namespace.key
% for qa in qas %
<div style="border-bottom: 1px solid #222222;">
<p> qa.question </p>
<p style="font-weight:bold"> qa.answer </p>
</div>
% endfor %
【讨论】:
这是否适用于新类型“json”,因为“json_string”已被弃用?以上是关于使用 Shopify Liquid 模板访问元字段中的 JSON 块的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VS Code 中验证 Shopify Liquid 模板中的 JSON?
Shopify Plus 启用 Checkout.liquid