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

Несколько причин, по которым стоит отказаться от плагина WP-Pagenavi в пользу альтернативы, предложенной в этом посте:

  1. За удобство настроек в админ панели приходится платить ценой лишних запросов, так как эти настройки сохраняются в БД, а затем от туда и берутся, хотя это в теории, а на практике они берутся из кэша опций WordPress, но тем не менее…
  2. В продолжение первого пункта – удобство в данном случае дело сомнительное – постраничная навигация, это такое дело, что настроил однажды и забыл. А заменить несколько значений в коде (в котором, кстати, есть все пояснения) не составит труда даже новичку.
  3. Если вы продвинутый пользователь и не впервые слышите слово «php», то при желании что-то изменить (будь то внешний вид или что-то еще) это ни составит никакого труда – код простой, понятный и лаконичный.
  4. При написании кода, его автор kama использовал те же css стили, что и использует плагин Pagenavi, так что вам даже не придется заново все оформлять.

Меньше слов, больше дела – рассмотрим код и что с ним делать.

Открываем в админке «Внешний вид -> Редактор» и выбираем Функции темы (functions.php). В самое начало этого файла вставляем следующий код:

/*** Альтернатива wp_pagenavi (без лишних обращений к данным) ***/
 
function kama_pagenavi($before='', $after='', $echo=true) {
 
	/* ================ Настройки ================ */
	$text_num_page = ''; // текст для количества страниц. {current} заменится текущей, а {last} последней. Пример: 'Страница {current} из {last}' = Страница 4 из 60
	$num_pages = 10; // сколько ссылок показывать
	$stepLink = 10; // после навигации ссылки с определенным шагом (значение = число (какой шаг) или '', если не нужно показывать). Пример: 1,2,3...10,20,30
	$dotright_text = '…'; // промежуточный текст "до".
	$dotright_text2 = '…'; // промежуточный текст "после".
	$backtext = '«'; // текст "перейти на предыдущую страницу". Ставим '', если эта ссылка не нужна.
	$nexttext = '»'; // текст "перейти на следующую страницу". Ставим '', если эта ссылка не нужна.
	$first_page_text = ''; // текст "к первой странице" или ставим '', если вместо текста нужно показать номер страницы.
	$last_page_text = ''; // текст "к последней странице" или пишем '', если вместо текста нужно показать номер страницы.
	/* ================ Конец Настроек ================ */ 
 
	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;
 
	$pages_to_show = intval($num_pages);
	$pages_to_show_minus_1 = $pages_to_show-1;
 
	$half_page_start = floor($pages_to_show_minus_1/2); //сколько ссылок до текущей страницы
	$half_page_end = ceil($pages_to_show_minus_1/2); //сколько ссылок после текущей страницы
 
	$start_page = $paged - $half_page_start; //первая страница
	$end_page = $paged + $half_page_end; //последняя страница (условно)
 
	if($start_page <= 0) $start_page = 1;
	if(($end_page - $start_page) != $pages_to_show_minus_1) $end_page = $start_page + $pages_to_show_minus_1;
	if($end_page > $max_page) {
		$start_page = $max_page - $pages_to_show_minus_1;
		$end_page = (int) $max_page;
	}
 
	if($start_page <= 0) $start_page = 1;
 
	$out=''; //выводим навигацию
		$out.= $before."<div class='wp-pagenavi'>\n";
				if ($text_num_page){
					$text_num_page = preg_replace ('!{current}|{last}!','%s',$text_num_page);
					$out.= sprintf ("<span class='pages'>$text_num_page</span>",$paged,$max_page);
				}
 
				if ($start_page >= 2 && $pages_to_show < $max_page) {
					$out.= '<a href="'.rtrim(get_pagenum_link(), '/').'">'. ($first_page_text?$first_page_text:1) .'</a>';
					if($dotright_text && $start_page!=2) $out.= '<span class="extend">'.$dotright_text.'</span>';
				}
 
				if ($backtext && $paged!=1) $out.= '<a href="'.rtrim(get_pagenum_link(($paged-1)), '/').'">'.$backtext.'</a>';
 
				for($i = $start_page; $i <= $end_page; $i++) {
					if($i == $paged) {
						$out.= '<span class="current">'.$i.'</span>';
					} else {
						$out.= '<a href="'.rtrim(get_pagenum_link($i), '/').'">'.$i.'</a>';
					}
				}
 
				if ($nexttext && $paged!=$end_page) $out.= '<a href="'.get_pagenum_link(($paged+1)).'">'.$nexttext.'</a>';
 
				//ссылки с шагом
				if ($stepLink && $end_page < $max_page){
					for($i=$end_page+1; $i<=$max_page; $i++) {
						if($i % $stepLink == 0 && $i!==$num_pages) {
							if (++$dd == 1) $out.= '<span class="extend">'.$dotright_text2.'</span>';
							$out.= '<a href="'.get_pagenum_link($i).'">'.$i.'</a>';
						}
					}
				}
 
				if ($end_page < $max_page) {
					if($dotright_text && $end_page!=($max_page-1)) $out.= '<span class="extend">'.$dotright_text2.'</span>';
					$out.= '<a href="'.get_pagenum_link($max_page).'">'. ($last_page_text?$last_page_text:$max_page) .'</a>';
				}
 
		$out.= "</div>".$after."\n";
	if ($echo) echo $out;
	else return $out;
}

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

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

Если вы затрудняетесь с тем куда это надо вставлять, просто ищите что-то подобное:

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

И заменяйте на указанную выше строку.

Теперь остается открыть файл /wp-content/plugins/wp-pagenavi/pagenavi-css.css скопировать оттуда весь код и вставить его в свой css файл (обычно это style.css и лежит в папке с вашей темой оформления).

Ну и последний шаг – деактивируем плагин WP-Pagenavi в админке и удаляем полностью его папку с сервера ;)

alaev.info

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.