Категория: Wordpress
Статья 3 комментария
18.01 2010

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

Для wordpress существует великое множество плагинов, которые выводят постраничную навигацию. Её необходимость ни у кого не вызывает сомнения: повышение юзабилити, облегчение доступа для поисковых пауков ко всем статьям блога, повышение заработка в sape, в конце концов. Но не все знают, что эти плагины (Wp-PageNavi, WP SEO Pager и др.) созданы далеко не оптимально: подгружают дополнительные стили CSS, часто создают ненужные запросы в базу данных. Да и в силу того, что эти плагины имеют разнообразные настройки – они содержат много лишнего кода, который неблагоприятно сказывается на скорости загрузки.

А ведь в wordpress постраничную навигацию можно реализовать полностью за счет внутренних функций, т.е. зачем изобретать колесо?

Давайте по порядку. Если у вас уже установлен один из таких плагинов – ищем в шаблоне (в файлах index.php, single.php и archive.php) код, вроде этого:

<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>  

либо, если у вас навигация по постам выглядит так:
<< Предыдущая запись                        Следующая запись >>
то этот код в вашем шаблоне будет выглядеть так:

<div class="alignleft"><?php next_posts_link('Older') ?></div>
<div class="alignright"><?php previous_posts_link('Newer') ?></div>

и вместо него вставляем вот этот код:

<?php
global $wp_query;
$max_page = $wp_query->max_num_pages;
$nump=10;

if($max_page!=1){
	$paged = intval(get_query_var('paged'));
	if(empty($paged) || $paged == 0) $paged = 1;

	echo '<div class="pagenavi">';

	if($paged!=1) echo '<a href="'.get_pagenum_link(1).'">Первая</a> ';
		else echo '<span class="current">Первая</span> ';

	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 "... ";

	for ($i=$start;$i<=$end;$i++)
	 {
	 if($paged!=$i) echo '<a href="'.get_pagenum_link($i).'">'.$i.'</a> ';
		else echo '<span class="current">'.$i.'</span> ';
	 }

	if($end<$max_page-1) echo "... ";

	if($paged!=$max_page) echo '<a href="'.get_pagenum_link($max_page).'">Последняя</a>';
		else echo '<span class="current">Последняя</span> ';
	echo '</div>'	;
	}
?>

Если в вашем шаблоне постраничной навигации вообще нет, то этот код нужно вставить между строками:

<?php endwhile; ?>

и

<?php endif; ?>

Теперь навигация отображается, осталось настроить её внешний вид.

Указываем в style.php стили для следующих элементов:

.pagenavi {} – стиль для контейнера

<div class="pagenavi">

в который заключен весь код навигации.

span.current {} – стиль текущей страницы.

Готово! Тот же эффект, но реализация гораздо проще.

Можно считать эту статью небольшим дополнением к Юзабилити в wordpress. Часть 2 – навигация и Как я уменьшил время загрузки своего блога в 4 раза.


Сергей aka SergeySL написал отличный пост о том, как установить текстовый счетчик подписчиков FeedBurner и фолловеров Twitter. Как это выглядит вы можете посмотреть на блоге Сергея, либо на моём.

Еще один способ разместить блок подписки на своём блоге – в виде информера. Такой плагин создал Blogovod, но его блог на данный момент почему-то недоступен. Прочесть пост об этом плагине можно здесь. Мне реализация очень понравилась.

  1. Комментарии:

  2. 18 января 2010

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

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

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

    Ответить

    Ян Такушевич отвечает:

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

    Ответить

  3. 16 февраля 2010

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

    Ответить