如何查询今日在售促销商品?及现有WP查询参数问题排查
要在WooCommerce(WordPress电商插件)中查询今日正在促销的商品,你需要结合几个核心条件构建WP_Query参数:
- 商品状态为
publish(已发布) - 商品类型为
product - 存在有效的促销价(
_sale_price大于0) - 促销开始日期(
_sale_price_dates_from)小于等于今日(覆盖早于今天启动、今日仍在进行的促销) - 促销结束日期(
_sale_price_dates_to)大于等于今日,或者该字段不存在/为空(支持无结束日期的长期促销)
对应的正确查询参数示例如下:
$today = date('Y-m-d'); $query_args = array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => $number, 'orderby' => 'date', 'order' => 'DESC', 'meta_query' => array( 'relation' => 'AND', // 筛选有有效促销价的商品 array( 'key' => '_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'DECIMAL' ), // 促销已启动(今日或之前开始) array( 'key' => '_sale_price_dates_from', 'value' => $today, 'compare' => '<=', 'type' => 'DATE' ), // 促销未结束(今日或之后结束,或无结束日期) array( 'relation' => 'OR', array( 'key' => '_sale_price_dates_to', 'value' => $today, 'compare' => '>=', 'type' => 'DATE' ), array( 'key' => '_sale_price_dates_to', 'compare' => 'NOT EXISTS' ) ) ) ); $sale_products_query = new WP_Query($query_args);
咱们一条一条拆解你的代码问题:
键名语法错误:
'orderby ' => 'date'里的orderby后面多了一个空格!WordPress会把这个带空格的键名当成无效参数,导致排序逻辑完全不生效,相当于没写orderby。meta_query结构错误:你用了
$query_args['meta_query'][0][]来添加条件,这会让meta_query变成嵌套的二维数组(结构为array(array(array(...), array(...)))),但WP_Query要求meta_query是直接包含条件数组的一维数组(结构为array(array(...), array(...)))。这种错误结构会让WordPress无法正确解析你的元查询条件。促销价逻辑完全颠倒:你设置
'key' => '_sale_price', 'value' => 0, 'compare' => '=',这是在查询没有促销价的商品(_sale_price为0表示未设置促销),而不是促销中的商品。正确的应该是compare => '>'来筛选促销价大于0的商品。促销日期逻辑不完整:你只判断了
_sale_price_dates_from等于今日,这会漏掉所有从之前日期开始、今日仍在促销的商品,也没考虑无结束日期的促销商品。正确逻辑应该是促销开始日期≤今日,且促销结束日期≥今日(或无结束日期)。array_filter的冗余风险:虽然
array_filter本身没问题,但因为前面的meta_query结构错误,执行后可能会把整个meta_query变成空数组,导致查询完全失去促销筛选的作用。
修正后的代码可以参考我第一个问题里给出的示例,调整结构和逻辑就能正常工作啦!
内容的提问来源于stack exchange,提问作者Huỳnh Đại

