我们知道,WordPress 的文章列表和评论都是自带分页功能的,用户列表分页和分类列表分页也以很简单的实现,其实只要知道了实现分页功能的原理,一切皆可分页。
实现分类列表有两个必须的数据:$number 和 $offset 参数,$number 是用来指定每页显示的数据数量,$offset 是用来计算从哪条数据开始获取。我们把这两个数据传递给获取分类项目的函数:get_terms,最终会实现类似类似 select * from wp_terms limit 10,20; 的 SQL 查询,每次点击下一页时,limit 后面的数字都会递增,来查询显示下一页的数据。
准备分类或标签数据
paginate_links 函数需要需要当前页数和最大页数来计算分类数据,显示分页列表,而 get_terms 函数需要显示数量 ($number) 和偏移量 ($offset) 数据两个来获取分类数据,实现上面说的 SQL 查询,我们通过下面的代码把这些数据准备好。
$taxonomy = 'post_tag'; $number = 100; // 分页参数 $page = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; $offset = ( $page > 0 ) ? $number * ( $page - 1 ) : 1; $totalterms = wp_count_terms( $taxonomy, [ 'hide_empty' => true ] ); $totalpages = ceil( $totalterms / $number ); $tags = get_terms( [ 'taxonomy' => $taxonomy, 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => true, 'fields' => 'all', 'number' => $number, 'offset' => $offset, 'cache_domain' => 'core', ] );
通过 paginate_links 函数实显示分页
有了上面准备好的数据,我们把数据传递给 paginate_links 函数就可以实现和文章列表分页或者用户列表分页一样的功能了。
$big = 999; echo paginate_links( [ 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '', 'current' => max( 1, $page ), 'total' => $totalpages, 'prev_text' => '上一页', 'next_text' => '下一页', 'type' => 'list', 'show_all' => false, 'end_size' => 3, 'mid_size' => 0, ] );
除了使用 WordPress 内置的 paginate_links 函数,我们也可以自己实现的分页函数来实现效果更丰富的分页功能。