Полностью нативный Page Navi
Открытий чудных...
Копаясь не в Кодексе Вордпресса, а напрямую в его файлах, можно найти гораздо больше интересного и местами полезного. Или бесполезного, вроде вспомогательной функции the_weekday(), которая показывает текущий день недели.
В некоторых темах пригодится, например, get_calendar(), который, натурально, отображает табличку дат за текущий месяц. Ссылки при этом ведут на конкретные страницы в архиве ВП, что хорошо для больших новостных блогов, с предпочтением навигации по дате.
В этом случае поможет также то, что движок, оказывается, умеет генерить фиды для отдельных категорий get_category_feed_link() и тегов get_tag_feed_link() — в качестве аргумента берет id категории/тега. Или get_author_feed_link() с аргументом $author_id для подписки на RSS конкретного автора (если ведут блог несколько — как на Соцвестнике или Социализме, или Штучках). Вы удивитесь, но есть RSS даже для поиска — get_search_feed_link(), аргумент — строка поискового запроса.
И все это можно использовать для линка автоматической подписки и кнопки в соответствующих разделах. Ведь часто раздражает, что невозможно подписаться на отдельную интересующую ленту и не получать всего остального мусора.
Ну да ладно, более забавную штуку я нашел, бегло просматривая тему-шаблон Slaff'a на предмет ошибок (он сам попросил!). Это наметка на полностью встроенную пагинацию в Wordpress. Но то ли разработчики постеснялись доделать, то ли забыли, но функция работает не прозрачно.
Честно говоря, по сравнению с моим предложением замены WP-Pagenavi, использование этой нативной функции не сильно меньше по размеру, но, возможно, понятней для среднестатистического блоггера. Если он еще не успел заснуть.
В общем, функция paginate_navi() просто выводит циферки со ссылками по определенному формату. Нам же надо заставить ее выводить полноценную пагинацию (кусок вставляется в вывод index.php, tag.php, category.php, archive.php, search.php):
<div id="navigation">
<?php
$paged = intval(get_query_var('paged'));
if(empty($paged) || $paged == 0) $paged = 1;
$plink = get_pagenum_link(777);
$plink = preg_replace("#".get_bloginfo('url')."(.+)777#","\\1%#%",$plink);
echo paginate_links( array(
"base" => get_bloginfo('url')."%_%",
"format" => $plink,
"total" => $wp_query->max_num_pages,
"current" => $paged,
"type" => "plain",
"show_all" => false,
"end_size" => 1,
"mid_size" => 6,
"prev_next" => true,
"prev_text" => "← предыдущие",
"next_text" => "следующие →",
));
?>
</div>
В аргументах она принимает параметры. Можно, конечно, передавать и строкой, но массивом — удобнее.
Первый блок — инициация скрипта, их менять не надо. Мы соответственно, задаем базу (ссылка на сам блог), формат ссылок на страницы (берем из get_pagenumlink, чтобы не зависеть от выбранного ЧПУ — автоматически будет подставляться ?page=N, /page/N или /page/N/). Это будет работать для любой страницы — что главной, что ленты категорий. Также здесь полное количество страниц и текущая страница — берем их из базы.
Остальные параметры настраиваемые.
typeопределяет тип вывода — можно установить как"array"(возвращается массив),"plain"(просто ссылки, как нам и надо), или"list"(списком ul-li).show_allможно поставить какtrue, если надо выводить список всех страниц. С точки зрения удобства, лучше оставитьfalse.end_size— количество номеров страниц, выводимых на концах списка. При значении 1 будет показываться только первая и последняя (всегда можно расширить).mid_size— количество страниц слева и справа от текущей. Неприятность состоит в том, что на 1 странице он выведет только N справа, а на N+1 столько же справа и слева.prev_next— выводить ли по бокам ссылки «предыдущая-следующая». Вообще, лучше установить параметр вfalse, и выводить их с помощью функцииposts_nav_link()над пагинацией, чтобы можно было выделить их большим размером.- Соответственно, если предыдущая опция включена, то
prev_textиnext_textопределяют текст в ссылках.
Скрипт на автомате оборачивает все в ссылки с нужными классами. Код получается примерно такой (оставлены только уникальные строчки):
<div id="navigation">
<span class='page-numbers current'>1</span>
<a class='page-numbers' href='http://localhost/blog/page/2/'>2</a>
<span class='page-numbers dots'>...</span>
<a class='page-numbers' href='http://localhost/blog/page/14/'>14</a>
<a class='next page-numbers' href='http://localhost/blog/page/2/'>следующие →</a>
</div>
Как можно видеть, код довольно избыточный, но зато в CSS настраивается все — определите класс .navigation для всего блока, .page-numbers для элементов пагинации, .dots — для многоточия и .current для текущей.
Самое простое так (возможно, не хватает font-size):
#navigation {
display:block;
text-align:center
}
#navigation .page-numbers {
text-decoration:none;
}
#navigation .prev, #navigation .next, #navigation .current {
font-weight:bold;
}
Или как в самом WP PageNavi, с квадратиками и прочим (и, естественно, оптимизированный вариант, а не то говно, простите за мой испанский, что нам подсовывают в самом плагине):
#navigation .page-numbers {
padding: 2px 4px;
margin: 2px;
border: 1px solid #06c;
color: #06c;
background-color: #FFF;
}
#navigation a{
text-decoration: none;
}
#navigation a:hover {
border: 1px solid #000;
color: #000;
}
#navigation .current {
border: 1px solid #000;
font-weight: bold;
color: #000;
}
#navigation .dots {
border: 1px solid #999;
color: #999;
}
Собственно, последние CSS-правила легко можно адаптировать и к моему решению, которое все же удобнее для использования.
Да и, сдается мне, paginate_links используется совсем не для этого...
Но факт остается фактом — в ВП еще много разных штук скрыто внутри.




Ого. пойду как и я покопаюсь в недрах вордпреса. А на одном сайте уже сделал пагинацию как ты рекомендовал. а на своем сайте так и оставил плагин что был Pagebar?
Вопрос: нигде не могу найти решение проблемы с ЧПУ для Page Navi плагина. Постраничный вывод просто не работает: www.blog/category/page/2 (www.blog/?cat=2&paged=2). Что на это скажите?