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

如何通过WordPress meta_query按月份筛选custom_events自定义文章类型事件

嘿,我来帮你搞定这个自定义事件的月份筛选需求!核心思路是通过meta_query构建两个关键条件,确保筛选出在选中月份内开始,或者选中月份时仍在进行的事件。

逻辑梳理

要实现你要的效果,我们需要同时满足两个条件:

  1. 事件的开始日期 ≤ 选中月份的最后一天(保证事件在选中月份结束前已经启动)
  2. 事件的结束日期 ≥ 选中月份的第一天(保证事件在选中月份开始后还未结束)

用你给的例子验证:选中2018年4月时,第一天是2018-04-01,最后一天是2018-04-30

  • 事件1:开始日2018-01-10 ≤ 2018-04-30,结束日2018-10-20 ≥ 2018-04-01 → 符合
  • 事件2:结束日2018-03-20 < 2018-04-01 → 不符合
  • 事件3:开始日2018-04-10 ≤ 2018-04-30,结束日2018-12-20 ≥ 2018-04-01 → 符合

完全匹配你的预期!

完整代码实现

假设你的自定义字段名为start_date(事件开始日期)和end_date(事件结束日期),且存储格式为标准的YYYY-MM-DD(数据库能直接做日期比较),以下是完整的查询方案:

// 从筛选下拉菜单获取选中的年份和月份(假设通过GET传递参数)
$selected_year = isset($_GET['event_year']) ? intval($_GET['event_year']) : date('Y');
$selected_month = isset($_GET['event_month']) ? intval($_GET['event_month']) : date('m');

// 计算选中月份的第一天和最后一天,转换为标准日期格式
$first_day_of_month = date('Y-m-01', strtotime("$selected_year-$selected_month-01"));
$last_day_of_month = date('Y-m-t', strtotime("$selected_year-$selected_month-01"));

// 构建WP_Query查询参数
$events_args = array(
    'post_type'      => 'custom_events', // 你的自定义文章类型
    'post_status'    => 'publish',
    'posts_per_page' => -1, // 显示所有符合条件的事件,可按需修改
    'meta_query'     => array(
        'relation' => 'AND', // 两个条件必须同时满足
        // 条件1:事件开始日期 ≤ 选中月份的最后一天
        array(
            'key'     => 'start_date',
            'value'   => $last_day_of_month,
            'compare' => '<=',
            'type'    => 'DATE' // 明确字段类型为日期,确保比较逻辑正确
        ),
        // 条件2:事件结束日期 ≥ 选中月份的第一天
        array(
            'key'     => 'end_date',
            'value'   => $first_day_of_month,
            'compare' => '>=',
            'type'    => 'DATE'
        )
    )
);

// 执行查询
$events_query = new WP_Query($events_args);

// 输出筛选结果
if ($events_query->have_posts()) {
    while ($events_query->have_posts()) {
        $events_query->the_post();
        // 这里可以自定义事件的输出内容
        echo '<div class="event-item">';
            the_title('<h3>', '</h3>');
            echo '<p>开始日期:' . get_post_meta(get_the_ID(), 'start_date', true) . '</p>';
            echo '<p>结束日期:' . get_post_meta(get_the_ID(), 'end_date', true) . '</p>';
        echo '</div>';
    }
    wp_reset_postdata(); // 恢复全局post对象,避免后续查询出错
} else {
    echo '<p>该月份没有符合条件的活动哦~</p>';
}

注意事项

  1. 如果你的日期字段存储的是时间戳,需要把$first_day_of_month和$last_day_of_month转换成时间戳,同时将meta_query里的type改为NUMERIC
  2. 记得替换代码中start_date和end_date为你实际使用的自定义字段名
  3. 可以根据需求调整posts_per_page参数,比如设置为10实现分页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:44:49