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_date
和 end_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' );
在 WordPress 中有 badly documented 个查询参数,您可以传入一个 URL。
例如,您可以显示特定类别中的帖子、来自特定作者的帖子以及在特定年份发布的帖子:
/?category_name=CATNAME&author=AUTHOR&year=2015
我喜欢按范围过滤。例如,从 2015 年 9 月 1 日到 2016 年 9 月 1 日,仅使用这些 URL 参数(不必创建 PHP 自定义页面模板)。
我试过 ?year=<2015
但它不起作用...
仅使用查询字符串参数无法获得您想要的结果。但是,您可以在主题或插件中创建一个函数来检查 start_date
和 end_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' );