WordPress自定义文章类型自定义分类分页404问题求助
解决自定义分类模板分页404问题
我来帮你搞定这个分页404的麻烦!核心问题出在这几个地方:WordPress主查询和自定义查询的每页文章数不匹配,分页变量用错了(用了page而不是归档页面该用的paged),还有pre_get_posts的逻辑没处理好主查询的判断。
问题根源拆解
- 分页变量混淆:你用了
get_query_var('page'),但这个变量是给单页内容分页用的(比如文章里的<!--nextpage-->),归档页面的分页应该用paged变量,用错会导致WordPress无法正确识别分页页码,直接返回404。 - 主查询与自定义查询不匹配:当你在分类模板里用自定义
WP_Query时,WordPress的重写规则是基于主查询的posts_per_page来计算分页的。如果主查询的每页数量和你自定义查询的不一样,就会出现“实际有内容但系统认为没有”的404情况。 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
相关产品推荐
相关产品推荐

