WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

Альтернатива плагину WP-pagenavi (пагинация для WordPress)

C версии 4.1 в WordPress появилась родная аналогичная функция: the_posts_pagination()

Попалась мне как-то тема, что популярнейший  плагин WordPress wp-pagenavi нагружает сервер не в меру своей надобности. Проанализировав его код выяснил, что это всего лишь миф, хотя его все же можно немного оптимизировать, собственно этому и посвящен пост.

Если другие плагины сложно представить без возможности их настройки в админ-панели, то wp-pagenavi мне представляется легко. Достаточно один раз настроить навигацию и забыть про нее. И наверное есть те, кто думает так же? Поэтому я решил отказаться от wp-pagenavi и заменить его на свою функцию. Функцию я написал, предварительно изучив код wp-pagenavi, частично код был взят от туда. Все CSS классы wp-pagenavi сохранены и, как следствие, заменить wp-pagenavi на мой вариант совсем не составит труда.

Для замены нужно скопировать нижеследующую функцию в файл шаблона functions.php. Также, нужно скопировать CSS стили wp-pagenavi в ваш файл стилей (обычно это style.css). Перенос стилей носит и полезный характер, потому что больше не будет необходимости подключать файл стилей, а это минус один http запрос.

/**
 * Альтернатива wp_pagenavi. Создает ссылки пагинации на страницах архивов.
 *
 * @param array  $args      Аргументы функции
 * @param object $wp_query  Объект WP_Query на основе которого строится пагинация. По умолчанию глобальная переменная $wp_query
 *
 * @version 2.7
 * @author  Тимур Камаев
 * @link    Ссылка на страницу функции: http://wp-kama.ru/?p=8
 */
