Отобразить набор коллекций, которые включают продукт с определенным тегом - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь настроить страницу, которая отображает список коллекций, например общий список-коллекций.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 голосов
/ 05 марта 2019

Вы можете получить улучшение скорости по сравнению с ответом Дэвида Лазара, используя фильтр map от Shopify.

Как и в случае с его ответом, на шаге 1 создайте коллекцию с правилом «Товар содержит тег» и введитетег, который вы используете.

Теперь при условии, что у вас есть этот объект коллекции в переменной Liquid с именем collection, вы получите дескрипторы всех коллекций с помощью простой команды map, за которой следует *Команда 1008 * для удаления всех дубликатов:

{% 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 для получения информации, которую вынужно и создайте нужный вам дисплей.

0 голосов
/ 01 марта 2019

Если вы посмотрите на документацию, то обнаружите, что у продукта есть специальный метод, помеченный как collection .Другими словами, это дает вам список всех коллекций, к которым принадлежит продукт.

Теперь перейдем к вашему вопросу.Вы спрашиваете, как вы можете отобразить список коллекций, но только те, которые содержат товары с определенным тегом.ОК ... достаточно справедливо.Вы выскочите из окна, но простой алгоритм может быть таким:

  • создать коллекцию товаров с тегом foomanchu
  • итерацию товаров в этой коллекциии используйте product.collections
  • для каждой из перечисленных коллекций, добавьте ее в список, если она еще не была добавлена ​​

После выполнения этого цикла у вас есть ответ.Список коллекций для товаров с определенным тегом.

Удачи вам в этом, и не забывайте про простоту.Это зацикливание быстро для небольшого магазина с ограниченным запасом, но если у вас есть много тысяч скусов с тегами, разбросанными по многим коллекциям, вам будет предложен моментальный рендеринг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...