【问题标题】:Shopify(Liquid) multiple conditions in if statementShopify(Liquid) if 语句中的多个条件
【发布时间】:2019-06-02 13:46:24
【问题描述】:

我正在遍历所有集合,并为每个集合标题、图像和链接创建一个预览项目。但我有 15 个收藏要排除。

目前我正在使用“包含”来排除我不想要的 15 个,但我想知道是否有更简洁的方法来编写这个,因为它的 if 条件真的很长。

提前致谢!

示例如下:

{% for collection in collections %}
    {% if collection.title contains 'collection-1' or collection.title 
    contains 'collection-2' or collection.title contains 'collection-3' 
    or collection.title contains 'collection-4' or collection.title 
    contains 'collection-5' %}

    {% else %}

        // build item here

    {% endif %}
{% endfor %}

【问题讨论】:

    标签: shopify liquid


    【解决方案1】:

    实现排除的另一种方法:

    如果您为您的收藏提供某种标志,表明它们不应出现在您的收藏循环中,您可以直接管理每个收藏,而不是维护一个单独的列表。

    但是,如果我们在您的管理员中查看收藏页面,我们并没有得到很多有用的信息:我们看到的只是标题、描述等内容。甚至没有为收藏提供特定标签的地方!

    幸运的是,集合可以包含元字段 - Shopify 只是将这个功能隐藏在普通用户之外。元字段允许您为商店中的对象(产品、集合、页面等)创建附加信息,然后您可以通过 Liquid 引用这些信息。

    您可以在此处阅读有关 Shopify 使用元字段的更多信息:https://www.shopify.com/partners/blog/110057030-using-metafields-in-your-shopify-theme

    我之前最喜欢的用于访问元字段的插件是 ShopifyFD,这是一个浏览器扩展程序,可让您直接在您的收藏页面上查看和编辑元数据,但不幸的是,Shopify 最近对管理员的更改破坏了该插件。作者正在开发新版本,但在撰写本文时尚未准备好:https://freakdesign.com.au/blogs/news/shopifyfd-and-the-current-case-of-the-broken-tool

    (注意:我没有尝试上述链接文章中列出的任何其他元字段编辑工具 - 当 ShopifyFD 开始出现问题时,我开始使用管理 API 进行元字段编辑并自己创建/发布请求: https://help.shopify.com/en/api/reference/metafield)

    一旦您有一种方法可以轻松设置元字段(令人惊讶的是,这似乎是目前最困难的部分),您的 for 循环逻辑就非常简单。假设您为此目的创建的元字段具有命名空间“预览”和键“排除”:

    {% for collection in collections %}
      {% if collection.metafields.preview.exclude %}
        {% continue %}
      {% endif %}
      {% comment %}  Do stuff! {% endcomment %}
    {% endfor %}
    

    现在这将跳过在您的自定义字段中设置了任何值的任何集合,因此,如果您对任何当前或未来的集合改变主意,只需更改集合本身的一个元字段。

    【讨论】:

    • 感谢您的回答!我将研究元字段插件,否则排除数组是有意义的:)
    • 别担心!希望您能找到最适合您情况的解决方案:)
    【解决方案2】:

    我会创建一个排除数组并检查我的排除数组是否包含相关的集合。 (而不是标题,我会使用集合句柄,因为句柄保证只是“干净”的名称并保证是唯一的)

    例子:

    {% assign collection_exclusion_array = 'collection-1, collection-2, collection-3, collection-4, collection-5' | remove: ' ' | split: ',' %}
    {% for collection in collections %}
      {% if collection_exclusion_array contains collection.handle %}
        {% continue %}
      {% endif %}
      {% comment %} Build items here {% endcomment %}
    {% endfor %}
    

    它是如何工作的:

    • 我们不能直接在 Liquid 中创建数组 - 我们只能通过获取字符串并使用拆分过滤器创建数组来创建数组。
    • 通过使用句柄,我们保证我们的列表值仅包含字母、数字和连字符 - 我们的分隔符(在本例中为逗号)不可能意外地作为值的一部分出现。
    • 我们不希望空格成为数组值的一部分,因此我们在使用拆分过滤器之前将其删除。相反,我们可以不在每个值之间放置空格,而是在我的大脑中读起来像是对语法的严重滥用。第一次省略空格或在创建字符串后删除它们都可以。
    • 现在我们有了排除数组,当我们遍历集合时,我们可以检查当前集合的句柄是否显示在列表中。
    • 如果找到,请使用continue 语句跳到下一个集合 - 这样可以节省一层缩进,因为我们不必有一个空的if 后跟一个包含我们想要的所有内容的else做。

    你去吧!希望对你有帮助:)

    注意:有关 Shopify 中手柄的更多信息,请参阅https://help.shopify.com/en/themes/liquid/basics/handle

    【讨论】:

    • 还要注意:此答案与发布的示例之间的区别在于 contains 在用于字符串和用于数组时的行为略有不同。当与字符串一起使用时,如果contains 匹配第一个值的任何子字符串,它将为真。在数组上使用时,contains 只有在数组中的值与我们的搜索词完全匹配时才会返回 true。在您的示例中,标题为“collection-10”、“pokemon-collection-1-of-1000”和“Best of Jazz:collection-1”的收藏都与您的第一次检查相符,但 'collection-1' 将在使用数组时匹配。
    猜你喜欢
    • 2019-03-20
    • 2015-01-20
    • 2013-12-17
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多