Shopify 产品更换部件

Shopify Product Replacement Parts

正在寻找有关使用 Shopify 的有趣情况的建议。我正在为客户建立一个网站,该网站的产品可以免费更换零件。每个替换零件都有不同的颜色选项。

到目前为止,我已经让公司的用户将所有更换零件添加为商店中的产品。我已经过滤了搜索结果和目录结果,因此没有显示更换部件。

他们唯一希望显示替换零件的地方是当用户访问产品时,他们可以单击一个显示订购替换零件的按钮。然后屏幕将显示该产品的所有更换部件。

单个替换零件可能属于多个产品,并且可能有不同的颜色变体。

到目前为止,我所做的是让客户用至少两个标签标记所有部分。名为 "part" 的标签,将产品标识为部件。以及一个或多个标签,如 "link:SKU123",将零件链接到一个或多个产品。然后在我的产品页面上,我使用液体循环所有部件并显示与产品 SKU 匹配的部件。然后我发现for循环有50项限制...

所以我看了一下产品API,应该还可以,就是没办法按标签过滤。标签看起来很方便,但我没有看到很多使用它们的方法……所以最终我正在寻找一种方法来显示特定产品的所有替换部件。它不必涉及标签,尽管客户已经标记了所有部分,我不想告诉他们这是浪费时间。但如果真的有任何关于如何实现这一点的想法,我们将不胜感激。

我能想到的唯一方法是 return 所有替换部件,然后在页面上过滤它们。我看到 API 仅限于 250 种产品,但我想我可以多次调用,直到我获得所有产品。我不确定总共有多少替换部件,但我怀疑可能超过 1000 个。似乎浪费网络资源必须将它们全部拉下来然后过滤它们...

P.S。 - 更换零件是免费的,可以 运行 通过零美元金额结账吗?

我会将零件创建为独立产品。然后每个部分都会有变体(颜色)。然后你为这个部分(产品)创建元字段,它有一个字段,其中包含所有产品 ID 的列表,对于这个部分,这些 ID 是 'mother'。这样您就不需要有奇怪的标签,并且可以使概念更加分离,并且一切都更清晰。根据零金额,是的,您可以使用零金额去结账(如果您的运输设置允许您这样做)。

好的,所以我对这个问题有几个不同的答案。还不确定我会用哪一个。

方法 1:使用 URL

按标签过滤 Collection

第一个是由 Shawn Rudolph 在 Shopify 论坛上提供的。它涉及使用 URL 按标签过滤 collection。 Shawn 的 post 在这里解释得很好:https://ecommerce.shopify.com/c/shopify-discussion/t/product-replacement-parts-270174

方法 2:使用分页从 collection 使用 AJAX API

获取所有产品

这个方法很酷。是的,它比方法一更有效,但这可能在很多情况下都有用。开箱即用的 Shopify 不允许您使用 AJAX API 从给定的 collection 检索所有产品。据我所知,这可以通过管理员 API 来完成,但不能通过 AJAX 来完成。但是,您可以使用 for 循环访问 collection 中的所有产品,但 for 循环一次最多只允许循环 50 个项目。这就是分页技巧的用武之地。基本上我在这里采用了 davecap 概述的技术:http://www.davecap.com/post/9675189741/infinite-scroll-for-shopify-collections

所以首先你需要 HTML/Liquid 布局:

{% paginate collections.mycollectionname.products by 50 %}

    {% for product in collections.mycollectionname.products %}
        <div class="clone-node" id="product-{{ forloop.index | plus:paginate.current_offset }}">
            {{ product.title }}
        </div>
    {% endfor %}

    {% if paginate.next %}
        <div class="clone-node next" title="{{ paginate.next.url }}"></div>
    {% endif %}

    <div id="insertion-point"></div>

{% endpaginate %}

所以让我们分解一下。首先我们对产品进行 50 分页。这是 for 循环允许的最大数量,所以这就是我们要使用的:

{% paginate collections.mycollectionname.products by 50 %}

接下来我们开始循环我们的产品。每个产品都有一个包装 div,class 为“clone-node”,这一点非常重要。我还为 div 分配了一个唯一的 ID,这不是它工作所必需的,但在尝试识别产品以供以后操作时可能会派上用场。

    {% for product in collections.mycollectionname.products %}
        <div class="clone-node" id="product-{{ forloop.index | plus:paginate.current_offset }}">
            {{ product.title }}
        </div>
    {% endfor %}

我们必须确保包含 paginate.next URL。我们还给它一个“clone-node”class 并添加一个“下一个”class。我将 paginate.next.url 分配给 title 属性,但您可以将其分配给任意数量的属性。您只需要能够使用 jQuery.

获取它
    {% if paginate.next %}
        <div class="clone-node next" title="{{ paginate.next.url }}"></div>
    {% endif %}

然后最后我们指定一个插入点。这是我们希望在获取它们后插入下一组 50 个产品的位置:

<div id="insertion-point"></div>

好的,现在让我们看一下 JS 代码:

<script>
    var prevUrl = ""; //this helps us know when we are done receiving products

    function getParts() {
        //get the last instance of the .next node. This will give us the next URL to query
        var nextNode= $(".next").last(),  
            url = nextNode.attr("title"); //nab the URL

        //send a get request to our next URL
        $.ajax({
            type: 'GET',
            url: url,
            dataType:'text',
            success: function (data) {
                //use a dummy div to convert the text to HTML, then find all of our clone-nodes, including our new "next" div which contains our next URL
                var cloneNodes = $("<div>").html(data).find(".clone-node");

                //insert our new clone-nodes on the page
                cloneNodes.insertBefore("#insertion-point");

                //if the URL's don't match let's grab the next 50!
                if (prevUrl != url) {
                    prevUrl = url;
                    getParts();
                }
            }
        });
    }

    //Call getParts for the first time to get the party started.
    getParts();
</script>

这基本上会做的是从 div 的标题属性中获取下一页产品的 URL paginate.next。url .然后使用 jQuery ajax 函数我们调用 URL 并且它 returns 一个 HTML 的页面使用格式化就像我们现有的页面一样,具有相同的“ clone-node" class我们分配的是,只有它嵌入了接下来的 50 个产品。

在 davecap 的示例中,他在 Ajax 调用中使用了 HTML 的数据类型,但这给我带来了一些麻烦。因此,我使用数据类型文本并使用由 jQuery 创建的虚拟 div 将文本转换为 HTML。然后 jQuery 抓取所有带有“clone-node” class 的 div 并将它们插入页面上我们的 insertion-point 之前。请记住,clone-nodes 现在包含接下来的 50 种产品,所以我们刚刚将接下来的 50 种产品添加到我们的页面。

最后,我们检查前一个 URL 是否不等于当前的。如果它不相等,那就意味着它是一个新的 URL 并且因此必须有更多的产品要获取,所以我们递归调用我们的 getParts() 函数,它重新开始这个过程并获取下一个 50。这一直持续到最后URLs 匹配,这意味着没有更多的产品可以获取,进程停止。

给你!当然,如果您必须获取成千上万的产品,这可能不太理想,因为您一次调用它们 50 个。但对于较小的数字(可能成百上千......)它应该工作得很好。