function kama_pagenavi( $args = array(), $wp_query = null ){

	// параметры по умолчанию
	$default = array(
		'before'          => '',   // Текст до навигации.
		'after'           => '',   // Текст после навигации.
		'echo'            => true, // Возвращать или выводить результат.

		'text_num_page'   => '',           // Текст перед пагинацией.
		// {current} - текущая.
		// {last} - последняя (пр: 'Страница {current} из {last}' получим: "Страница 4 из 60").
		'num_pages'       => 10,           // Сколько ссылок показывать.
		'step_link'       => 10,           // Ссылки с шагом (если 10, то: 1,2,3...10,20,30. Ставим 0, если такие ссылки не нужны.
		'dotright_text'   => '…',          // Промежуточный текст "до".
		'dotright_text2'  => '…',          // Промежуточный текст "после".
		'back_text'       => '« назад',    // Текст "перейти на предыдущую страницу". Ставим 0, если эта ссылка не нужна.
		'next_text'       => 'вперед »',   // Текст "перейти на следующую страницу".  Ставим 0, если эта ссылка не нужна.
		'first_page_text' => '« к началу', // Текст "к первой странице".    Ставим 0, если вместо текста нужно показать номер страницы.
		'last_page_text'  => 'в конец »',  // Текст "к последней странице". Ставим 0, если вместо текста нужно показать номер страницы.
	);

	// Cовместимость с v2.5: kama_pagenavi( $before = '', $after = '', $echo = true, $args = array() )
	if( ($fargs = func_get_args()) && is_string( $fargs[0] ) ){
		$default['before'] = isset($fargs[0]) ? $fargs[0] : '';
		$default['after']  = isset($fargs[1]) ? $fargs[1] : '';
		$default['echo']   = isset($fargs[2]) ? $fargs[2] : true;
		$args              = isset($fargs[3]) ? $fargs[3] : array();
		$wp_query = $GLOBALS['wp_query']; // после определения $default!
	}

	if( ! $wp_query ){
		wp_reset_query();
		global $wp_query;
	}

	if( ! $args ) $args = array();
	if( $args instanceof WP_Query ){
		$wp_query = $args;
		$args     = array();
	}

	$default = apply_filters( 'kama_pagenavi_args', $default ); // чтобы можно было установить свои значения по умолчанию

	$rg = (object) array_merge( $default, $args );

	//$posts_per_page = (int) $wp_query->get('posts_per_page');
	$paged          = (int) $wp_query->get('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( $rg->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;

	// создаем базу чтобы вызвать get_pagenum_link один раз
	$link_base = str_replace( 99999999, '___', get_pagenum_link( 99999999 ) );
	$first_url = get_pagenum_link( 1 );
	if( false === strpos( $first_url, '?') )
		$first_url = user_trailingslashit( $first_url );

	// собираем елементы
	$els = array();

	if( $rg->text_num_page ){
		$rg->text_num_page = preg_replace( '!{current}|{last}!', '%s', $rg->text_num_page );
		$els['pages'] = sprintf( '<span class="pages">'. $rg->text_num_page .'</span>', $paged, $max_page );
	}
	// назад
	if ( $rg->back_text && $paged != 1 )
		$els['prev'] = '<a class="prev" href="'. ( ($paged-1)==1 ? $first_url : str_replace( '___', ($paged-1), $link_base ) ) .'">'. $rg->back_text .'</a>';
	// в начало
	if ( $start_page >= 2 && $pages_to_show < $max_page ) {
		$els['first'] = '<a class="first" href="'. $first_url .'">'. ( $rg->first_page_text ?: 1 ) .'</a>';
		if( $rg->dotright_text && $start_page != 2 )
			$els[] = '<span class="extend">'. $rg->dotright_text .'</span>';
	}
	// пагинация
	for( $i = $start_page; $i <= $end_page; $i++ ) {
		if( $i == $paged )
			$els['current'] = '<span class="current">'. $i .'</span>';
		elseif( $i == 1 )
			$els[] = '<a href="'. $first_url .'">1</a>';
		else
			$els[] = '<a href="'. str_replace( '___', $i, $link_base ) .'">'. $i .'</a>';
	}

	// ссылки с шагом
	$dd = 0;
	if ( $rg->step_link && $end_page < $max_page ){
		for( $i = $end_page + 1; $i <= $max_page; $i++ ){
			if( $i % $rg->step_link == 0 && $i !== $rg->num_pages ) {
				if ( ++$dd == 1 )
					$els[] = '<span class="extend">'. $rg->dotright_text2 .'</span>';
				$els[] = '<a href="'. str_replace( '___', $i, $link_base ) .'">'. $i .'</a>';
			}
		}
	}
	// в конец
	if ( $end_page < $max_page ) {
		if( $rg->dotright_text && $end_page != ($max_page-1) )
			$els[] = '<span class="extend">'. $rg->dotright_text2 .'</span>';
		$els['last'] = '<a class="last" href="'. str_replace( '___', $max_page, $link_base ) .'">'. ( $rg->last_page_text ?: $max_page ) .'</a>';
	}
	// вперед
	if ( $rg->next_text && $paged != $end_page )
		$els['next'] = '<a class="next" href="'. str_replace( '___', ($paged+1), $link_base ) .'">'. $rg->next_text .'</a>';

	$els = apply_filters( 'kama_pagenavi_elements', $els );

	$out = $rg->before . '<div class="wp-pagenavi">'. implode( ' ', $els ) .'</div>'. $rg->after;

	$out = apply_filters( 'kama_pagenavi', $out );

	if( $rg->echo ) echo $out;
	else return $out;
}
/**
 * 2.7 (02.11.2018) - В $args можно указать второй параметр $wp_query, когда $args можно оставить пустым.
 *                  - Правки кода - исправил баги, переделал сбор элементов в массив.
 *                  - Новый хук `kama_pagenavi_elements`.
 * 2.6 (20.10.2018) - Убрал extract().
 *                  - Перенес параметры $before, $after, $echo в $args (старый вариант будет работать).
 * 2.5 - 2.5.1      - Автоматический сброс основного запроса.
 */

Настройки описаны прямо в коде и они идентичны настройкам wp-pagenavi, с той лишь разницей, что вместо текста "к последней странице" можно вывести номер последней страницы.

После того, как функция установлена и css стили перенесены, меняем в шаблоне код wp_pagenavi на этот:

<?php kama_pagenavi(); ?>

Если у вас в коде что-то вроде этого, то нужно поменять все wp_pagenavi на kama_pagenavi:

if(function_exists('wp_pagenavi')) {
	wp_pagenavi( '<center>', '</center>' );
}

CSS стили для кода

Выше я уже сказал. что классы CSS совпадают с wp-pagenavi. Для удобства выкладываю тут все CSS правила:

.wp-pagenavi{ margin:2em auto; text-align:center; }
.wp-pagenavi > *{ display:inline-block; padding:.0em .5em; margin:.1em; border:1px solid #93a8bc; border-radius:3px; color:#465366; }
.wp-pagenavi a,
	.wp-pagenavi a:hover{ text-decoration:none; }
.wp-pagenavi a{ background-color: #FFFFFF; }
.wp-pagenavi a:hover{ border-color:#7d95ac; }
.wp-pagenavi .pages{ }
.wp-pagenavi .current{ border-color:#465366; color: #465366; }
.wp-pagenavi .extend{ color: #465366; }
.wp-pagenavi .first{  }
.wp-pagenavi .last{  }
.wp-pagenavi .prev{ border-color:rgba(0,0,0,0); }
.wp-pagenavi .next{ border-color:rgba(0,0,0,0); }

В моем коде присутствуют 4 новых класса: first (в начало), last (в конец), prev (назад), next (вперед).

Неплохую подборку стилей можно взять здесь.

Если навигация выводится 2 раза

Так же, хочу обратить внимание тех, у кого навигация выводится 2 раза на странице (сверху и снизу цикла). Чтобы 2 раза не выполнять одни и те же операции по составлению навигации, логичнее сделать так: один раз собрать навигацию (использовать функцию), затем записать результат в переменную и второй раз просто вывести эту переменную. Выглядит это так:

// место, где первый раз нужно вывести навигацию
// получаем навигацию и записываем её в переменную
$navigation = kama_pagenavi('', '', false);
// выводим переменную на экран
echo $navigation; 

		/* Здесь идет вывод постов - цикл Loop */

// место, где второй раз нужно вывести навигацию.
//Так как навигация уже записана в переменную $get_navigation, её можно просто вывести на экран.
echo $navigation;

Обновления

17 декабря 2013
Версия 2.0. Подправил код, убрал лишние, ненужные вызовы функции get_pagenum_link(), за счет чего код стал работать гораздо быстрее, без потери качества.

11 мая 2010
Перенес ссылки назад/вперед, теперь так:
«назад «**к началу ... 11 12 13 14 15 16 17 18 ... в конец**» вперед»

Последний вариант функции наверху.

2 мая 2010

  1. Добавлены ссылки назад/вперед, пример:
    «**к началу «назад ... 11 12 13 14 15 16 17 18 ... вперед» в конец**»
    Их можно отключить (см. настройки).

  2. Убран баг такого типа:
    1 ... 2 3 4 5 6 7 8 ... 50 или 1 ... 21 22 23 24 25 26 27 28 ... 29
    То есть, где не нужно убраны тексты "до" и "после" навигации (в данном примере это троеточие).

Реверсивная пагинация для WordPress

Идея реверсивной (обратной) пагинации принадлежит sholo, который высказал её на известном нам форуме - mywordpress.ru. Мне стало интересно посмотреть, как это будет выглядеть и я немного переделал код.

Этот код основан на старой версии основного кода...

/* Альтернатива 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 ($backtext && $paged!=1) $out.= '<a href="'.get_pagenum_link(($paged-1)).'">'.$backtext.'</a>';

				if ($start_page >= 2 && $pages_to_show < $max_page) {
					$out.= '<a href="'.get_pagenum_link().'">'. ($first_page_text?$first_page_text:$max_page) .'</a>';
					if($dotright_text && $start_page!=2) $out.= '<span class="extend">'.$dotright_text.'</span>';
				}

				for($i = $start_page; $i <= $end_page; $i++) {
					if($i == $paged) {
						$out.= '<span class="current">'.($max_page-$i+1).'</span>';
					} else {

						$out.= '<a href="'.get_pagenum_link($i).'">'.($max_page-$i+1).'</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).'">'.($max_page-$i+1).'</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:1) .'</a>';
				}

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

		$out.= "</div>".$after."\n";
	if ($echo) echo $out;
	else return $out;
}
206 комментов
Полезные 7 Вопросы 3 Все
  • Николай

    Добрый день, Артур!
    Прекрасно работает пагинация, но.
    Можете подсказать, как сделать, чтобы при переходе в пагинации,
    на все страницы, кроме первой, исчезала часть контента в верху
    (слайдер и немного текста, дальше идет цикл для вывода записей.
    Слайдер не в хедере) и при переходе вновь на первую, главную страницу
    этот слайдер появлялся?

    Ответить3.7 года назад #
  • @ Alex

    Спасибо за работу - очень пригодилось для правки горбатой темы.

    Но есть один баг, разобраться самому не получилось:

    Если стоишь на второй странице поиска, то ссылка на первую будет такая:

    http://имя домена/?s=поисковое слово/

    в конце слеш (/) лишний. Поэтому выкидывает с страниц поиска. Как его убрать не знаю (

    Если стоишь на той же второй строке, то ссылка на первую стоку, используя кнопку(<<) будет совсем другая:

    http://имя домена/page/1/?s=поисковое слово

    И переход происходит нормально.
    Как убрать этот слеш в первом случае и

    Ответить3.6 года назад #
    • Kama7539

      Попробуйте заменить/дополнить функцию такой строкой:

      Было

          // создаем базу чтобы вызвать get_pagenum_link один раз
      	$link_base = get_pagenum_link( 99999999 ); // 99999999 будет заменено

      стало

          // создаем базу чтобы вызвать get_pagenum_link один раз
      	$link_base = get_pagenum_link( 99999999 ); // 99999999 будет заменено
      	$link_base = user_trailingslashit( $link_base );

      Отпишитесь что получилось, плз.

      Ответить3.6 года назад #
      • @ Alex

        Теперь слеш (/) на всех ссылках, при выборе любой страницы поиска
        (

        Ответить3.6 года назад #
        • Kama7539

          Обновил версию до 2.4, попробуйте её, там это поправил но надо проверить, отпишитесь плз.

          Ответить3.6 года назад #
          • @ Alex

            Отлично!
            Все теперь правильно.
            Спасибо!

            Ответить3.6 года назад #
          • Dzmitry Roshchyn pribylvseti.ru

            У меня норм работает! Благодарю за труды!

            Ответить3.5 года назад #
  • Павел company21age.ru

    Все хорошо, если не включен ЧПУ, при включении ЧПУ, пагинация отображается, но при переходе на вторую(или любую последущую) страницу пагинации ошибка 404. это наблюдается как в вашем коде, так и в pagenavi(((... что делать? kama_pagenavi('', '', 1, array(), $affiliate ); // выводим пагинацию - это тоже не помогло

    Ответить3.6 года назад #
  • Diana www.golosova.net/2014/04/russian-kulich....

    Здравствуйте

    из статьи не поняла, куда вставлять в какой файл, single.php или другие тоже, то в какие?

    Ответить3.4 года назад #
    • @ Виктор

      Diana, например <?php kama_pagenavi(); ?> надо вставить в index.php, category.php и archive.php. А большой массив кода, (который я даже боюсь сюда копировать) надо вставить в functions.php. Надеюсь, что про CSS вы сами догадаетесь. yes

      Ответить3.4 года назад #
  • @ Виктор

    Отличный материал! good Я сам только начал учить технику создания тем для WP. А если быть точнее, то сегодня ровно 15 дней laugh Эх жаль, что еще не скоро, я вот так как вы смогу разобрать плагин. Но все же, у вас отлично это выходит, и мне есть чему поучиться.

    Где тут можно подписаться? ))

    Ответить3.4 года назад #
    • Kama7539

      Где тут можно подписаться? ))

      В меню - О сайте - выдающий список смотрите...

      Ответить3.4 года назад #
  • Здравствуйте. Не работает, получаю 404 ошибку при переходе по ссылкам навигации, например, нужно вывести 3 поста на странице, ссылка на 2-ю страницу получается такой http://domen.ru/page/2/
    Получаю и вывожу записи так:

    $query = new WP_Query( $query_string . "category_name=news&posts_per_page=3");
    while ( $query->have_posts() ) { 
    					$query->the_post(); 
    					get_template_part( 'content', 'page' );
    				}

    Функцию вызываю так

    kama_pagenavi( '', '', true, array(), $query );

    Количество страниц отображается правильно, страницы выводятся, все вроде красиво, но 404 sad
    Если в настройках чтения в админке поставить тоже 3 записи, то ссылки работают, но ведь должно и без этого работать, как я понимаю? Что я делаю не так?

    Ответить3.3 года назад #
    • @ Алексей

      Попалась точно такая же ошибка. До чего дошел - ошибка возникает скорее всего при формировании самих ссылок. Из-за чего она возникает не понял, надо будет смотреть глубже. Самое простое решение - поставить в WP_Query запросе количество постов на странице равное в опцие по умолчанию в настройка WP (по умолчанию 10) или в настройки->чтение поставить количество постов равное вашему запросу. + На всякий пожарный при смене вывода постоянных ссылок не забудьте обновить .htaccess файл.

      Ответить2.9 года назад #
    • Kama7539

      Тут лучше использовать query_posts вместо WP_Query

      query_posts( $query_string . "category_name=news&posts_per_page=3");
      while( have_posts() ) { 
      	$query->the_post(); 
      	get_template_part( 'content', 'page' );
      }
      
      kama_pagenavi( '', '', true, array(), $query );
      
      wp_reset_query(); // вернем запрос обратно

      Дело в том, что в данном случае нужно перезаписать основной (глобальный) запрос...

      Ответить2.9 года назад #
      • @ Алексей

        Переписал глобальный запрос и словил следующий баг. При клике на следующие страницы 1- норм 2- норм 3 - страница не найдена. Все переменные posts_per_page заменены и ссылки на страницы выводятся но!. Такое ощущение, что при формировании ссылок на страницы все равно учитывается глобальная опция из админки (такое ощущение что ядро вп высчитывает сколько page может максимально выводится и пути эти для себя сохраняет, а все остальные пути которые формируются при пагинации тупо не учитываются т.к являются ссылками на несуществующие страницы). Пример: есть 15 постов - опция в админке по умолчанию 10 постов на страницу, меняем глобальный запрос и выводим по 5 постов, формируется 3 ссылки на страницы 1,2,3 но вп у себя записывает пути максимум к 2 страницам т.к. 15/10 = 2. Где можно проверить это поведение ВП?

        Ответить2.9 года назад #
        • Kama7539

          Вообще, по хорошему, этот запрос нужно менять через хук pre_get_posts, а на этой странице использовать обычный цикл...

          Или просто, убрать posts_per_page=3 и пусть выводит как установлено в настройках - так вам в разы проще будет...

          В данном случае, проблема в том, что при формировании запроса WP делает свой запрос, со своими настройками и если в URL указано получить 3-ю страницу, ВП со своими настройками пытается её получить, но её нет...

          А ваше posts_per_page срабатывает уже после того, как ВП определит для себя что это страница 404 ... Собственно до вашего кода в этом случае дело не доходит... Решение изменить поведение ВП на раннем этапе. Через хук pre_get_posts это можно сделать как раз, но там желательно понимать что делаешь...

          2
          Ответить2.9 года назад #
          • @ Алексей

            Спасибо за тычек носом в нужный хук. laugh

            Ответить2.9 года назад #
          • Roman527 forweb52.ru

            Спасибо! Очень помогли! Давно висела проблема вывода на главной например меньшего количества постов, чем в рубрике с рабочей пагинацией. thank_you

            1
            Ответить2.3 года назад #
  • Алексей codernote.ru

    Добрый день!
    Решил переделать себе тему на сайте, делаю пагинацию. Попробовал функцию the_posts_pagination() - работает только первая страница в формате: http://site.ru/novosti/ если перехожу на вторую (страновится адрес http://site.ru/novosti/page/2 ), то выдает 404 ошибку. Аналогичная проблема и с вашей функцией.
    Почитал комментарии и прихожу к выводу, что все таки виновато ЧПУ. Сейчас у меня стоит /%category%/%postname%/
    Не подскажите, как можно решить данную проблему? Спасибо!

    Ответить3.1 года назад #
    • Александр

      Алексей, добрый день! Как то решили вопрос с пагинацией!? Сам сижу с данной проблемой!

      Ответить3.1 года назад #
    • Kama7539

      У вас какой-то баг похоже. Смотрите в сторону дополнительных запросов query_posts() в теме.

      Ответить3.1 года назад #
      • Александр

        На странице с путями site.net/category/ пагинацыя работает без проблем, нажимаю на вторую страницу переходит на site.net/category/page/2/, перехожу в дочерний пост site.net/category/brend/ пагинацыя выводится, правильно считает страницы, правильно выводит количество постов на странице, но при нажатии на стр 2, оставляет на той же странице не меняется ни путь ни контент, как будто обновил страницу, глянул в код ссылка на кнопке "2" формируется правильно как и должна site.net/category/brend/page/2/, прописываю ее же вручную, все равно возвращает на страницу site.net/category/brend/ мне кажется с путями проблемка! Второй день парюсь сижу!

        Ответить3.1 года назад #
        • Александр

          Запросы делал как на query_posts так и на wp_query, результат идентичен!

          Ответить3.1 года назад #
        • @ campusboy3411 www.youtube.com/c/wpplus

          Возможно, ситуацию прояснит статья о том, почему не следует использовать query_posts() в WordPress.

          Ответить3.1 года назад #
          • Александр

            Ситуация меняется когда переключаю в настройках произвольные ссылки "произвольно" меняю на "простые" с простыми ссылками все работает и все в норме выводит! Это не выход для меня, буду рыть дальше, за статью спс, вычитал коечто новое для себя!

            Ответить3.1 года назад #
            • Черт, вот точно такая же беда прямо сейчас. Не могу понять. Все возможные варианты пагинации - этот, the_posts_pagination(), next_posts_link - везде переход на следующую страницу выдает 404.

              Ответить3.1 года назад #
              • Друзья, решил у себя добавлением .html к урлу в произвольных ссылках, теперь так - /%category%/%postname%.html

                Вот тут еще решение, но не пробовал

                Ответить3.1 года назад #
                • Александр

                  Добавил .html, не помогло, мне кажется WP не понимает или не может распознать путь который я ему задаю site.net/category/brend/page/2/ решил добавить правила в wp_rewrite, но добавление правила ничего не дало, буду искать плагин что б реализовать каталог товаров, но вопрос остается открытым, более чем уверен что столкнусь с ним еще в будущем!

                  Ответить3.1 года назад #
    • Саня

      Помогло в functions.php темы добавить:

      add_filter('request', 'codernote_request');
      add_action('pre_get_posts', 'codernote_pre_get_posts');
      function codernote_request($query_string ) {
        if ( isset( $query_string['page'] ) ) {
      	if ( ''!=$query_string['page'] ) {
      	  if ( isset( $query_string['name'] ) ) {
      		unset( $query_string['name'] ); }
      	  }
      	}
      	return $query_string;
      }
      
      function codernote_pre_get_posts( $query ) {
        if ( $query->is_main_query() && !$query->is_feed() && !is_admin() ) {
      	$query->set( 'paged', str_replace( '/', '', get_query_var( 'paged' ) ) );
        }
      }
      1
      Ответить3 года назад #
  • Dzmitry Roshchyn pribylvseti.ru

    Тимур спасибо за код. Установил на двух сайтах, всё хорошо пашет! Поковыряться со стилями надо, а так супер good

    1
    Ответить3 года назад #
  • Роман

    Здравствуйте, кто может помочь, проблема в пагинации, page/1/ , page/2/ и т.д.
    какую бы цыфру в конце не поставиш все ровно открывается страница, в чем может быть проблема ?

    Ответить2.7 года назад #
    • Kama7539

      Скорее всего где-то использовался query_posts() и не был сброшен запрос через wp_reset_query(), поэтому глоб. переменная испорчена, а на её базе работает этот код...

      Обновил код до версии 2,5 попробуй его...

      Елси не поможет ищи решине тут: Проблема с пагинацией

      Ответить2.7 года назад #
  • Владимир korvet2.ru

    Здравствуйте Тимур!
    Помогите, пожалуйста, в решении следующей проблемы.
    У меня в поиске Гугла (site:адрес блога) среди прочих страниц выдается 16 страниц пагинации, а 13 отсутствуют. Поясните, пожалуйста, как должно быть. Если должны быть все, то где искать проблему отсутствующих?
    Если должна быть только главная (а это первая страница пагинации), то, как удалить остальные?
    Спасибо.

    Ответить2.4 года назад #
    • Kama7539

      Вопрос к сеошникам... Я без понятия. Я вообще считаю, что в Гугле не должно быть ни одной страницы пагинации, ибо они - бестолковый-мусор... На этом сайте и на всех своих я их закрывают в robots.txt. Они нужны только для навигации и пользы как контент никакой не имеют, тогда зачем они в поиске? unknw

      2
      Ответить2.4 года назад #
Здравствуйте, !     Войти . Зарегистрироваться