显示包含具有特定标签的产品的一组集合

时间:2019-03-01 14:23:14

标签: shopify

我正在尝试建立一个页面,该页面显示一个集合列表,例如常规的“ 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 %}

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

2 个答案:

答案 0 :(得分:0)

如果您查看文档,会发现产品上标有收藏的特殊方法。换句话说,这为您提供了产品所属的所有集合的列表。

现在开始回答您的问题。您询问如何显示收藏列表,但仅显示包含带有特定标签的产品的收藏列表。好,可以。您将加快速度,但是一个简单的算法可能是:

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

完成该循环后,您将获得答案。具有特定标签的产品的收藏列表。

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

答案 1 :(得分:0)

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

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

现在假设您在名为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来获取所需信息并创建您想要的显示。