// функция пагинации c тонкой настройкой:
function tweak_pagination($max = 0, $args = array()) {
// возвращает готовые открывающий и закрывающий тэги
// на основе имени тэга и классов:
function get_html_tags($tag, $class_def, $class_custom) {
$tag_in = ''; $tag_out = '';
if ($tag != '') {
$tag_in = '<'. $tag;
// проверяем классы:
$class = merge_html_classes($class_def, $class_custom);
if ($class != '')
$tag_in .= ' class="' . $class . '"';
$tag_in .= '>';
$tag_out = '</' . $tag . '>';
}
return array($tag_in, $tag_out);
}
// возвращает cырую строчку без лишних пробелов
// но и без закрывающих кавычек:
function merge_html_classes($classA, $classB) {
$out = '';
// проверяем классы:
if ($classA != '' || $classB != '') {
if ($classA != '') $out = $classA;
if ($classB != '' ) {
// не забываем пропробельчик :)
if ($classA != '') $out .= ' ';
$out .= $classB;
}
}
return $out;
}
// если $max равен или меньше нуля -
// берём количество страниц из кэша глобального запроса:
if ($max <= 0 ) {
global $wp_query;
$max = $wp_query->max_num_pages;
}
// максимальное количество страниц у произвольного запроса:
$max = ($max > 0) ? $max : 1;
// получаем номер текущeй страницы из парсинга урла в кэшэ wp_query:
if ( !$current = get_query_var('paged') ) $current = 1;
// опции пагинации по умолчанию:
$defaults = array(
'base' => str_replace(999999999, '%#%', get_pagenum_link(999999999)),
'total' => $max,
'current' => $current,
'mid_size' => 3, // сколько пунктов показывать слева и справа от текущего
'end_size' => 1, // сколько пунктов показывать в начале и в конце
'prev_text' => '«', // текст prev-пункта
'next_text' => '»', // текст next-пункта
'type' => 'array',
// всевозможные тонкие настройки html:
'wrap' => 'ul', // тэг обёртки вокруг пунктов пагинации
'wrap_def_class' => 'pagination', // класс обёртки по умолчанию
'wrap_class' => '', // пользовательские классы обёртки
'item' => 'li', // тэг пункта пагинации
'item_def_class' => '', // класс пункта пагинации по умолчанию
'item_class' => '', // пользовательские классы пункта пагинации
'curr' => 'li', // тэг текущего пункта пагинации
'curr_class' => '', // класс текущего пункта пагинации
'prev' => 'li', // тэг prev-пункта пагинации
'prev_class' => '', // класс prev-пункта пагинации
'next' => 'li', // тэг next-пункта пагинации
'next_class' => '', // класс next-пункта пагинации
'html' => true, // формировать html вокруг встроенной пагинации WP
'echo' => true // сразу выводить
);
// получаем настройки пользователя:
$total = array_merge($defaults, $args);
// не парсим, если в опциях тип вывода не массив, или парсить не надо
if ($total['type'] !== 'array' || $total['html'] !== true) {
if ($total['echo'] === true)
echo paginate_links($total);
else return paginate_links($total);
}
// формируем тэги обёртки:
list($wrap_in, $wrap_out) =
get_html_tags($total['wrap'], $total['wrap_def_class'], $total['wrap_class']);
// формируем тэги пунктов пагинации:
list($item_in, $item_out) =
get_html_tags($total['item'], $total['item_def_class'], $total['item_class']);
// формируем тэг текущего пункта:
$item_class = merge_html_classes($total['item_def_class'], $total['item_class']);
list($curr_in, $curr_out) =
get_html_tags($total['curr'], $item_class, $total['curr_class']);
// формируем тэг prev-пункта:
list($prev_in, $prev_out) =
get_html_tags($total['next'], $item_class, $total['prev_class']);
// формируем тэг next-пункта:
list($next_in, $next_out) =
get_html_tags($total['next'], $item_class, $total['next_class']);
// получаем массив пагинации:
$paginate = paginate_links($total);
// если массива нет или он пустой - выходим:
if (!is_array($paginate) || $paginate === array()) return;
// формируем html:
$html = $wrap_in;
foreach($paginate as $item => $value) {
if (strpos($value, 'prev') !== false)
$html .= $prev_in . $value . $prev_out;
elseif (strpos($value, 'current') !== false)
$html .= $curr_in . $value . $curr_out;
elseif (strpos($value, 'next') !== false)
$html .= $next_in . $value . $next_out;
else
$html .= $item_in . $value . $item_out;
}
$html .= $wrap_out;
// выводим или отдаём готовый html:
if ($total['echo'] === true) echo $html;
else return $html;
}