Как реализовать постраничную навигацию в wordpress без плагинов
Для wordpress существует великое множество плагинов, которые выводят постраничную навигацию. Её необходимость ни у кого не вызывает сомнения: повышение юзабилити, облегчение доступа для поисковых пауков ко всем статьям блога, повышение заработка в sape, в конце концов.
Но не все знают, что эти плагины (Wp-PageNavi, WP SEO Pager и др.) созданы далеко не оптимально: подгружают дополнительные стили CSS, часто создают ненужные запросы в базу данных. Да и в силу того, что эти плагины имеют разнообразные настройки – они содержат много лишнего кода, который неблагоприятно сказывается на скорости загрузки.
А ведь в wordpress постраничную навигацию можно реализовать полностью за счет внутренних функций, т.е. зачем изобретать колесо?
Давайте по порядку. Если у вас уже установлен один из таких плагинов – ищем в шаблоне (в файлах index.php, single.php и archive.php) код, вроде этого:
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
либо, если у вас навигация по постам выглядит так:
<< Предыдущая запись Следующая запись >>
то этот код в вашем шаблоне будет выглядеть так:
<span class="previous"><?php next_posts_link('« Предыдущие записи') ?></span><span class="next"><?php previous_posts_link('Следующие записи »') ?></span>
и вместо него вставляем вот этот код:
<?php
global $wp_query;
$max_page = $wp_query->max_num_pages;
$nump=2; /*Количество отображаемых подряд номеров страниц*/
if($max_page>1){
$paged = intval(get_query_var('paged'));
if(empty($paged) || $paged == 0) $paged = 1;
echo '<div class="pagenavi">';
/* echo 'Страница '.$paged.' из '.$max_page.' ';*/
if($paged!=1) echo '<a href="'.get_pagenum_link(1).'">1</a> ';
else echo '<u>1</u>';
if($paged-$nump>1) $start=$paged-$nump; else $start=2;
if($paged+$nump<$max_page) $end=$paged+$nump; else $end=$max_page-1;
if($start>2) echo "<b>...</b>";
for ($i=$start;$i<=$end;$i++)
{
if($paged!=$i) echo '<a href="'.get_pagenum_link($i).'">'.$i.'</a> ';
else echo '<u>'.$i.'</u>';
}
if($end<$max_page-1) echo "<b>...</b>";
if($paged!=$max_page) echo '<a href="'.get_pagenum_link($max_page).'"> Последняя »</a>';
else echo '<b> Последняя</b> ';
echo '</div>' ;
}
?>
Хотя более правильно будет вынести вышеуказанный код в файл pagenavi.php (предварительно создав такой файл и закачав его в папку с темой), а выводить навигацию вот так:
<?php include(TEMPLATEPATH."/pagenavi.php"); ?>
Если в вашем шаблоне постраничной навигации вообще нет, то этот код нужно вставить между строками:
<?php endwhile; ?>
и
<?php endif; ?>
Теперь навигация отображается, осталось настроить её внешний вид.
Указываем в style.css стили для следующих элементов:
.pagenavi {} – стиль для контейнера
<div class="pagenavi">
в который заключен весь код навигации.
span.current {} – стиль текущей страницы.
Готово! Тот же эффект, но реализация гораздо проще.
Можно считать эту статью небольшим дополнением к Юзабилити в wordpress. Часть 2 – навигация и Как я уменьшил время загрузки своего блога в 4 раза.
Сергей aka SergeySL написал отличный пост о том, как установить текстовый счетчик подписчиков FeedBurner и фолловеров Twitter. Как это выглядит вы можете посмотреть на блоге Сергея, либо на моём.


хотел подписаться на рсс а он пишет:
Ошибка синтаксического анализа XML: объявление XML или текста не в начале сущности
Адрес: http://feeds.feedburner.com/webstyle
Строка 2, символ 1:
исправь пожалуйста
Исправил, подписывайтесь. Большое спасибо, что не поленились написать об ошибке, так бы я и не узнал о её существовании
Добрый день! Спасибо за код! Слетел плагин с пейджером (seo pager). С плагином не стал разбираться и внял вашим советам по более корректной работе с пейджингом. Код работает прекрасно, считает правильно (в отличие от плагина) – не учитывает статьи, которые не выводятся в ленту.
Ян, настройки указывать в style.php или все-таки в style.css ?
Конечно в style.css, описка – сейчас поправилю.
Навигация — вещь очень нужная. Уже который месяц пытаюсь сделать навигацию по тегам (первому тегу) между записями (single.php), но увы, превратить WP в полноценную CMS что-то не получается. Если знаете способ подскажите.
Неудобно перемещаться по одиночным записям туда-сюда. Тем более, что записи могут идти «циклом статей», который будет разбросан среди других статей и циклов статей.
Для joomla есть плагин, который позволяет задавать похожие записи для каждого поста вручную. Т.е. если публикуете цикл статей, то линкуете каждую из них со всеми остальными. Может быть вам стоит поискать похожий плагин для wordpress. Сам подобный функционал я еще не реализовывал на wordpress, так что что-то конкретное подсказать пока не могу.
Спасибо, но похожие записи – это немного не то. Я вполне могу для каждого цикла статей сделать оглавление – отдельно или разместив на каждой странице (записи) цикла. Но хочется иметь обычную навигацию – вида: “Первая 2 3 4 5 … Последняя”. Желательно с прямой линковкой (а не вида: …/page1 …/page2 и т.д.).
Я не очень разбираюсь в коде wordpress’а, но мне удалось собрать “сборную солянку”, которая выводит нужную навигацию (страницы нумеруются через произвольные поля – собственно только эта часть кода и работает, а надо чтобы и первая часть работала – тогда бы вывод записей происходил только по первому тегу), но вот беда – выводит на всех записях подряд, т.е. при наличии трёх циклов статей получается что-то вроде: Первая 2 3 Первая 2 3 4 5 6 7 8 Первая 2 3 4.
Если интересно, могу выложить код.
Спасибо. Единственное, мне не совсем понятно как стиль прописывать.
Внешний вид -> редактор -> style.css
Спасибо за статью, но этот код тогда нужно вставлять не в functions.php, а в pagenavi.php
Т.к. при выводе мы инклюдим этот файл, и WP ругается что такового нет.
Да, конечно. Внес поправки в статью.
Спасибо, не думал что найду пагинатор без плагина, только без стилей очень плохо смотрится, где взять не скажете, что бы смотрелось нормально?
Начал искать стиль для контейнера, наткнулся на http://wp.и-с-к.рф/2011/02/04/postranichnuyu/
Установите плагин постраничной навигации со встроенными CSS стилями и скопируйте их себе в style.css. Тэги вывода навигации могут отличаться, так что вполне возможно что вам понадобится их подкорректировать. А если вы с CSS не дружите, то проще взять готовый плагин.
сайт droid.jino.ru у меня пропадает черная рамка на нажатой станице видно только цифру, можно ли как нибудь сделать чтоб у нажатой странице была рамка просто другого цвета…
У вас в html код не вставляется класс active у ссылки на текущую страницу. По этому и изменений никаких не происходит, хотя в CSS стили прописаны.
Добрый день. Частично не работает постраничная навигация. а именно не работает в рубриках, хотя если смотреть в записях автора то она отображается нормально, также в поиске работает, пробовал разные плагины ставить, писать в ручную, но проблема все также осталось, уже не знаю куда копать. версия wordpress 3.1, на данный момент сейчас постраничную навигацию выводит плагин стоит page-navi. Может кто сталкивался?!