如何在Oxygen Builder中基于当前日期筛选Meta Box自定义文章类型
在Oxygen Builder中过滤Meta Box创建的过期Event自定义文章
第一步:确认Meta Box日期字段的存储格式
首先要明确event-end-date字段在数据库中的存储格式,这是日期比较生效的核心:
- 登录phpMyAdmin,找到
wp_postmeta表,搜索meta_key为event-end-date的记录,查看meta_value的格式(通常是YYYY-MM-DD纯日期,或YYYY-MM-DD HH:MM:SS带时间格式)。
方法一:通过Oxygen可视化自定义查询配置
在Oxygen的自定义查询设置面板中,添加元查询规则:
- 进入Oxygen的「自定义查询」设置,点击「添加元查询组」,设置关系为
AND(如果已有其他元查询条件)。 - 添加一条元查询规则:
- 元键:填入
event-end-date - 比较符:选择
>=(表示只显示结束日期晚于等于当前日期的活动) - 元值:使用Oxygen动态数据标签,根据存储格式选择:
- 纯日期格式(
YYYY-MM-DD):填写{{current_date format="Y-m-d"}} - 带时间格式(
YYYY-MM-DD HH:MM:SS):填写{{current_date format="Y-m-d H:i:s"}}
- 纯日期格式(
- 元类型:对应选择
DATE或DATETIME
- 元键:填入
如果需要同时过滤开始日期(比如显示正在进行中的活动:开始日期≤当前日期且结束日期≥当前日期),可以再添加一条元查询规则:
- 元键:
event-start-date - 比较符:
<= - 元值:同样用对应格式的
{{current_date}}动态标签 - 元类型:对应
DATE或DATETIME
方法二:通过代码修改查询(更灵活)
如果可视化配置遇到动态标签不生效或复杂逻辑需求,可添加以下PHP代码到主题的functions.php文件或自定义代码插件中:
add_action( 'pre_get_posts', 'filter_expired_events' ); function filter_expired_events( $query ) { // 仅针对前台主查询、event自定义文章类型生效 if ( ! is_admin() && $query->is_main_query() && $query->get( 'post_type' ) === 'event' ) { // 匹配Meta Box存储的日期格式,纯日期用'Y-m-d',带时间用'Y-m-d H:i:s' $current_datetime = current_time( 'Y-m-d' ); // 构建元查询条件 $meta_query = array( array( 'key' => 'event-end-date', 'value' => $current_datetime, 'compare' => '>=', 'type' => 'DATE', // 存储为DATETIME则改为DATETIME ) ); // 如果需要同时过滤开始日期,取消下面注释并调整逻辑 /* $meta_query[] = array( 'key' => 'event-start-date', 'value' => $current_datetime, 'compare' => '<=', 'type' => 'DATE', ); */ $query->set( 'meta_query', $meta_query ); } }
常见问题排查
- 日期格式不匹配:确保元值的格式和数据库中存储的完全一致,比如存储的是
MM/DD/YYYY就不能用YYYY-MM-DD查询。 - 时区问题:WordPress的
current_time会自动匹配站点时区,确保站点时区设置正确(后台「设置」→「常规」)。
内容的提问来源于stack exchange,提问作者Leo Guo
相关产品推荐
相关产品推荐

