WordPress主题博客分页需求:实现每页3篇文章自动分页及导航
嘿,这个需求在WordPress里其实挺容易实现的,分几步来就行:
1. 先在后台调整基础设置
首先登录你的WordPress后台,找到「设置」→「阅读」,在「博客页面最多显示」那里输入3,保存设置。不过这一步有时候会被主题的自定义查询覆盖,所以接下来还要做模板层面的调整,确保万无一失。
2. 确保文章查询正确返回3篇/页
情况一:使用WordPress主循环(推荐)
如果你的博客页面用的是默认的主循环(比如if ( have_posts() ) : while ( have_posts() ) : the_post();这种),最好通过pre_get_posts钩子来修改主查询,避免直接在模板里写自定义循环导致分页失效。
打开主题的functions.php文件,添加下面的代码:
function custom_blog_posts_per_page( $query ) { // 只针对前台的博客主查询生效 if ( $query->is_home() && $query->is_main_query() && !is_admin() ) { $query->set( 'posts_per_page', 3 ); } } add_action( 'pre_get_posts', 'custom_blog_posts_per_page' );
这样就能确保博客页面的主查询每页只取3篇文章,而且不会影响后台或者其他页面的查询。
情况二:使用自定义WP_Query
如果你的博客页面用的是自定义循环(比如$custom_query = new WP_Query( $args );),那要在查询参数里明确设置posts_per_page,同时还要加上paged参数来支持分页:
// 获取当前页码,默认是1 $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; $args = array( 'posts_per_page' => 3, 'paged' => $paged, // 其他你需要的参数,比如分类、排序等 ); $custom_query = new WP_Query( $args ); // 然后是循环代码 if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post(); // 你的文章内容模板,比如标题、摘要等 the_title( '<h2>', '</h2>' ); the_excerpt(); endwhile; // 这里放分页导航代码,后面会说 endif; // 重置查询 wp_reset_postdata();
3. 添加分页导航按钮
不管用主循环还是自定义循环,都可以用WordPress内置的函数来生成分页导航:
针对主循环
在主循环结束后(endwhile;之后,endif;之前或之后),添加:
the_posts_pagination( array( 'mid_size' => 2, // 当前页码前后显示几个页码 'prev_text' => __( '上一页', 'your-theme-text-domain' ), // 上一页文本 'next_text' => __( '下一页', 'your-theme-text-domain' ), // 下一页文本 ) );
这个函数会自动生成带有样式的分页链接,你可以通过自定义CSS调整它的外观,让它适配你的主题风格。
针对自定义循环
如果是自定义WP_Query,需要用paginate_links()函数,因为the_posts_pagination()只针对主循环:
echo paginate_links( array( 'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ), 'total' => $custom_query->max_num_pages, // 总页数,来自自定义查询 'current' => max( 1, get_query_var( 'paged' ) ), // 当前页码 'format' => '?paged=%#%', 'show_all' => false, 'type' => 'list', 'end_size' => 1, 'mid_size' => 2, 'prev_next' => true, 'prev_text' => __( '上一页', 'your-theme-text-domain' ), 'next_text' => __( '下一页', 'your-theme-text-domain' ), 'add_args' => false, 'add_fragment' => '', ) );
同样,你可以通过CSS美化这个分页列表,比如去掉默认的列表符号,改成按钮样式等。
4. 测试分页功能
保存所有修改后,去你的博客页面看看,应该每页只显示3篇文章,底部有上一页/下一页和页码导航。点击导航按钮,应该能正确跳转到对应的页面,显示对应的文章。
如果遇到分页失效(比如点击第二页还是显示第一页的内容),大概率是自定义循环没加paged参数,或者主查询被其他函数覆盖了,检查一下functions.php里有没有其他修改posts_per_page的代码,或者自定义循环的参数是否正确。
内容的提问来源于stack exchange,提问作者Aljosa Boskovic

