You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress如何在Archive.php及自定义页面排除指定分类

现有代码问题

  1. 变量不匹配:你在archive.php中调用query_posts()修改查询后,循环使用的是未定义的$query变量,实际仍调用默认主查询,过滤条件完全未生效。
  2. 错误使用query_posts:WordPress官方已明确不推荐使用该函数,它会覆盖原有主查询参数,导致月度归档的日期条件丢失,也容易引发分页异常。
  3. 参数逻辑不完整:你没有添加排除分类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:36:00