Как отобразить список коллекций, отфильтрованный по тегам клиентов, в Shopify с помощью `assign collection =`

#variables #shopify #liquid

#переменные #shopify #жидкость

Вопрос:

Я пытаюсь создать раздел в «простой» теме Shopify, который фильтрует коллекции на основе тегов клиентов. Например, у клиента есть следующие теги «Foo», «Bar». В свою очередь, отображаются следующие коллекции «Foo», «Bar».

Я не слишком знаком с liquid, поэтому стараюсь максимально упростить задачу. Таким образом, я продублировал collection-list.liquid из «Простой темы» для моей базы и внес следующие изменения в файл.

Мои изменения

   <!-- the magic -->
  <div class="collection-grid">
    <div class="grid grid--uniform">
      
        {% for tag in customer.tags %} // check customer tags.
      
        {% capture tag_handle %} // capture tag URL handle e.g. /t-shirts in a variable 'tag_handle'
            {{ tag | handle }}
        {% endcapture %}
      
          {% unless collection.handle contains tag_handle %} // check collection handles against the current tag handle to find a match. If so then do.

            <div class="grid__item {{ grid_item_width }} slide-up-animation animated" {{ block.shopify_attributes }} role="listitem">
              {% assign collection = collection.handle %} // Assign correct collection. I suspect this to be my stumbling block. See below for reason why.
              {% include 'collection-grid-item' %}
            </div>

          {% endunless %}
        {% endfor %} 

    </div>
  </div>
  <!-- / the magic -->  
 

С текущим фрагментом кода я получаю результаты, равные количеству тегов клиентов. Проблема в том, что результаты пусты или, по крайней мере, назначенная переменная коллекции пуста.

Любая помощь в этом была бы весьма признательна. Заранее спасибо.

Комментарии:

1. Как вы перебираете несколько коллекций?

2. Я не совсем уверен. Внутри collection-list.liquid , похоже, нет цикла, так сказать; это цикл по группе коллекций. Я подозреваю, что цикл происходит в другом месте темы. и результат настраивается внутри collection-list.liquid . Я пробовал перебирать коллекции, используя {% for collection in collections %} , но, похоже, он входит в бесконечный цикл collection-list.liquid . или, по крайней мере, дублирует циклы.

3. Вы хотите, чтобы администратор выбрал несколько коллекций в Shopify customizer, а затем отображал только те коллекции для пользователей, которым соответствуют теги клиентов?

4. Не совсем, я хочу выбрать все коллекции в системе и отображать только те из них для пользователя, у которого совпадают теги клиентов.

5. @BilalAkbar ваш вопрос заставил меня остановиться и подумать. Спасибо за ввод. Это было очень оценено. Посмотрите мой ответ, если вас интересует мое решение.

Ответ №1:

Если вы не хотите настраивать и поддерживать блоки разделов, как насчет чего-то подобного?

 <!-- the magic -->
<div class="collection-grid">
  <div class="grid grid--uniform">
    
    {% for tag in customer.tags %} // for each customer tag do
      {% assign tag_handle = tag | handle %} // get the tag handle (I.e. no spaces amp; lowercase)

      {% assign collection = collections[tag_handle] %}
      {% if collection == blank %}
        {% continue %}
      {% endif %}

      <div class="grid__item {{ grid_item_width }} slide-up-animation animated" role="listitem">
        {% include 'collection-grid-item' %}
      </div>


    {% endfor %} 
  </div>
</div>
<!-- / the magic -->
 

Такой подход позволит:

  • Пройдите по всем тегам клиентов, как и раньше, затем
  • Принимает обработанную версию тега и выполняет поиск коллекции
  • Переходит к следующему тегу, если не было найдено соответствующей коллекции
  • Отображает элемент таблицы коллекции, если существует соответствующая коллекция

Если вы ожидаете, что у клиентов будет много тегов, но только несколько тегов, связанных с коллекцией, одним из возможных улучшений может быть использование специального префикса для тегов, связанных с коллекцией, который можно проверить и перейти к следующему тегу, если префикс отсутствует. Я также знаю, что Shopify имеет ограничение в 50 использований all_products поиска на страницу, но я не знаю, существует ли аналогичный предел для поиска коллекции. В любом случае, для повышения производительности страницы, вероятно, будет лучше, если количество поисковых запросов по тегам и коллекциям будет достаточно небольшим.


