You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询今日在售促销商品?及现有WP查询参数问题排查

1. 如何查询今日处于在售促销状态的商品?

要在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);
2. 你的WordPress查询参数代码存在的问题

咱们一条一条拆解你的代码问题:

  • 键名语法错误:'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:20