这是可能的,如果有点牵连的话。要实现这一目标,您需要:
自定义查询变量。一个基于查询变量对结果进行排序的过滤器。一个用于存档的重写规则,将查询变量应用于您的漂亮URL另一个重写规则同样适用,但包括分页检查查询变量以将更改应用到页面中需要它的任何其他部分所以首先要做的是添加查询变量。这意味着?ranked=1
添加到URL的查询参数将传递到WP_Query
对象
add_filter(
\'query_vars\',
function( $query_vars ) {
$query_vars[] = \'ranked\';
return $query_vars;
}
);
然后我们可以检查
pre_get_posts
钩子,如果存在,则将主查询设置为按我们想要的方式排序帖子:
add_action(
\'pre_get_posts\',
function( WP_Query $query ) {
if ( $query->is_post_type_archive( \'my_post_type\' ) ) {
if ( $query->get( \'ranked\', false ) ) {
$query->set( \'meta_key\', \'rating\' );
$query->set( \'orderby\', \'meta_value_num\' );
}
}
}
);
这将为您提供所需的功能,但URL很难看。访问
/my_post_type/?ranked=1
将按所需格式显示结果,分页链接应自动保持
ranked
参数,因此分页应该有效。
下一步是添加重写规则。你需要两个。一个用于第一页,然后一个用于分页页面。您只需采用post类型存档的默认重写规则,然后添加ranked
:
add_action(
\'init\',
function() {
add_rewrite_rule( \'my_post_type/ranked/?$\', \'index.php?post_type=my_post_type&ranked=1\', \'top\' );
add_rewrite_rule( \'my_post_type/ranked/page/([0-9]{1,})/?$\', \'index.php?post_type=my_post_type&ranked=1&paged=$matches[1]\', \'top\' );
}
);
现在您可以在加载排名的帖子
/my_post_type/ranked/
和
/my_post_type/ranked/page/2
. 的默认输出
paginate_links()
将自动为您提供正确的链接,以便对排名结果进行分页。
因此,上述3段代码将为您提供所需的功能。如果需要检查您是否在其他Fitler或actions中查看排名视图,可以使用以下条件:
if ( get_query_var( \'ranked\', false ) ) {
}
例如,您可能希望筛选
<title></title>
如果加载排名视图以添加“Top Rated”,则为页面标记。您可以这样做(只要您的主题支持
title-tag
):
add_filter(
\'document_title_parts\',
function( $title_parts ) {
if ( is_post_type_archive( \'my_post_type\' ) ) {
if ( get_query_var( \'ranked\', false ) ) {
$title_parts[\'title\'] = \'Top Rated \' . $title_parts[\'title\'];
}
}
return $title_parts;
}
);