You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:27:05