如何限制WordPress自定义分类法术语页面的术语数量
解决自定义分类法术语分页问题
你的核心问题是错误地用了控制文章数量的posts_per_page参数来控制自定义分类术语的分页,这个参数只对WP_Query(文章查询)生效,而你需要分页的是分类法的术语,得用get_terms自身的分页参数实现。
实现步骤与完整代码
<?php // 1. 定义每页显示的术语数量 $per_page = 5; // 2. 获取当前页码(归档页用paged,静态页用page) $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; if (is_front_page()) { $paged = (get_query_var('page')) ? get_query_var('page') : 1; } // 3. 计算偏移量:跳过前面页面的术语总数 $offset = ($paged - 1) * $per_page; // 4. 获取当前页的术语列表 $term_args = array( 'taxonomy' => 'shoof_series', 'hide_empty' => false, 'number' => $per_page, // 每页显示的术语数量 'offset' => $offset // 需要跳过的术语数量 ); $terms = get_terms($term_args); // 查询总术语数(仅返回数量,提升性能) $total_terms_args = array( 'taxonomy' => 'shoof_series', 'hide_empty' => false, 'fields' => 'count' ); $total_terms = get_terms($total_terms_args); // 处理无术语或错误情况 if (empty($terms) || is_wp_error($terms)) { echo '<p>暂无系列分类</p>'; return; } // 循环输出当前页的术语及对应内容 foreach ($terms as $term) { // 可选:查询该术语下的自定义文章 $post_query = new WP_Query(array( 'post_type' => 'series', 'posts_per_page' => 1, 'tax_query' => array( array( 'taxonomy' => 'shoof_series', 'terms' => $term->slug, 'field' => 'slug' ) ) )); ?> <div class="col"> <!-- 术语基础信息 --> <h3><a href="<?php echo get_term_link($term); ?>"><?php echo esc_html($term->name); ?></a></h3> <p><?php echo esc_html($term->description); ?></p> <!-- 术语下的文章内容 --> <?php if ($post_query->have_posts()) : ?> <?php while ($post_query->have_posts()) : $post_query->the_post(); ?> <div class="series-post"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </div> <?php endwhile; ?> <?php wp_reset_postdata(); // 重置文章查询,避免全局变量污染 ?> <?php endif; ?> </div> <?php } // 5. 生成分页导航 $total_pages = ceil($total_terms / $per_page); if ($total_pages > 1) { echo '<div class="pagination">'; echo paginate_links(array( 'base' => get_pagenum_link(1) . '%_%', 'format' => 'page/%#%/', 'current' => $paged, 'total' => $total_pages, 'prev_text' => __('« 上一页'), 'next_text' => __('下一页 »'), 'type' => 'list' )); echo '</div>'; } ?>
关键细节说明
get_terms的number和offset是实现术语分页的核心:number控制每页显示的术语数,offset计算需要跳过的前面页面的术语总数。- 单独查询总术语数是为了计算总页数,确保分页导航正确显示。
- 使用WordPress原生的
paginate_links()生成分页,比自定义的wpbeginner_numeric_posts_nav()更适配术语分页场景;如果坚持用自定义分页函数,需要修改它的逻辑来接收总页数参数。 - 每次调用
WP_Query后必须用wp_reset_postdata()重置查询,避免后续模板中的全局文章变量混乱。
内容的提问来源于stack exchange,提问作者Mohamed Omar
相关产品推荐
相关产品推荐

