Как реализовать постраничную навигацию в wordpress без плагинов

Для wordpress существует великое множество плагинов, которые выводят постраничную навигацию. Её необходимость ни у кого не вызывает сомнения: повышение юзабилити, облегчение доступа для поисковых пауков ко всем статьям блога, повышение заработка в sape, в конце концов.

постраничная навигация wordpressНо не все знают, что эти плагины (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('&laquo; Предыдущие записи') ?></span><span class="next"><?php previous_posts_link('Следующие записи &raquo;') ?></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.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';*/
	if($paged!=1) echo '<a href="'.get_pagenum_link(1).'">1</a>&nbsp;';
		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).'"> Последняя &raquo;</a>';
		else echo '<b>&nbsp;Последняя</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. Как это выглядит вы можете посмотреть на блоге Сергея, либо на моём.

17 комментариев ,

17 комментариев к записи “Как реализовать постраничную навигацию в wordpress без плагинов”

  1. Openixxx 18 января 2010 at 22:26 #

    хотел подписаться на рсс а он пишет:

    Ошибка синтаксического анализа XML: объявление XML или текста не в начале сущности
    Адрес: http://feeds.feedburner.com/webstyle
    Строка 2, символ 1:

    исправь пожалуйста

    • Ян Такушевич 19 января 2010 at 12:02 #

      Исправил, подписывайтесь. Большое спасибо, что не поленились написать об ошибке, так бы я и не узнал о её существовании :)

  2. Артем 16 февраля 2010 at 10:46 #

    Добрый день! Спасибо за код! Слетел плагин с пейджером (seo pager). С плагином не стал разбираться и внял вашим советам по более корректной работе с пейджингом. Код работает прекрасно, считает правильно (в отличие от плагина) – не учитывает статьи, которые не выводятся в ленту.

  3. HSIF 15 ноября 2010 at 09:51 #

    Ян, настройки указывать в style.php или все-таки в style.css ?

    • Ян Такушевич 15 ноября 2010 at 11:01 #

      Конечно в style.css, описка – сейчас поправилю.

  4. Servest 29 ноября 2010 at 09:59 #

    Навигация — вещь очень нужная. Уже который месяц пытаюсь сделать навигацию по тегам (первому тегу) между записями (single.php), но увы, превратить WP в полноценную CMS что-то не получается. Если знаете способ подскажите.
    Неудобно перемещаться по одиночным записям туда-сюда. Тем более, что записи могут идти «циклом статей», который будет разбросан среди других статей и циклов статей.

    • Ян Такушевич 29 ноября 2010 at 21:14 #

      Для joomla есть плагин, который позволяет задавать похожие записи для каждого поста вручную. Т.е. если публикуете цикл статей, то линкуете каждую из них со всеми остальными. Может быть вам стоит поискать похожий плагин для wordpress. Сам подобный функционал я еще не реализовывал на wordpress, так что что-то конкретное подсказать пока не могу.

  5. Servest 30 ноября 2010 at 10:04 #

    Спасибо, но похожие записи – это немного не то. Я вполне могу для каждого цикла статей сделать оглавление – отдельно или разместив на каждой странице (записи) цикла. Но хочется иметь обычную навигацию – вида: “Первая 2 3 4 5 … Последняя”. Желательно с прямой линковкой (а не вида: …/page1 …/page2 и т.д.).
    Я не очень разбираюсь в коде wordpress’а, но мне удалось собрать “сборную солянку”, которая выводит нужную навигацию (страницы нумеруются через произвольные поля – собственно только эта часть кода и работает, а надо чтобы и первая часть работала – тогда бы вывод записей происходил только по первому тегу), но вот беда – выводит на всех записях подряд, т.е. при наличии трёх циклов статей получается что-то вроде: Первая 2 3 Первая 2 3 4 5 6 7 8 Первая 2 3 4.
    Если интересно, могу выложить код.

  6. alpings 29 января 2011 at 17:08 #

    Спасибо. Единственное, мне не совсем понятно как стиль прописывать.

    • Ян Такушевич 6 февраля 2011 at 12:19 #

      Внешний вид -> редактор -> style.css

  7. sima 27 марта 2011 at 17:12 #

    Спасибо за статью, но этот код тогда нужно вставлять не в functions.php, а в pagenavi.php
    Т.к. при выводе мы инклюдим этот файл, и WP ругается что такового нет. :)

    • Ян Такушевич 27 марта 2011 at 21:57 #

      Да, конечно. Внес поправки в статью.

  8. Иван 20 июня 2011 at 09:50 #

    Спасибо, не думал что найду пагинатор без плагина, только без стилей очень плохо смотрится, где взять не скажете, что бы смотрелось нормально?
    Начал искать стиль для контейнера, наткнулся на http://wp.и-с-к.рф/2011/02/04/postranichnuyu/

    • Ян Такушевич 20 июня 2011 at 11:33 #

      Установите плагин постраничной навигации со встроенными CSS стилями и скопируйте их себе в style.css. Тэги вывода навигации могут отличаться, так что вполне возможно что вам понадобится их подкорректировать. А если вы с CSS не дружите, то проще взять готовый плагин.

  9. kolya 16 июля 2011 at 19:46 #

    сайт droid.jino.ru у меня пропадает черная рамка на нажатой станице видно только цифру, можно ли как нибудь сделать чтоб у нажатой странице была рамка просто другого цвета…

    • Ян Такушевич 19 июля 2011 at 13:17 #

      У вас в html код не вставляется класс active у ссылки на текущую страницу. По этому и изменений никаких не происходит, хотя в CSS стили прописаны.

  10. Денис 28 декабря 2011 at 09:42 #

    Добрый день. Частично не работает постраничная навигация. а именно не работает в рубриках, хотя если смотреть в записях автора то она отображается нормально, также в поиске работает, пробовал разные плагины ставить, писать в ручную, но проблема все также осталось, уже не знаю куда копать. версия wordpress 3.1, на данный момент сейчас постраничную навигацию выводит плагин стоит page-navi. Может кто сталкивался?!

Оставить комментарий

Получать новые комментарии по электронной почте. Вы можете подписаться, не оставляя свой комментарий.