在我再次开始之前,我只想强调一个事实,即您不应该在归档页面上运行自定义查询来代替主查询。请参见this post 了解何时应使用自定义查询,何时不应使用自定义查询。如果您不切换回默认循环,那么我的解决方案将不起作用
在上一篇文章中,我们已经解决了仅显示当前查看类别中的档案的问题。下一个问题是,当您访问当前类别中的日期存档时,仅显示当前类别中的帖子
为了实现这一点,我们将使用以下过滤器和操作
为了让日期档案页面知道请求是否来自类别页面,并只提供该类别的帖子,我们需要设置某种类型的推荐人。像
wp_get_referer()
和
$_SERVER[\'HTTP_REFERER\']
非常不可靠(请参见
this post 更多信息),我们将在URL中使用额外的参数来设置值,我们将检查这些值并使用这些值来确定要提供哪些帖子。为了实现这一点,我们将设置一个新的查询变量
cq
将保存当前类别ID。
接下来,我们需要修改wp_get_archives()
当它们显示在类别页面上时。我们需要将类别ID添加到URL中,以便在归档页面上更改主查询时可以读取类别ID。要更改链接以包含自定义查询变量,我们将使用get_archives_link
筛选以更改链接和add_query_arg
将自定义查询变量添加到新链接的步骤
现在我们有了新的链接,如果单击类别页面中的链接,您将在日期存档页面上看到类似的内容添加到您的URL中?cq=21
. 21
是我的测试站点中的类别ID。
现在,无论何时在日期存档页面上,我们都必须检查新的quey变量是否附加到URL。我们将使用filter_input( INPUT_GET, \'cq\', FILTER_VALIDATE_INT );
要获取值,请清理并验证URL中的值。如果将新的查询变量附加到URL,我们需要调整主查询,以仅返回ID作为值添加到的类别中的帖子cq
. pre_get_posts
将在此处使用
以下是完整的代码:
add_filter( \'query_vars\', function ( $vars ) {
$query_vars = [
\'cq\'
];
$vars = array_merge( $vars, $query_vars );
return $vars;
});
add_filter( \'get_archives_link\', function ( $link_html ) {
if( is_category() ) {
preg_match ( "/href=\'(.+?)\'/", $link_html, $url );
$old_url = $url[1];
$new_url = add_query_arg( [\'cq\' => get_queried_object_id()], $old_url );
$link_html = str_replace( $old_url, $new_url, $link_html );
}
return $link_html;
});
add_action( \'pre_get_posts\', function ( $q ) {
$cat_id = filter_input( INPUT_GET, \'cq\', FILTER_VALIDATE_INT );
if( !is_admin() // Target only the front end
&& $q->is_main_query() // Target only the main query
&& $q->is_date() // Only target the date archive pages
&& $cat_id // Only run the condition if we have a valid ID
) {
$q->set( \'cat\', $cat_id );
}
});