使用WP_Query实现WordPress分页时遭遇404错误求助
WordPress自定义文章类型articles分页404问题解决方法
问题现象
使用WP_Query查询自定义文章类型articles,设置每页3篇已发布文章,分页链接显示正常(如「1 2 3 4 next »」),但点击http://www.mysite.com/blog/page/2这类分页链接时出现404错误,站点博客页地址为http://www.mysite.com/blog/。
常见原因及解决方案
原因1:静态页面分页误用paged变量
如果/blog/是静态页面(Page),WordPress对静态页面的分页使用page变量,而非博客首页用的paged变量,原代码错误使用paged导致分页逻辑失效。
修正代码:
将原代码中获取分页变量的部分修改为:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
同时更新分页链接中的当前页参数:
$current_page = max(1, $paged);
原因2:未添加对应重写规则
WordPress默认重写规则不识别静态页面+自定义文章类型的分页结构,需手动添加规则。
步骤:
- 在主题的
functions.php文件中添加以下代码:
function add_articles_pagination_rewrite() { add_rewrite_rule( '^blog/page/([0-9]+)/?$', 'index.php?pagename=blog&page=$matches[1]', 'top' ); } add_action('init', 'add_articles_pagination_rewrite');
- 登录WordPress后台,进入「设置」→「固定链接」,直接点击「保存更改」刷新重写规则。
原因3:未修改主查询(推荐方案)
直接使用自定义WP_Query时,WordPress主查询仍默认查询普通文章类型,分页时因无对应内容返回404。修改主查询让博客页直接查询articles类型,是最稳定的解决方案。
步骤:
- 在主题的
functions.php文件中添加以下代码(根据/blog/是首页还是静态页面调整判断条件):
function custom_blog_main_query($query) { // 如果/blog/是静态页面用is_page('blog'),是博客首页用is_home() if (!is_admin() && $query->is_main_query() && is_page('blog')) { $query->set('post_type', 'articles'); $query->set('posts_per_page', 3); } } add_action('pre_get_posts', 'custom_blog_main_query');
- 页面模板中使用主循环,删除自定义WP_Query代码,简化为:
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <h3><?php the_title(); ?></h3> <?php endwhile; ?> <div class="pagination"> <?php $total_pages = $GLOBALS['wp_query']->max_num_pages; if ($total_pages > 1) { $current_page = max(1, get_query_var('page')); // 静态页面用page,首页用paged echo paginate_links(array( 'current' => $current_page, 'total' => $total_pages, 'prev_text' => __('« prev'), 'next_text' => __('next »'), )); } ?> </div> <?php endif; ?>
内容的提问来源于stack exchange,提问作者vimuth
相关产品推荐
相关产品推荐

