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

WP_Query无法筛选日期区间求助(WP Rest API+ACF场景)

解决WP REST API中ACF日期字段的区间查询问题

我来帮你搞定这个日期区间查询的问题,你的场景是用ACF的Ymd格式日期字段筛选任务,咱们先梳理下问题,再调整代码:

首先,你的核心需求是筛选task_date在date_from和date_to之间的任务,虽然你试过BETWEEN但没成功,大概率是参数处理或查询写法的小问题,咱们一步步修正:

关键修改点与完整代码

public function get_task_calendar($req){ 
    // 获取并验证请求参数
    $date_from = $req->get_param('date_from');
    $date_to = $req->get_param('date_to');

    // 校验日期格式是否为Ymd(8位数字),避免无效查询
    if (empty($date_from) || empty($date_to) || !preg_match('/^\d{8}$/', $date_from) || !preg_match('/^\d{8}$/', $date_to)) {
        return new WP_Error('invalid_params', '无效的日期参数,请使用Ymd格式(例如:20240520)', array('status' => 400));
    }

    $args = array( 
        'post_type' => 'task', 
        'fields' => array("ID", "post_title"), 
        'post_status' => 'publish', // 确保只返回已发布的任务,可根据需求调整
        'meta_query' => array( 
            array( 
                'key' => 'task_date', 
                'compare' => 'BETWEEN', 
                'value' => array($date_from, $date_to), 
                'type' => 'DATE' 
            ) 
        )
    ); 

    $query = new WP_Query($args); 
    $results = $query->get_posts(); 

    // 可选:格式化返回结果,把ACF日期字段也返回给前端
    $formatted_tasks = array();
    foreach ($results as $task) {
        $formatted_tasks[] = array(
            'id' => $task->ID,
            'title' => $task->post_title,
            'task_date' => get_field('task_date', $task->ID)
        );
    }

    // 用rest_ensure_response包装,符合WP REST API规范
    return rest_ensure_response($formatted_tasks);
}

为什么这样修改?

  1. 参数合法性校验:避免前端传入无效日期(比如格式错误、空值)导致查询异常,同时返回标准的API错误提示,方便移动端调试
  2. 简化日期处理:既然你的date_from和date_to已经是Ymd格式,不需要用strtotime再转换——直接传入原参数即可,减少不必要的转换风险
  3. 正确使用BETWEEN:WP_Query的DATE类型支持直接对比Ymd格式的字符串,只要value是包含起始和结束日期的数组,BETWEEN就能正确筛选区间内的记录
  4. 规范API返回:用rest_ensure_response包装结果,确保返回符合REST API的响应格式;同时可选添加task_date字段,让移动端直接拿到日期数据

额外排查点

  • 确认ACF字段的键确实是task_date:可以去WP后台的ACF字段设置里核对,或者直接查看数据库postmeta表中的meta_key
  • 检查任务的task_date存储格式:在数据库中确认对应的meta_value是8位数字的Ymd格式(比如20240520),如果ACF存储的是其他格式,需要调整查询的type或格式转换逻辑
  • 时区一致性:确保WP后台的「设置-常规」中的时区和你的移动端业务时区一致,避免日期逻辑出现偏差

内容的提问来源于stack exchange,提问作者heresthebuzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:53:12