WordPress中Search & Filter Pro插件按表单设置日期范围限制的技术实现问询
WordPress中Search & Filter Pro插件按表单设置日期范围限制的技术实现问询
我在WordPress站点上用Search & Filter Pro插件,现在需要针对两个特定分类的搜索结果按预设日期做限制。我不想手动改1000多篇文章的分类、加新分类,也不想靠标签区分不同时期的内容,所以更倾向于给特定表单的日期输入框设置最小/最大范围——比如有的表单只设最小日期,有的同时设最小和最大日期,这样用户没法输入超出范围的日期,结果匹配度和体验都会更好。
目前碰到的难题:
- 插件v2版本里,找不到在搜索表单的日期范围控件里直接设置最小/最大日期的选项;
- 自己搞不懂怎么用PHP或JS实现前端的日期范围限制;
我已经通过后端代码实现了结果过滤,就算用户不选日期范围,也不会显示2025年1月1日之前的内容,代码如下:
function filter_media_release_current_term( $query_args, $sfid ) { if($sfid==2530 || $sfid==2488) { $currentafter = 2025; $startyear = '2025'; $aftermonth = '01'; $afterday = '01'; $currentbefore = '2025'; // 后续会改成完整日期,不只是年份 // 如果没有设置日期查询,默认设置after值 if (!isset($query_args['date_query'])) { $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } else { // 用户输入了至少一个日期:检查是否有“To:”日期并获取值 if (isset($query_args['date_query']['before']) && isset($query_args['date_query']['before']['year'])) { $currentbefore = $query_args['date_query']['before']['year']; $beforeday = $query_args['date_query']['before']['day']; $beforemonth = $query_args['date_query']['before']['month']; if ($currentbefore < $startyear) { // 不能返回早于起始日期的结果,重置日期查询为默认值 print_r("<br/><span style='color: red'> Enter dates starting " . $aftermonth ."/" . $afterday . "/" . $startyear . "</span><br/><br/>"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } else { // “To:”日期有效,检查是否输入了“From:”日期 if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) { $currentafter = $query_args['date_query']['after']['year']; // 如果起始日期早于设定值,重置起始日期但保留结束日期 if ($currentafter < $startyear) { print_r("<br/><span style='color: red'> Start date out of range!</span><br/><br/>"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'before' => array ( 'day' => $beforeday, 'month' => $beforemonth, 'year' => $currentbefore, ), 'inclusive' => true, ); } // 若两个日期都在有效范围内,无需操作 } else { // 没有输入“From:”日期,使用默认起始日期和用户输入的“To:”日期 $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'before' => array ( 'day' => $beforeday, 'month' => $beforemonth, 'year' => $currentbefore, ), 'inclusive' => true, ); } } } else { // 用户只输入了“From:”日期,确保值有效 if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) { $currentafter = $query_args['date_query']['after']['year']; // 如果起始日期早于设定值,重置为默认起始日期 if ($currentafter < $startyear) { print_r("<br/><span style='color: red'> Start date out of range!</span><br/><br/>"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } // 若日期在有效范围内,无需操作 } else { // 未设置年份的异常情况,使用默认起始日期 $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } } } } return $query_args; } add_filter( 'sf_edit_query_args', 'filter_media_release_current_term', 20, 2 );
这段代码能成功过滤结果,但又遇到了新问题:
- 必须关闭AJAX结果刷新,因为AJAX更新时不会触发这个过滤函数,只能让页面每次提交都重载;
- 不知道怎么在这个函数里更新表单或者URL的日期参数——用户输入非法日期后,表单里还是显示他们输入的错误日期,体验很差;
有没有大佬能指点一下:
- 怎么给Search & Filter Pro的日期范围控件加前端的最小/最大日期限制?
- 怎么让AJAX模式下也能触发这个后端过滤?
- 怎么在后端过滤后同步更新表单里的日期值或者URL参数?
内容来源于stack exchange
相关产品推荐
相关产品推荐

