Попытка отобразить похожие товары с помощью определенного тега товара на Shopify

В настоящее время я использую сценарий для вывода связанных продуктов на управляемом мной веб-сайте Shopify, но я хочу изменить этот сценарий, чтобы захватить тег «color» текущего продукта (например, «Color_Jet Black (# 1)»), а затем использовать этот тег для создания связанных продуктов, которые также имеют этот тег.

Приведенный ниже код - это код, который я использую в настоящее время.

<div class="related-products">
    <div class="container-fluid nopadding">
        <div class="row grid">

        </div>
    </div>
</div>
<script>
$( document ).ready(function() {
    // Variables
      var related = $('.related-products');
      var handle = "{{ product.handle }}";
      var tags = [];
      var appendLocation = $(".related-products .row");
      var relatedProductsList = [];
      var maxOutput = 4
      var count = 0;
    // Get Product Tags
    {% for tag in product.tags %}
      tags.push("{{ tag }}");
}
    {% endfor %}
    // Get Run JSON product tags against this product's tags
    jQuery.getJSON( document.location.origin + "/products.json", function(obj) {
        // Build List
        jQuery.each(obj.products, function(dontcare, product) {
            hasMatch(tags, product);
        });
        // Shuffle List
        shuffle(relatedProductsList);
        // Output List
        jQuery.each(relatedProductsList, function( dontcare, product) {
            if(count < maxOutput) {
                outputMatch(product);
            }
            count++;
        });
    }).complete(function() {
        // Wait for products to load
        $('.product-item img').load(function() {
            var item = $('.product-item');
            setProductItemHeight(item);
        });
    });
    // Checks for a match between product tags and JSON tags
    function hasMatch(tags, product) {
        jQuery.each(tags, function(dontcare, tag) {
            if(jQuery.inArray(tag, product.tags) >= 0 && product.handle != handle) {
                relatedProductsList.push(product);
            }
        });
    }
    // Outputs matches
    function outputMatch (product) {
        // If product has a featured image
        if(product.images[0] != null) {
            // Create Item
            $item = $("<div class='col-md-3'><article class='product-item'><a href=" +
                document.location.origin + "/products/" +
                product.handle +"><div class='image-wrapper'><img class='img-responsive' src='" +
                product.images[0].src + "'></div><div class='product-wrapper prod-caption caption'><h6>" +
                product.title + "</h6></a><p>" + product.variants[0].price + "</p><a class='btn btn-default' href=" + document.location.origin + "/products/" + product.handle +">Buy Now</a></div></article></div>");
            appendLocation.append($item);
        } else if (product.images[0] == null) {
            // Fallback if product object has no images
            appendLocation.append("<div class='col-md-3'><article class='product-item'><a href=" + document.location.origin + "/products/" + product.handle +"><div class='image-wrapper'><img class='img-responsive' src='//cdn.shopify.com/s/files/1/0878/7440/t/2/assets/default.png'></div><div class='product-wrapper prod-caption'><h3>" + product.title + "</h3><p>" + product.tags[0] + "</p><em>" + product.variants[0].price + "</em><br><a class='btn btn-default' href=" + document.location.origin + "/products/" + product.handle +">Buy Now</a></div></article></div>");
        }
    }
    // Randomizes relatedProductsList
    function shuffle(relatedProductsList) {
        for (var n = 0; n < relatedProductsList.length - 1; n++) {
            var k = n + Math.floor(Math.random() * (relatedProductsList.length - n));
            var temp = relatedProductsList[k];
            relatedProductsList[k] = relatedProductsList[n];
            relatedProductsList[n] = temp;
        }
    }
});
</script>

Я попытался изменить код, чтобы получить текущий тег цвета продукта, который работает, но не выводит никаких продуктов, как это делает исходный скрипт. Есть много продуктов с этой цветной меткой, так что проблема не в этом.

Приведенный ниже код - это то, что я использовал для получения тега цвета текущего продукта, который работает, но ничего не выводит в DOM.

$( document ).ready(function() {
    // Variables
      var related = $('.related-products');
      var handle = "{{ product.handle }}";
      var tags = [];
      var appendLocation = $(".related-products .row");
      var relatedProductsList = [];
      var maxOutput = 4
      var count = 0;
    // Get Product Tags
    {% assign color = "Color_" %}
    {% for tag in product.tags %}
      {% if tag contains color %}
        tags.push("{{ tag }}");
}
      {% endif %}
    {% endfor %}

Любые мысли / помощь будут очень признательны.


person Matthew Scott    schedule 17.02.2016    source источник


Ответы (1)


Один из способов сделать это - создать новый шаблон коллекции, который выводит json, и применить этот шаблон к вашему json-запросу с помощью параметра view.

Параметр 'view' просто позволяет вам на лету использовать другой шаблон для рендеринга контента. https://docs.shopify.com/manual/configuration/store-customization/page-specific/collections/add-view-all-to-collection-pages

Вот пример жидкого шаблона json (сделанный из моей головы - вам нужно проверить, какие жидкие теги использовать):

   {% layout none %} // tells shopfify not to render layout template
   {
      "products": [
        {% for product in collection.products %}
    ...
     {
        "id": "{{product.id}}",
        "title": "{{product.title}}",
        "handle": "{{product.handle}}",
        "image" : "{{product.featured_image}}",
        "price" : "{{product.price}}"
    }
    {% if forloop.last == false %},{% endif %} ... don't forget the , - it mustn't be on the last entry.
    ....
        {% endfor %}
      ]
    }

Итак, когда шаблон будет отрисован - вы получите список продуктов в формате json. Что-то вроде этого:

{
  "products": [
    {
      "id": "12234",
      "title": "foo",
      "handle": "bar",
      "image": "blah.jpg",
      "price": "12345"
    },
    {
      "id": "12235",
      "title": "foo1",
      "handle": "bar1",
      "image": "blah1.jpg",
      "price": "12346"
    },
    {
      "id": "12239",
      "title": "foo2",
      "handle": "bar2",
      "image": "blah2.jpg",
      "price": "12375"
    }
  ]
}

При выполнении запроса ajax вам нужно будет запросить URL-адрес с тегами и просмотреть. Итак, если вы вызовете свой новый шаблон json.liquid, вы запросите:

/collections/frontpage/Color_Jet-Black-(#1)?view=json

eg:

jQuery.getJSON( '/collections/frontpage/Color_Jet-Black-(#1)?view=json", function(obj) {

Итак, в этом примере тегом является Color_Jet Black (# 1). Вы должны получать только те продукты из коллекции Frontpage, которые были помечены Color_Jet Black (# 1). Поскольку мы добавляем ?view=json к нашему запросу, Shopify будет отправлять эти продукты, используя созданный нами шаблон json *. Затем вы можете рандомизировать этот json и отобразить его на странице с помощью JavaScript.

  • Обратите внимание, что в моем примере я назвал новый шаблон коллекции json.liquid, потому что он используется для рендеринга Json, но вы можете называть его как хотите. Nb: "Feature_products.liquid". Однако, поскольку он используется для вывода Json, имеет смысл называть его json.liquid.

URL-адреса коллекций Shopify имеют следующий формат:

http://example.com/collections/collectionname/tags?view=CustomTemplate

so

http://example.com/collections/classic/watches?view=json

Приобрести вам все изделия из классической коллекции с меткой наручных часов.

http://example.com/collections/classic/watches+home?view=json

Принесет вам все товары из классической коллекции с меткой часы И для дома.

Вам не нужно фиксировать коллекцию в новом шаблоне json. Вы просто запрашиваете коллекцию, которая вам нужна, и говорите shopify, чтобы она отображала ее как json (используя созданный вами шаблон json).

Когда у вас есть продукты в формате json, вы можете делать с ними все, что захотите.

person Rob    schedule 17.02.2016
comment
Спасибо за ответ - скажем, у меня есть 20 разных цветовых тегов, мне нужно включить каждый отдельный тег (отформатированный как json) в новый шаблон? - person Matthew Scott; 18.02.2016
comment
Нет - вы бы просто добавили тег к URL-адресу ... Shopify затем возьмет все продукты из коллекции, помеченные какими-либо тегами, и отобразит их, используя тот шаблон json, который вы создали. Я обновил свой ответ, добавив разъяснения по этому поводу. Если работает, поставьте, пожалуйста, галочку;) спасибо - person Rob; 18.02.2016