【问题标题】:Display a set of collections that include a product with a specific tag显示一组包含具有特定标签的产品的集合
【发布时间】:2019-03-01 14:23:13
【问题描述】:

我正在尝试设置一个显示集合列表的页面,例如一般的“list-collections.liquid”,但仅显示包含具有特定产品标签的产品的集合。

我试过这样做:

 {% assign var = 'test' %}
    {% assign tagtrue = false %}
    {% for collection in collections %}
      {% unless collection.handle == 'frontpage' %}
      {% for product in collection.products %}
      {% for tag in product.tags %}
        {% if tag contains var %}
          {% assign tagtrue = true %}
        {% endif %}
      {% endfor %}
    {% endfor %}
      {% if tagtrue == true %}
        <a href="{{ collection.url }}" title="{{ 'collections.general.link_title' | t: title: title }}">
          {% if collection.image != blank %}
            {{ collection | img_url: '480x480' | img_tag: collection.title }}
          {% elsif collection.products.first != blank %}
            {{ collection.products.first | img_url: '480x480' | img_tag: collection.title }}
          {% else %}
            {% capture current %}{% cycle 1, 2, 3, 4, 5, 6 %}{% endcapture %}
            {{ 'collection-' | append: current | placeholder_svg_tag: 'placeholder-svg placeholder-svg--small' }}
          {% endif %}
        </a>

        <p>
          <a href="{{ collection.url }}" title="{{ 'collections.general.link_title' | t: title: title }}">{{ collection.title }}</a>
        </p>
        {% endif %}
      {% endunless %}
    {% endfor %}

但是当我进入收藏列表页面时,它仍然会返回所有收藏。任何想法如何做到这一点?

【问题讨论】:

    标签: shopify


    【解决方案1】:

    如果您查看文档,您会发现产品上有一个特殊的方法,标记为 collections。换句话说,这会为您提供该产品所属的所有系列的列表。

    那么现在回答你的问题。您询问如何显示集合列表,但仅显示包含具有特定标签的产品的集合。好,可以。您将把速度吹出窗外,但一个简单的算法可能是:

    • 创建带有标签foomanchu的产品集合
    • 迭代该集合中的产品,并使用 product.collections
    • 对于列出的每个集合,如果尚未添加,请将其添加到列表中

    完成该循环后,您就有了答案。带有特定标签的产品的集合列表。

    祝你在这方面的表现好运,并记住保持简单。对于库存有限的小商店来说,这种循环速度很快,但如果您有成千上万个标签分布在许多系列中的 sku,那么您将面临即时渲染的挑战。

    【讨论】:

      【解决方案2】:

      使用 Shopify 的 map 过滤器,您可以比 David Lazar 的回答提高速度。

      与他的回答一样,步骤 1 是使用规则“产品包含标签”创建一个集合并输入您正在使用的标签。

      现在假设您在名为 collection 的 Liquid 变量中拥有该集合对象,您将通过一个简单的 map 命令获取所有集合的句柄,然后使用 uniq 命令删除所有重复项:

      {% assign all_collection_handles = collection.products | map: 'collections' | map: 'handle | uniq %}
      

      map 过滤器从大量对象中获取非常具体的信息,因此它比遍历具有大量您不关心的字段的大量大对象要快得多。

      (请注意,uniq 仅适用于字符串、数字或其他简单数据类型,这就是我们一直映射到集合句柄的原因)

      现在您可以遍历all_collection_handles 来做您需要做的事情:

      {% for handle in all_collection_handles %}
        {% assign collection = collections[handle] %}
        <!-- Cool stuff here -->
      {% endfor %}
      

      由于您的集合列表应该比产品列表短得多,因此这应该是相当有效的。请始终注意,您在 Liquid 代码中执行的繁重工作越多,页面加载延迟的可能性就越大,因此保持循环简短并尽可能使用诸如 map 之类的重点过滤器将有助于保持事情尽可能快地运行。

      注意:如果您的页面开始出现极端的页面加载延迟,您可能希望在页面加载过程中跳过此操作并留下一个占位符元素,然后使用 Javascript 获取您需要的信息并创建你想要的显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-22
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多