Полностью нативный 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" => "&larr; предыдущие",
	"next_text" => "следующие &rarr;",
));
?>
</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 используется совсем не для этого...

Но факт остается фактом — в ВП еще много разных штук скрыто внутри.

{2 комментария} Подписка на комментарии

Ого. пойду как и я покопаюсь в недрах вордпреса. А на одном сайте уже сделал пагинацию как ты рекомендовал. а на своем сайте так и оставил плагин что был Pagebar?

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

А здесь можно оставить свое мнение ↓ Подписка на комментарии
какие-то из следующих трех полей можно оставить пустыми


нет тегам!!! **эмоция**, __ирония__, >цитата, {[код]}