How to paginate a list of tags

you could paginate your page by simply adding /page/n to the end of the URL, where n is the desired page number. creating your next/prev links will be a manual affair though. the page number will then be accessible via get_query_var('paged'). then use the number argument for get_terms to select 40 at a time, use the offset argument, which will be your page number -1 * number per page, to select the current “page” of terms:

$page = ( get_query_var('paged') ) ? get_query_var( 'paged' ) : 1;
$taxonomy = 'post_tag';
$offset = ( $page-1 ) * 40;
$args = array( 'number' => 40, 'offset' => $offset );
$tax_terms = get_terms( $taxonomy, $args );

as for viewing all, maybe append a GET var to the URL, ?showall=true, then check isset( $_GET['showall'] ) and change the number to fetch accordingly.

EDIT

here’s a quick template I made to show an example. I tested it on a page on a test install with pretty permalinks, the page was ‘about’, so the pagination links were:

http://localhost/about/page/2/
http://localhost/about/?showall=true

if your permalinks are different, you’ll have to edit the pagination section to reflect your setup.

<?php

get_header();

// if show all is set
if( isset($_GET['showall']) ):

    $args = array( 'hide_empty' => 0 );

else:
// else show paged

    $page = ( get_query_var('paged') ) ? get_query_var( 'paged' ) : 1;
    // number of tags to show per-page
    $per_page = 40;
    $offset = ( $page-1 ) * $per_page;
    $args = array( 'number' => $per_page, 'offset' => $offset, 'hide_empty' => 0 );

endif;

$taxonomy = 'post_tag';
$tax_terms = get_terms( $taxonomy, $args );


echo '<ul>';

foreach ($tax_terms as $tax_term) {
    echo '<li>' . '<a href="' . esc_attr(get_term_link($tax_term, $taxonomy)) . '" title="' . sprintf( __( "View all posts in %s" ), $tax_term->name ) . '" ' . '>' . $tax_term->name.'</a></li>';
}

echo '</ul>';


// pagination
// if showall isn't set
if( !isset($_GET['showall']) ):

    $total_terms = wp_count_terms( 'post_tag' );
    $pages = ceil($total_terms/$per_page);

    // if there's more than one page
    if( $pages > 1 ):
        echo '<ul>';

        for ($pagecount=1; $pagecount <= $pages; $pagecount++):
            echo '<li><a href="'.get_permalink().'page/'.$pagecount."https://wordpress.stackexchange.com/">'.$pagecount.'</a></li>';
        endfor;

        echo '</ul>';

        // link to show all
        echo '<a href="'.get_permalink().'?showall=true">show all</a>';
    endif;

else:
// showall is set, show link to get back to paged mode

    echo '<a href="'.get_permalink().'">show paged</a>';

endif;


get_footer();

?>

Leave a Comment