我使用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_price
和max_price
。所以这可能真的有效。
可变产品很难按价格进行筛选…因此下面的内容并不完美,但为您展示了一种在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();