This is a simple pagination snippet I wrote for a Drupal module I was working on. I've unDruaplized it and now it's completely independent.
The function will calculate the number of pages to display based on $total and $shown. In addition, it'll append the corresponding page number to the provided $url.
NOTE: All page numbers are incremented once. This means, the function assumes URL 0 as page 1.
This function takes 4 params
(int) $total - total number of results. 100 in our example
(int) $page - the page number you're currently on. using $_GET['p'] in our example
(int) $shown - number results to display per page. 10 results per page in our example
(str) $url - the url each link should have. "?p=" in our example
100(results)/10(per page) = 10(pages)
Example:
<?php
echo handle_pagination(100, (int)$_GET['p'], 10, '?p=');
?>
HTML Output:
<div>
<span>1</span>
<span><a href="?p=1">2</a></span>
<span><a href="?p=2">3</a></span>
<span><a href="?p=3">4</a></span>
<span><a href="?p=4">5</a></span>
...
<span><a href="?p=1">next ›</a></span>
<span><a href="?p=9">last »</a></span>
</div>
Page Output:
1 2 3 4 5 ... next › last »
<?php
function handle_pagination($total, $page, $shown, $url) {
$pages = ceil( $total / $shown );
$range_start = ( ($page >= 5) ? ($page - 3) : 1 );
$range_end = ( (($page + 5) > $pages ) ? $pages : ($page + 5) );
if ( $page >= 1 ) {
$r[] = '<span><a href="'. $url .'">« first</a></span>';
$r[] = '<span><a href="'. $url . ( $page - 1 ) .'">‹ previous</a></span>';
$r[] = ( ($range_start > 1) ? ' ... ' : '' );
}
if ( $range_end > 1 ) {
foreach(range($range_start, $range_end) as $key => $value) {
if ( $value == ($page + 1) ) $r[] = '<span>'. $value .'</span>';
else $r[] = '<span><a href="'. $url . ($value - 1) .'">'. $value .'</a></span>';
}
}
if ( ( $page + 1 ) < $pages ) {
$r[] = ( ($range_end < $pages) ? ' ... ' : '' );
$r[] = '<span><a href="'. $url . ( $page + 1 ) .'">next ›</a></span>';
$r[] = '<span><a href="'. $url . ( $pages - 1 ) .'">last »</a></span>';
}
return ( (isset($r)) ? '<div>'. implode("\r\n", $r) .'</div>' : '');
}
?>