Кроме того, одна из вещей, которая может вас беспокоить, — это время загрузки страницы. Слишком много дорогостоящих операций с ликвидностью может привести к тому, что серверы Shopify будут иметь небольшую задержку при обслуживании страниц вашего сайта. Пока вы пробуете и тестируете решения, одним из чрезвычайно полезных инструментов, которым вы можете воспользоваться, является плагин «Shopify Theme Inspector» для Chrome. Это даст вам наглядное представление о том, сколько времени требуется Shopify, чтобы собрать вашу страницу на серверной части. (Я вообще не связан с плагином, это просто полезный инструмент, который я использовал несколько раз при оценке производительности сайта)

Комментарии:

1. Спасибо за ваш вклад, Дэйв, я понятия не имел, что поиск продуктов ограничен. Это хороший факт, который нужно усвоить, есть ли у вас какие-либо справочные материалы для этого утверждения? Я могу предположить, что в любой момент времени клиенту будет присвоено 5-10 тегов. Однако большинству потребуется всего 2-3 тега.

2. Если это поможет, я немного объясню, чего мы пытаемся добиться в магазине. По сути, каждая категория или «коллекция» равна машине. Существует много разных моделей машин. Затем продукты разделяются по этим коллекциям. Мы помечаем клиента оборудованием, которым он владеет, чтобы они не были перегружены другими деталями машины.

3. Фильтрация отображаемого с помощью тегов клиентов казалась лучшим способом достижения этой цели.

4. Бит all_products указан в поле «Подсказка» на странице «Глобальные объекты» Shopify в ссылке: shopify.dev / docs/ themes / liquid / reference / objects#global-objects На этой странице указано 20, но, по моему опыту, я смог пойти немного вышечем это — либо потому, что реальный лимит немного выше указанного, либо потому, что я выполняю большую часть своей работы с магазинами Shopify Plus, которые иногда имеют более высокие лимиты для различных вызовов API.

5. Если каждый клиент получает только 5-10 тегов, причем 2-3 являются реальными поисками коллекции, должно быть достаточно эффективно перебирать список тегов, рассматривать все как потенциальный поиск коллекции и пропускать мимо всего, что не дает результатов.

Ответ №2:

Итак, я смог решить свою проблему, применив несколько иной подход, основанный на вопросе @Bilal Akbar. Поскольку существующий подход работал в оригинале Simple Theme , зачем пытаться его изменить? Почему бы не разрешить администратору загружать все коллекции и просто фильтровать результаты во время вывода.

 <!-- the magic -->
<div class="collection-grid">
  <div class="grid grid--uniform">
    
    {% for tag in customer.tags %} // for each customer tag do
      {% assign tag_handle = tag | handle %} // get the tag handle (I.e. no spaces amp; lowercase)

      {% for block in section.blocks limit: section.blocks.size %} // keeping the original loop from the original file.
        {% if block.settings.collection == tag_handle %} // check the collections list within the block to see If it matches the tag handle. if so then do.

          <div class="grid__item {{ grid_item_width }} slide-up-animation animated" {{ block.shopify_attributes }} role="listitem">
            {% assign collection = collections[block.settings.collection] %}
            {% include 'collection-grid-item' %}
          </div>

        {% endif %} 
      {% endfor %} 
    {% endfor %} 
    
  </div>
</div>
<!-- / the magic -->
 

Опять же, я не слишком разбираюсь в liquid, если у кого-нибудь есть какой-либо альтернативный или, может быть, даже лучший способ достичь желаемого результата. Мне было бы интересно услышать об этом. Еще раз спасибо.

Комментарии:

1. Я рад, что это работает таким образом… Я бы опубликовал ответ раньше.. но дело в том, что в Shopify нет стандартного способа перебора всех коллекций. Все коллекции доступны только на странице со списком коллекций в Shopify…

2. Вы можете выполнить поиск в StackOverflow относительно итерации по коллекциям с помощью Linklist (меню).

3. Все в порядке, ваш вопрос действительно помог мне остановиться и подумать was what I was doing necessary? . т.е. Linklists Я уже пробовал этот подход, так как у меня есть меню, в котором отображаются ссылки меню на коллекции на основе тегов клиентов. Хотя я подумал про себя: «У меня есть теги клиентов; У меня есть все коллекции, мне действительно нужно включать меню?» Т.е. . Linklist Поэтому я решил отказаться от этого, так как думал, что это будет слишком запутанно. Тем не менее, 1 за мысль. 🙂