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

WordPress自定义文章类型自定义分类分页404问题求助

解决自定义分类模板分页404问题

我来帮你搞定这个分页404的麻烦!核心问题出在这几个地方:WordPress主查询和自定义查询的每页文章数不匹配,分页变量用错了(用了page而不是归档页面该用的paged),还有pre_get_posts的逻辑没处理好主查询的判断。

问题根源拆解

  1. 分页变量混淆:你用了get_query_var('page'),但这个变量是给单页内容分页用的(比如文章里的<!--nextpage-->),归档页面的分页应该用paged变量,用错会导致WordPress无法正确识别分页页码,直接返回404。
  2. 主查询与自定义查询不匹配:当你在分类模板里用自定义WP_Query时,WordPress的重写规则是基于主查询的posts_per_page来计算分页的。如果主查询的每页数量和你自定义查询的不一样,就会出现“实际有内容但系统认为没有”的404情况。
  3. pre_get_posts逻辑缺失:原来的代码没判断是否是主查询,可能会影响其他查询的行为。

具体修复步骤

1. 修正pre_get_posts函数

更新你的钩子函数,确保只修改前台的主查询,并且正确设置自定义文章类型和每页数量:

add_action( 'pre_get_posts', function( $qry ) {
    // 只处理前台的主查询,避免影响后台或其他自定义查询
    if ( ! is_admin() && $qry->is_main_query() ) {
        $_num_per_page = ( get_option( 'gyokb_option_name' )['gyokb_articles_pp'] ) ?? 5;
        // 针对你的自定义分类归档页面
        if ( is_tax( 'kb_categories' ) || is_tax( 'kb_tags' ) ) {
            $qry->set( 'post_type', 'gyo_kb' ); // 如果你想同时显示普通文章,可以改成 array('post', 'gyo_kb')
            $qry->set( 'posts_per_page', $_num_per_page );
        }
    }
} );

2. 替换自定义WP_Query为主循环(推荐)

既然已经通过pre_get_posts修改了主查询,直接用WordPress默认的主循环就好,这样分页逻辑会自动匹配,不需要额外处理:

<?php
// 获取正确的分页变量
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // 这里写你的文章内容输出逻辑,比如标题、内容等
        the_title( '<h2>', '</h2>' );
        the_content();
    endwhile;

    // 输出分页导航
    echo paginate_links( array(
        'format'    => 'page/%#%',
        'prev_text' => ' Previous ',
        'next_text' => ' Next ',
        'current'   => $paged,
        'total'     => $GLOBALS['wp_query']->max_num_pages, // 直接用主查询的总页数
        'type'      => 'plain',
        'mid_size'  => 4,
    ) );
endif;
?>

3. 如果一定要保留自定义WP_Query(不推荐)

如果你因为某些原因必须用自定义查询,那要修正分页变量和分页代码:

<?php
// 用paged而不是page
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$_num_per_page = ( get_option( 'gyokb_option_name' )['gyokb_articles_pp'] ) ?? 5;

$args = array(
    'post_type'      => 'gyo_kb',
    'posts_per_page' => $_num_per_page,
    'paged'          => $paged, // 这里用paged
    'orderby'        => 'date',
    'order'          => 'DESC',
    'tax_query'      => array(
        array(
            'taxonomy' => 'kb_categories',
            'field'    => 'slug',
            'terms'    => $cur_cat->slug,
        ),
    ),
);
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
        // 文章内容输出
        the_title( '<h2>', '</h2>' );
        the_content();
    endwhile;

    // 分页代码
    echo paginate_links( array(
        'format'    => 'page/%#%',
        'prev_text' => ' Previous ',
        'next_text' => ' Next ',
        'current'   => $paged,
        'total'     => $the_query->max_num_pages, // 用自定义查询的总页数
        'type'      => 'plain',
        'mid_size'  => 4,
    ) );
    wp_reset_postdata(); // 重置查询
endif;
?>

4. 最后一步:刷新固定链接

修改完代码后,一定要进入WordPress后台 → 设置 → 固定链接,直接点击“保存更改”(不需要修改任何设置),这会让WordPress重新生成重写规则,确保分页的URL规则正确生效。

这样修改后,你的自定义分类分页应该就不会再出现404错误了,同时博客页面的分页也能保持原来的设置。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:14