【问题标题】:Filtering products via pre_get_posts by min and max price (use the product VARIATION set via default_attribute for filter results)通过 pre_get_posts 按最低和最高价格过滤产品(使用通过 default_attribute 设置的产品 VARIATION 过滤结果)
【发布时间】:2020-08-17 22:05:52
【问题描述】:

我有一个产品列表,目前我正在实现各种过滤器功能。

每个产品都有 12 个变体,每个变体都有不同的价格。

每个产品都有定义为默认的“最便宜”变体(通过产品的默认属性属性)

我想调整 pre_get_posts 操作中的 wordpress 查询,以仅匹配最高和最低价格之间的产品 - 然而,正在寻找在 postmeta 中,我看到产品的每个变体都有一个条目 - 例如

product_id: 10, _price: 100 (-> default variation)
product_id: 10, _price: 110
product_id: 10, _price: 120
product_id: 11, _price: 110 (-> default variation)
product_id: 11, _price: 120
product_id: 11, _price: 130

....

如果我这样做:

    $currentMetaQuery = $query->get('meta_query');

    $currentMetaQuery[] = [
        'key' => '_price',
        'value' => array($minMax['min'], $minMax['max']),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    ];

    $query->set('meta_query', $currentMetaQuery);

最小 110 和最大 200 我得到 ID 为 10 和 11 的产品(因为这两种产品都包含与过滤器查询匹配的变体)

如何: 我希望默认变体作为过滤的基础意思 -> 上面的查询应该只返回 ID 为 11 的产品。

所以查询实际上应该是这样的: 将查询限制在产品默认变体价格介于最低和最高之间的产品...

有人知道怎么做吗?

感谢您提供给我的任何意见或解决方案!

【问题讨论】:

    标签: php wordpress woocommerce product-variations


    【解决方案1】:

    差点忘了这一点 - 由于默认定义了“最便宜”变体这一事实,我通过 post__in 属性调整了当前查询以仅匹配所需范围内的产品

            $sql = "SELECT product_id FROM {$wpdb->wc_product_meta_lookup} WHERE min_price BETWEEN %d AND %d";
            $queryString = $wpdb->prepare($sql, $minMax['min'], $minMax['max']);
            $result = $wpdb->get_results($queryString, ARRAY_N);
    
            if (!is_array($result)) {
                return;
            }
    
            $flatProductIds = array_unique(
                array_map(function($item) {
                    return $item[0];
                }, $result)
            );
    
            if (empty($flatProductIds)) {
                $flatProductIds = [-1]; // Passing an empty array to post__in will return has_posts() as true (and all posts will be returned)
            }
    
            // restrict query to post matching the price selection
            $query->set('post__in', $flatProductIds);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2021-12-04
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多