使用 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:如何在集合模板上显示特定集合

Shopify 部分中的变量范围

Shopify Plus 启用 Checkout.liquid

在 webStorm/phpStorm 中启用 Liquid 模板语法高亮

用于 Shopify 主题开发的 LESS CSS 和转义 Liquid 语法