craft cms commerce 产品组合搜索查询

craft cms commerce product combined search query

我正在尝试使用手工艺品贸易来过滤我的产品。

有没有办法做到 craft.commerce.products.search("(field_color:red ORfield_color:blue) (field_size:S ORfield_size:M OR field_size:XXL)")

或者任何其他解决方案都可以帮助我实现此过滤器。

这是我的代码:

    {% set productNumber = 12 %}
    {% set priceMin = 0 %}
    {% set priceMax = 1000 %}

    {% set query = "(field_color:red OR field_color:blue) (field_size:S OR           field_size:M OR field_size:XXL)" %}
    {% set product_array = craft.commerce.products({
                type:typeArray|default(""),
                order:sort|default(""),
                defaultPrice: [
                'and',
                '>= ' ~ priceMin,
                '<= ' ~ priceMax,
                ]
                }).search(query) %}

    {% set product_array_limited = product_array.limit(productNumber|default("")) %}
    {% paginate product_array_limited as product_array_pagenated %}

        {% for product in product_array_pagenated %}

        "Here is my product"

        {% endfor %}

    {% endpaginate %}

我想通了。 我正在使用 craft "relatedTo" 过滤器来加入搜索内容。 在我的系统中,"color" 和 "size" 被保存为类别。 在商业产品部分,"color" 和 "size" 与具有 "productColor" 和 "productSize" 字段的产品相关。

就像下图:

Product Section related Size and Color category example Image

而"size"和"color"的类别包含"title"、"slug"。

Size and Color in Category example Image

而在craft类别中,您会看到该类别的Id,如下图所示。

Category Id example Image

这是我的代码:

{% set colorArray = ["blue","black"] %}
{% set sizeArray = ["s","28"] %}

{% set colorId = [] %}
{% for color in colorArray %}
   {% set colorId = colorId | merge(craft.categories.slug(color).Ids()) %}
{% endfor %}

{% set sizeId = [] %}
{% for size in sizeArray %}
   {% set sizeId = sizeId | merge(craft.categories.slug(size).Ids()) %}
{% endfor %}

{% set IdMerge = craft.customcode.mergeArrayRemoveRedundancy(colorId,sizeId) %}
{% set productNumber = 12 %}
{% set priceMin = 0 %}
{% set priceMax = 1000 %}

{% set product_array = craft.commerce.products({
                type:typeArray|default(""),
                order:sort|default(""),
                defaultPrice: [
                'and',
                '>= ' ~ priceMin,
                '<= ' ~ priceMax,
                ]
                }).relatedTo(IdMerge) %}
{% for product in product_array_pagenated %}

{# Your product #}

{% endfor %}

这是我的 "customcode" 插件中 "mergeArrayRemoveRedundancy" 函数的 PHP class。

 /**
 * merge array remove redundancy
 * @param $a1 array
 * @param $a2 array
 * @return array
 */
public function mergeArrayRemoveRedundancy($a1,$a2){
    $a1 = (array)$a1;
    $a2 = (array)$a2;
    return array_unique(array_merge($a1,$a2), SORT_REGULAR);
}

您可以使用“https://pluginfactory.io/”创建自定义工艺插件 只需在 /yourPluginFolder/variables 文件夹下添加 PHP class。