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

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'>&nbsp;&nbsp;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'>&nbsp;&nbsp;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'>&nbsp;&nbsp;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 );

这段代码能成功过滤结果,但又遇到了新问题:

  1. 必须关闭AJAX结果刷新,因为AJAX更新时不会触发这个过滤函数,只能让页面每次提交都重载;
  2. 不知道怎么在这个函数里更新表单或者URL的日期参数——用户输入非法日期后,表单里还是显示他们输入的错误日期,体验很差;

有没有大佬能指点一下:

  • 怎么给Search & Filter Pro的日期范围控件加前端的最小/最大日期限制?
  • 怎么让AJAX模式下也能触发这个后端过滤?
  • 怎么在后端过滤后同步更新表单里的日期值或者URL参数?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:03:06