WordPress:使用 URL 参数按范围过滤帖子

WordPress: filter posts by range using URL Parameters

在 WordPress 中有 badly documented 个查询参数,您可以传入一个 URL。

例如,您可以显示特定类别中的帖子、来自特定作者的帖子以及在特定年份发布的帖子:

/?category_name=CATNAME&author=AUTHOR&year=2015

我喜欢按范围过滤。例如,从 2015 年 9 月 1 日到 2016 年 9 月 1 日,仅使用这些 URL 参数(不必创建 PHP 自定义页面模板)。

我试过 ?year=<2015 但它不起作用...

仅使用查询字符串参数无法获得您想要的结果。但是,您可以在主题或插件中创建一个函数来检查 start_dateend_date 参数是否存在,然后适当地修改查询。

您希望将这些函数作为过滤器添加到 'pre_get_posts',并检查是否存在您创建的这两个新参数。像这样的东西,添加到你的主题的 functions.php 文件中应该可以做到:

//Add in our new custom query vars first
function add_query_vars_filter( $vars ){
      $vars[] = "end_date";
      $vars[] = "start_date";
      return $vars;
    }
add_filter( 'query_vars', 'add_query_vars_filter' );

function parse_date_range_query_string( $query ){
  $start_date = get_query_var('start_date', 1900);
  $end_date = get_query_var('end_date', date("Y"));
  if (!is_admin()) { 
            $query->set('date_query', array(
                array(
                    'after' => array(
                            'year' => $start_date,
                            'month' => 1,
                            'day' => 1
                        ),
                    'before' => array(
                            'year'  => $end_date,
                            'month' => 12,
                            'day' => 31
                        ),
                    'inclusive' => true
                ),
            )
        );
    }
}

add_filter( 'pre_get_posts', 'parse_date_range_query_string' );

现在,像 example.com/?start_date=2014&end_date=2016 这样的 url 应该可以工作了

更新:如何处理 YYYY-MM-DD 格式的字符串?略有变化,因为参数前后的 date_query 可以采用时间戳字符串而不是我上面使用的年、月、日数组。您只需将函数更改为如下所示:

function parse_date_range_query_string( $query ){
      $start_date = get_query_var('start_date', '1900-01-01');
      $end_date = get_query_var('end_date', date("Y-m-d"));
      if (!is_admin()) { 
                $query->set('date_query', array(
                    array(
                        'after' => $start_date,
                        'before' => $end_date,
                        'inclusive' => true
                    ),
                )
            );
        }
    }

感谢您提供此解决方案...总的来说效果很好。

无论出于何种原因,选择一个小于本年度的"end"年 - 即... start_date = 2014&end_date = 2015,该页面显示正确帖子,但隐藏了导航菜单。

如果我将结束日期更改为 2017 年,它会显示导航菜单。

编辑:找到了解决方案;以防其他人发生这种情况。 添加

if ( ! is_admin() && $query->is_main_query()){

只是在主查询中附加新的日期范围,而不是每个查询(即...菜单查询)。

因此,上述解决方案的完整代码为:

//Add in our new custom query vars first
function add_query_vars_filter( $vars ){
      $vars[] = "end_date";
      $vars[] = "start_date";
      return $vars;
    }
add_filter( 'query_vars', 'add_query_vars_filter' );

function parse_date_range_query_string( $query ){
  $start_date = get_query_var('start_date', 1900);
  $end_date = get_query_var('end_date', date("Y"));
  if (!is_admin() && $query->is_main_query()) { 
            $query->set('date_query', array(
                array(
                    'after' => array(
                            'year' => $start_date,
                            'month' => 1,
                            'day' => 1
                        ),
                    'before' => array(
                            'year'  => $end_date,
                            'month' => 12,
                            'day' => 31
                        ),
                    'inclusive' => true
                ),
            )
        );
    }
}

add_filter( 'pre_get_posts', 'parse_date_range_query_string' );