javascript - Ajax - 按 Shopify/Liquid 中的价格过滤

标签 javascript ajax shopify liquid jquery-ajax

我有一个集合,我希望能够按价格过滤(排序)产品。我不想想要使用应用程序。

我知道这个问题Add price filter in shopify?但这不是我想要的;我希望能够选择任意数字组合,例如用户可以更改的金额在 4 美元到 20 美元之间,或者 7 美元到 30 美元之间,等等,而不仅仅是预定的范围。我在 Shopify 网站上看到过它,因此知道它可以完成。我相信这需要 ajax 调用。

答案对我自己和许多其他人都非常有帮助,因为这似乎是一个非常基本的要求,在 SO/Shopify 论坛上仍未得到解答,即使只是一般说明而不是任何特定代码。作为引用,我使用默认(首次亮相)主题。

最佳答案

我的项目与您的类似,因此请填写下面的空白。

创建集合模板collection.price-filter.liquid
使用ajax获取产品json。当然有 250 个限制。如果超过 250 个,则需要先使用应用程序过滤结果。或者,只需使用多个请求。

<script>
    var allProducts;
    var filteredProducts = [];
    var activeFilter = [];
    $(document).ready(function(){
        var url = '{{collection.url}}/products.json?limit=250';
        const res = getProducts(url);
    });

    function getProducts(url){
        $.ajax({
            type: 'GET',
            url: url,
            success: function(res){ 

                allProducts = res.products;
                filterProducts(allProducts);
            },
            error: function(status){
                 alert(status);
            }
        });
    }
</script>

过滤产品以填充filteredProducts数组对象

//loop through the products, create categories ($20-$40, $40-$60, etc.)
function filterProducts(products){
    var cat1 = '20-40', cat2 = '40-60';
    var currentCat;
    products.forEach(function (i, j){   
        if (i.price > 20 && i.price <= 40){
            currentCat = cat1;
        else if (i.price > 40 && i.price <= 60) {
            currentCat = cat2;
        }
            if(filteredProducts[currentCat]){
                filteredProducts[currentCat].push(i);
            }
            else {
                filteredProducts[currentCat] = [i]
            }
        };
    });
}

生成filteredProducts后,监听用户的checkbox选择,将selection添加到名为activeFilter的数组中

function getActiveFilter(){
    $('#myFilter').each(function(){
        if($(this).is(':checked')){
            //add to activeFilter
        }
    });
}

filteredProductsactiveFilter生成resultFilter,消除共同结果;

function resultFilter(){
    var result = [];
    activeFilter.forEach(function (i, value){
        Object.keys(value).forEach(function(j, product){
            //add to result
        };
    });
}

使用 handlebars.js 构建/显示产品结果

<script id="ProductTemplate" type="text/x-handlebars-template">
  {% raw %}
    {{#product}}
        <div class="col">
          <a href="/products/{{productHandle}}" class="grid__image">
            <div class="product__image-wrapper" style="background-color: white;">
              <img class="no-js lazyload" width="316" height="237"
                data-src="{{ featuredImg }}"
                data-widths="[108, 360, 375, 414, 568, 684, 720, 732, 736, 768, 1024, 1200, 1296, 1512, 1728, 1944, 2048]"
                data-aspectratio="1.33"
                data-sizes="auto"
                data-parent-fit="width"
                alt="{{ title }}">
            </div>
          </a>
          <p class="h5"><a href="/products/{{productHandle}}">{{ title }}</a></p>
        </div>
    {{/product}}
   {% endraw %}
</script>

将数据插入到 #container-products 中,您希望在其中显示过滤后的产品。

function buildFilteredProducts(filteredProds) {
        var $productContainer = $('#container-product');
        $productContainer.empty();
        if(filteredProds.length <= 0){
            $productContainer.append('empty result');
            return;
        }

        var products = [];
        var product = {};
        var data = {};
        var source = $("#ProductTemplate").html();
        var template = Handlebars.compile(source);
        products = filteredProds.map(function(productItem) {
            return product = {
            id: productItem.id, 
            title: decodeHtml(productItem.title),
            featuredImg: responsiveImage(productItem.images[0].src),
            productHandle: productItem.handle
            }
        });

        data = {
            product: products
        } 

        $productContainer.append(template(data)); 
    }

关于javascript - Ajax - 按 Shopify/Liquid 中的价格过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66931582/

相关文章:

javascript - PHP AJAX - &lt;input&gt; 元素可以像 <form> 一样具有 "action"吗?

ajax - 跨域ajax请求get 412

javascript - rails 4 : update model attribute with AJAX call

javascript - 使用 Shopify JavaScript Buy SDK 自定义查询检索文章对象,包括其图像

javascript - ExtJS - 保存树面板的状态。

javascript - React-Native:无法访问状态值或从 renderRow 声明的任何方法

javascript - Meteor 在尝试创建 ObjectID 时返回无效的十六进制字符串错误?

javascript - 拉斐尔JS : arrow's end and start have different color than the path itself

Shopify - 创建成为订阅的免费试用产品?

node.js - Shopify App HMAC Validation Failed 如何解决?