WordPress如何在Archive.php及自定义页面排除指定分类
现有代码问题
- 变量不匹配:你在archive.php中调用
query_posts()修改查询后,循环使用的是未定义的$query变量,实际仍调用默认主查询,过滤条件完全未生效。 - 错误使用
query_posts:WordPress官方已明确不推荐使用该函数,它会覆盖原有主查询参数,导致月度归档的日期条件丢失,也容易引发分页异常。 - 参数逻辑不完整:你没有添加排除分类ID3的逻辑,且
category__and适用于要求文章同时归属多个分类的场景,仅指定单个分类时使用category__in即可。
最优解决方案
直接在主题functions.php文件中添加pre_get_posts钩子代码,一次修改即可同时对blognews.php页面和所有归档页生效,无需修改原有模板的循环逻辑:
add_action( 'pre_get_posts', 'custom_filter_news_categories' ); function custom_filter_news_categories( $query ) { // 仅对前端主查询生效,不影响后台和自定义查询 if ( ! is_admin() && $query->is_main_query() ) { // 匹配自定义blognews页面和归档页面(含月度归档) if ( is_page_template( 'blognews.php' ) || is_archive() ) { // 仅展示指定分类ID的文章,多个分类ID直接加在数组内即可 $query->set( 'category__in', array(54) ); // 排除指定分类ID的文章,多个分类直接加在数组内即可 $query->set( 'category__not_in', array(3) ); // 统一设置排序规则 $query->set( 'orderby', 'date' ); $query->set( 'order', 'DESC' ); // 归档页统一设置每页展示20篇 if ( is_archive() ) { $query->set( 'posts_per_page', 20 ); } } } }
添加后把archive.php里你写的自定义查询代码全部删掉,使用默认主循环即可:
<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <?php get_template_part( 'template-parts/content', 'excerpt' ); ?> <?php endwhile; ?> <?php endif; ?>
你原有blognews.php的代码无需修改也可正常运行,也可以换成默认主循环减少冗余代码。
内容的提问来源于stack exchange,提问作者GiulyM
相关产品推荐
相关产品推荐

