提问者:小点点

使用WooCommerce wc_get_产品按价格范围筛选产品


我使用wc_get_products()获得了一系列分页变量产品。我只想得到给定价格范围内的产品。问题是有很多产品,所以一次只提取20个产品。

根据文档,使用wc\u get\u products()时没有meta\u query()-选项。

那我怎么得到这个?

以下是我当前的查询:

$products_query = [
    'category' => [ get_queried_object()->slug ],
    'limit' => 20,
    'paginate' => true,
    'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1,
];

$products = wc_get_products( $products_query );

现在请记住,这是从数据库查询产品之前需要实现的。假设我总共有100种产品。由于产品已分页,因此如果我在\u price(ASC)之后订购了产品,则第1页应返回20种最便宜的产品。第3页应返回产品40-60(在分类后)。

尝试1-尝试使用meta_query

我认为wc_get_products受到启发,建立在WP_Query之上,所以我尝试了这个:

$products_query = [
    'category' => [ get_queried_object()->slug ],
    'limit' => 20,
    'paginate' => true,
    'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1,
    'meta_query' => [
        'relation' => 'AND',
        [
            'key' => '_price',
            'value' => 100,
            'compare' => '<=',
            'type' => 'NUMERIC'
        ]
    ]
];

$products = wc_get_products( $products_query );

它只是忽略meta_query-part并返回一个结果,就好像它不存在一样。

尝试2-使用WP_Query

我所到之处都有箭头指向wc\u get\u产品,远离wp\u查询。所以我没有追查这件事。

尝试3-原始SQL

一种解决方案是进行原始SQL查询。但是由于产品是可变产品,那么SQL查询将是相当多的联接,因为它应该首先查找所有产品,然后查找所有变体。然后在最低变动价格(如果价格排序为升序)和最高变动价格(如果价格排序为降序)之后对产品进行排序。这显然是可能的,但我希望找到一个更像WordPress的解决方案。我不擅长SQL。

尝试4-使用插件

我环顾四周,对WooCommerce的“n”过滤器插件进行了分类,它们是怪物,因为它们将脚本和样式分为左、右和中。因此,这似乎是一个糟糕的解决方案。

尝试5-使用WooCommerce API

我可以看到所有产品列表中都提到了minu_pricemax_price。所以这可能真的有效。


共2个答案

匿名用户

可变产品很难按价格进行筛选…因此下面的内容并不完美,但为您展示了一种在WC\u Product\u Query中启用价格范围的方法。

因此,以下功能将启用对WC\u Product\u query的自定义价格范围查询:

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handle_price_range_query_var', 10, 2 );
function handle_price_range_query_var( $query, $query_vars ) {
    if ( ! empty( $query_vars['price_range'] ) ) {
        $price_range = explode( '|', esc_attr($query_vars['price_range']) );

        if ( is_array($price_range) && count($price_range) == 2 ) {
            $query['meta_query']['relation'] = 'AND';

            $query['meta_query'][] = array(
                'key'     => '_price',
                'value'   => reset($price_range), // From price value
                'compare' => '>=',
                'type'    => 'NUMERIC'
            );

            $query['meta_query'][] = array(
                'key'     => '_price',
                'value'   => end($price_range), // To price value
                'compare' => '<=',
                'type'    => 'NUMERIC'
            );

            $query['orderby'] = 'meta_value_num'; // sort by price
            $query['order'] = 'ASC'; // In ascending order
        }
    }
    return $query;
}

代码进入函数。活动子主题(或活动主题)的php文件。测试和工作。

示例用法

  • 处理浮点数
  • 第一个价格与第二个价格之间用管道隔开|

这里我们查询10.25美元到50美元(价格范围)的产品:

$products = wc_get_products( [
    'limit'       => 20,
    'status'      => 'publish',
    'price_range' => '10.25|50', // The first price is separated from the 2nd one with a pipe
] );

echo '<ul>';

foreach( $products as $product ) {
    echo '<li><a href="'.$product->get_permalink().'">'.$product->get_name().' '.$product->get_price_html().'</a></li>';
}
echo '</ul>';

要仅筛选可变产品,可以向查询中添加以下行:

    'type'        => 'variable',

文档:wc_get_products和WC_Product_Query

匿名用户

function handle_custom_query($query, $query_vars)
{
  if (!empty($query_vars['meta_query'])) {
    foreach ($query_vars['meta_query'] as $q) {
      $query['meta_query'][] = $q;
    }
  }
  return $query;
}
add_filter('woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query', 10, 3);

用法:

$query = new \WC_Product_Query(
  array(
    // ...standard queries
    // https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

    'meta_query'     => array(
      // ...array of meta queries
    ),

  )
);
$products = $query->get_products();