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.'/">'.$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();
?>