【问题标题】:Shopify Product Replacement PartsShopify 产品更换零件
【发布时间】:2015-06-25 14:32:13
【问题描述】:

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

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

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

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

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

所以我查看了产品API,应该没问题,只是它无法通过标签进行过滤。标签看起来很方便,但我没有看到很多使用它们的方法......所以最终我正在寻找一种方法来显示特定产品的所有替换部件。它不必涉及标签,尽管客户已经标记了所有部件,我不想告诉他们这是浪费时间。但对于如何实现这一点的任何想法,我们将不胜感激。

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

附: - 更换零件是免费的,可以零美元结账吗?

【问题讨论】:

    标签: api limit shopify product


    【解决方案1】:

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

    方法一:使用 URL 按标签过滤集合

    第一个由 Shawn Rudolph 在 Shopify 论坛上提供。它涉及使用 URL 按标签过滤集合。肖恩的帖子很好地解释了这一点:https://ecommerce.shopify.com/c/shopify-discussion/t/product-replacement-parts-270174

    方法 2:使用 paginate 通过 AJAX API 从集合中获取所有产品

    这个方法很酷。是的,它比方法一更有效,但这在很多情况下可能很有用。开箱即用 Shopify 不允许您使用 AJAX API 从给定集合中检索所有产品。据我所知,它可以使用管理 API 但不是 AJAX 来完成。但是,您可以使用 for 循环访问集合中的所有产品,但 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,这非常重要。我还为 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。我们还给它一个“克隆节点”类,并添加一个“下一个”类。我将 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>
    

    这基本上会做的是,从包含 paginate.next.url 的 div 的 title 属性中获取产品下一页的 URL。然后使用 jQuery ajax 函数,我们调用该 URL,它返回一个 HTML 页面,以使用与我们现有页面一样的格式,使用我们分配的相同“克隆节点”类,只是它嵌入了接下来的 50 个产品。

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

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

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

    【讨论】:

      【解决方案2】:

      我会将这些部件创建为独立产品。然后每个部分都会有变体(颜色)。然后,您为此部件(产品)创建元字段,其中包含一个包含所有产品 ID 列表的字段,这些产品 ID 是该部件的“母亲”。这样您就不需要有奇怪的标签,并且可以使概念更加分离,并且一切都更干净。根据零金额,是的,您可以零金额结帐(如果您的运输设置允许您这样做)。

      【讨论】:

      • 好的,那么我如何访问特定产品的零件列表?这似乎是最困难的部分。
      • 您需要遍历所有产品并检查具有元字段 3425 的产品。3424 表示 product.id
      • 如果您的商店中有 1000 种产品来加载所有产品,这似乎是一个大问题。 for 循环有 50 个项目的限制,AJAX API 有一个限制,但即使你可以加载它们,它也会非常慢。我找到了一种使用分页技巧通过 API 从一个集合中查询产品的方法。我会在下周发布。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多