0

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

每个产品都有 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 的产品(因为这两种产品都包含与过滤器查询匹配的变体)

hower: 我希望默认变体成为过滤含义的基础 -> 上面的查询应该只返回 ID 为 11 的产品。

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

有人知道怎么做吗?

感谢您可以向我展示的任何输入或解决方案!

4

1 回答 1

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);
于 2020-06-29T08:36:50.327 回答