Аргументы:
  • $format - строка-урл, должен быть %s для подстановки страниц
  • $found - количество найденных результатов
  • $page_id - номер страницы из GET-запроса
  • $limit - лимит, обычно 50
1function get_pagination($format, $found, $page_id, $limit = 50) {
2
3    $html = '<div class="paging">';
4    $pagetpl = function($n, $alt = '') use ($page_id, $format) {
5
6        $alt = $alt ?: $n+1;
7        if ($n == $page_id) {
8            return '<span class="page-active">'.$alt.'</span>';
9        } else {
10            return ' <a href="'.sprintf($format, $n).'" class="page">'.$alt.'</a> ';
11        }
12    };
13
14    $max = (int)($found / $limit) + (($found % $limit) ? 0 : 1);
15    if ($found == 0) $max = 0;
16
17    $a = $page_id - 5;
18    $a = max($a, 0);
19    $b = $page_id + 5;
20    if ($b >= $max) $b = $max;
21
22    if ($page_id > 0) $html .= $pagetpl($page_id + 1, '←');
23
24    if ($a > 0) $html .= $pagetpl(0);
25    if ($a > 2) $html .= $pagetpl($a-1, '…');
26
27    for ($n = $a; $n <= $b; $n++) $html .= $pagetpl($n);
28
29    if ($b < $max - 1) $html .= $pagetpl($b+1, '…');
30    if ($b < $max) $html .= $pagetpl($max);
31
32    if ($page_id < $max) $html .= $pagetpl($page_id + 1, '→');
33
34    return "$html</div>";
35}