Правильная постраничная навигация в WordPress без плагинов

Всем известно, что существует множество плагинов для постраничной навигации для WordPress, однако, мало кто знает, что, во-первых, не все плагины делают правильную навигацию, а, во-вторых, можно вообще обойтись без плагинов.

Давайте разберёмся по порядку. В чём заключается «неправильность»? В генерации ссылки на страницу и в генерации лишних дублирующих ссылок. Для поисковых систем ссылки http://mysite.ru/page/5 и http://mysite.ru/page/5/ будут разными, то есть система проиндексирует страницу дважды и может определить это как дубляж, что не есть хорошо. Так же, ссылки http://mysite.ru/ и http://mysite.ru/page/1 будут вести на одну и ту же страницу — главную, но поисковая система воспринимает это как два разных адреса с одинаковым контентом.

Ну, и ещё немного минусов плагинов. Плагин занимает память и процессорное время на старт, что может быть критично на некоторых хостингах. Лишний плагин — занята лишняя память, затрачивается лишнее время на его запуск и отработку. К тому же, как уже говорилось выше, не все плагины делают правильную постраничную навигацию. Тем более, что для установки плагина необходимо вносить изменения в файлы шаблона, а если и не надо, то плагин сам вставляет навигацию куда ему нравится, что тоже не очень хорошо.

Я предлагаю простое решение — обойтись без плагинов в деле постраничной навигации. Выигрыш в памяти и полном контроле над выводом данных. Признаюсь, что основу идеи я взял у АлаичЪ'а, но мне не понравилась его реализация с пропуском номеров страниц. Поэтому, взяв идею за основу, я переписал код по-другому.

Для достижения нашей цели необходимо сделать следующее. В файле functions.php, который располагается в папке темы нужно вставить следующую процедуру:

function my_pagenavi($before='<div class="wp-pagenavi">', $after='</div>', $echo=true) {

	$backtext = '⇐ '; // текст "перейти на предыдущую страницу". Ставим '', если эта ссылка не нужна.
	$nexttext = ' ⇒'; // текст "перейти на следующую страницу". Ставим '', если эта ссылка не нужна.
	$num_pages_first_end = 3; // сколько ссылок показывать в начале и в конце списка
	$num_pages_middle = 5; // сколько ссылок показывать в середине списка (нечётное число, чётные числа уменьшаются до нечётного)

	global $wp_query;
	$posts_per_page = (int) $wp_query->query_vars[posts_per_page];
	$paged = (int) $wp_query->query_vars[paged];
	$max_page = $wp_query->max_num_pages;
	if($max_page <= 1 ) return false; //проверка на надобность в навигации

	if(empty($paged) || $paged == 0) $paged = 1;
	$midl_min=$paged-ceil($num_pages_middle/2)+1;
	$midl_max=$paged+ceil($num_pages_middle/2)-1;
	if (1>$midl_min) $midl_min=1;
	if ($max_page<$midl_max) $midl_max=$max_page;

	$out=$before;
	$showed=FALSE;

	if ($backtext && $paged!=1) $out.= '<a href="'.rtrim(get_pagenum_link(($paged-1)), '/').'">'.$backtext.'</a>';

	for ($i=1;$i<=$max_page;$i++){
		if ($i<=$num_pages_first_end || $i>=$max_page-$num_pages_first_end+1 ||
			($i>=$midl_min && $i<=$midl_max)){
			$showed=FALSE;
			if ($i!=$paged) $out.='<a href="'.rtrim(get_pagenum_link($i), '/').'">'.$i.'</a>';
				else $out.='<span>'.$i.'</span>';
		}
		else {
			if (!$showed) {
				$showed=TRUE;
				$out.='<span>…</span>';
			}
		}
	}

	if ($nexttext && $paged!=$max_page) $out.= '<a href="'.get_pagenum_link(($paged+1)).'">'.$nexttext.'</a>';

	$out.=$after;

	if ($echo) echo $out;
	else return $out;
}

В шаблоне главной страницы в том месте, где должна появляться постраничная навигация, необходимо вставить следующий код:

<?php if (function_exists('my_pagenavi')) my_pagenavi(); ?>

Вот и всё. Осталось только лишь настроить отображение стилей, например, вставив вот этот код в файл style.css темы:

.wp-pagenavi span, .wp-pagenavi a{margin:0 2px;}

Этого уже достаточно, чтобы наша постраничная навигация отображалась корректно и приятно глазу.

Правильная постраничная навигация в wordpress