如何为Elementor循环轮播按ACF自定义日期字段升序排序?
解决Elementor循环轮播按ACF日期字段排序并筛选当前活动的问题
问题核心分析
你之前的代码存在两个关键问题:
- Elementor的
elementor/query/{$query_id}钩子需要修改传入的$query对象参数,而非重新实例化WP_Query或直接返回参数数组。 - ACF日期选择器设置的
l j F是前端显示格式,数据库实际存储的是Ymd(如20240301)格式的字符串,你之前用date("Y-m-d")进行格式不匹配的比较,且排序逻辑错误。
正确代码实现
- 先在Elementor循环轮播的「查询」设置中,设置自定义查询ID(比如
events_sort,务必记好这个ID)。 - 将以下代码添加到主题的
functions.php文件,或使用代码片段插件:
function filter_events_by_date( $query ) { // 生成匹配ACF存储格式的当前日期字符串 $current_date = date( 'Ymd' ); // 修改查询基础参数 $query->set( 'post_type', 'dates' ); $query->set( 'post_status', 'publish' ); $query->set( 'meta_key', 'date-event' ); $query->set( 'orderby', 'meta_value' ); $query->set( 'order', 'ASC' ); $query->set( 'posts_per_page', 15 ); // 设置筛选规则:仅显示当前及以后的活动 $meta_query = array( array( 'key' => 'date-event', 'value' => $current_date, 'compare' => '>=', 'type' => 'DATE', ) ); $query->set( 'meta_query', $meta_query ); } // 替换events_sort为你在Elementor中设置的自定义查询ID add_action( 'elementor/query/events_sort', 'filter_events_by_date' );
关键说明
- 自定义查询ID替换:必须将代码中的
events_sort替换为你在Elementor循环轮播查询设置里填写的ID,否则钩子不会生效。 - 日期格式匹配:ACF日期选择器默认存储格式为
Ymd,用date('Ymd')生成当前日期,确保筛选逻辑精准匹配。 - 排序逻辑:
Ymd格式的字符串可自然按升序排列,使用orderby => meta_value即可实现活动按日期从早到晚排序。
内容的提问来源于stack exchange,提问作者Dale Cooper
相关产品推荐
相关产品推荐

