自定义WordPress分页导航-智能省略与Active状态优化

风中赏雪 Wordpress Wordpress 2025-09-28 2,621 0
<?php
function custom_pagination() {
    global $wp_query;
    $total_pages = $wp_query->max_num_pages;
    if ($total_pages <= 1) return;
    
    $current_page = max(1, get_query_var('paged'));
    $pagination = '<div class="pagination">';
    
    // 上一页链接
    if ($current_page > 1) {
        $pagination .= sprintf(
            '<a href="%s" class="prev">上一页</a>',
            esc_url(get_pagenum_link($current_page - 1))
        );
    }

    // 页码显示逻辑
    if ($total_pages <= 6) {
        // 总页数≤6时显示所有页码
        for ($i = 1; $i <= $total_pages; $i++) {
            $active_class = ($i == $current_page) ? ' active' : '';
            $pagination .= sprintf(
                '<a href="%s" class="page%s">%d</a>',
                esc_url(get_pagenum_link($i)),
                $active_class,
                $i
            );
        }
    } else {
        // 总页数>6时的智能分页
        $show_pages = [];
        
        // 总是显示第1页
        $show_pages[] = 1;
        
        // 当前页附近的页面
        $start = max(2, $current_page - 1);
        $end = min($total_pages - 1, $current_page + 1);
        
        // 确保显示足够的页码
        if ($start > 2) {
            $show_pages[] = '...';
        }
        
        for ($i = $start; $i <= $end; $i++) {
            $show_pages[] = $i;
        }
        
        if ($end < $total_pages - 1) {
            $show_pages[] = '...';
        }
        
        // 总是显示最后一页
        if ($total_pages > 1) {
            $show_pages[] = $total_pages;
        }
        
        // 生成页码链接
        foreach ($show_pages as $page) {
            if ($page === '...') {
                $pagination .= '<span class="ellipsis">...</span>';
            } else {
                $active_class = ($page == $current_page) ? ' active' : '';
                $pagination .= sprintf(
                    '<a href="%s" class="page%s">%d</a>',
                    esc_url(get_pagenum_link($page)),
                    $active_class,
                    $page
                );
            }
        }
    }

    // 下一页链接
    if ($current_page < $total_pages) {
        $pagination .= sprintf(
            '<a href="%s" class="next">下一页</a>',
            esc_url(get_pagenum_link($current_page + 1))
        );
    }

    $pagination .= '</div>';
    echo $pagination;
}

// 调用分页函数
custom_pagination();
?>