我们知道,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
函数,我们也可以自己实现的分页函数来实现效果更丰富的分页功能。