WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Альтернатива плагину 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 Все
  • Андрей cайт: seogrom.ru/postranichnaya-navigaciya-wor...

    Спасибо за интересную и полезную статью!

    Ответить4.1 года назад #
  • @ Александр cайт: frostgamespro.org

    Привет Кама. Вывел записи с категории вот так. криво работает. Ссылку оставил. Посмотри пожалуйста.

    <?php query_posts('cat=4&showposts=12'); ?> 
      <?php while (have_posts()) : the_post(); ?>
    	<li><a  href="<?php the_permalink() ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
    	<a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a><br></p></li>
       <?php endwhile; ?>

    Ответить4 года назад #
    • @ campusboy3315 cайт: www.youtube.com/c/wpplus

      Тут вообще статья про вывод пагинации, а не по query_posts. После query_posts обязательно надо сбрасывать даннные к оригинальным, чтобы проблем не было. Читайте статью про query_posts на этом же сайте.

      1
      Ответить4 года назад #
      • @ Александр cайт: frostgamespro.org

        Спасибо. Уже решили проблему.

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

    А как сделать так, чтобы все ссылки выводились со слэшэм на конце? У меня в рубриках везде слэш на конце – хочу избавиться от лишних редиректов.

    Ответить3.7 года назад #
    • @ campusboy3315 cайт: www.youtube.com/c/wpplus

      В самом конце функции

      echo $out;

      замените на

      echo $out.'/';
      Ответить3.7 года назад #
  • Александр cайт: sdcvoy.ru

    Здравствуйте! Помогите, пожалуйста. Бьюсь уже 3 день. Установил ваш код, но дело не в этом. Когда нажимаю на кнопки пагинации у меня открывает шаблон index.php, но посты не открываются. Дело в том, что у меня 7 категорий, для каждой категории сделан свой шаблон. Я подозреваю, что в цикле Loop ему не откуда брать записи. Вот код:

    <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
    	   <article>
    	   <header><h2><?php the_title(); ?></h2><time pubdate><?php the_time('j M Y'); ?></time></header>
    	   <div class="avtor">Автор: <?php the_author(); ?></div>
    	   <?php if ( has_post_thumbnail() ) {   the_post_thumbnail();}  ?><?php the_excerpt(); ?>
    	 <footer><mark><?php the_tags(); ?> </mark><a href="<?php the_permalink(); ?>">Читать далее</a></footer>
    	 </article>      
    <?php endwhile; ?>
    <?php kama_pagenavi(); ?>
    <?php endif; ?>

    Все записи распределены по категориям т.е. имеют такой вид мой сайт/название категории/
    Когда перехожу на другую страничку с помощью пагинации открывается вот, что мой сайт/название категории/page/2/.
    И почему он ссылается на шаблон index.php когда мне надо на текущий с недостающими записями.

    Ответить3.6 года назад #
    • Александр cайт: sdcvoy.ru

      Что-то никто не ответил, я пока решения не нашел

      Ответить3.6 года назад #
    • Александр cайт: sdcvoy.ru

      Я решил проблему. Методом "танца с бубном". Короче, рассказываю. В админке в настройках Постоянных ссылок добавил префикс для рубрик category и во всех шаблонах изменил ссылки типа

      <a href="<?php bloginfo('url') ?>/optimization/" ></a>

      на

      <a href="<?php bloginfo('url') ?>/category/optimization/" ></a>

      И о чудо! Ссылка мой_сайт/{SLUG}/page/2/, которая не выводила пагинацию и нужный шаблон стала работать немного под другим именем мой_сайт/category/{SLUG}/page/2/ хотя по сути ничего не поменялось, видно в самом движке прописано как распознавать нужный шаблон (по умолчанию категории должны быть в категориях) Это я считаю недоработка движка. Вопрос решен можете закрывать тему.

      Ответить3.5 года назад #
  • @ campusboy3315 cайт: www.youtube.com/c/wpplus

    Долго сидел решал, что же в очередном шаблоне использоваться: the_posts_pagination или kama_pagenavi. Остановился на kama_pagenavi, так как редактировать под себя одно удовольствие (а возможно просто привычка)!

    Ответить3.6 года назад #
  • kulinarka cайт: БыковскаяУлица,29

    Здравствуйте, давно пользуюсь материалами и советами вашего сайта, за что огромное спасибо. Вот и сейчас решила сделать навигацию страниц, как вы советуете. Добавила все необходимое в файлы функций и стилей. Далее надо заменить на kama_pagenavi. У меня в индексном файле, архивах, поиске и категориях такая строчка , заменяю на nav-below на kama_pagenavi (это верно?). Когда иду по страницам категорий, то все нормально, на страницах поиска перед нумерацией написано "Страницы← Ctrl предыдущая следующая Ctrl →", а когда иду в архивы, то в нижней строке сайта ошибка "Fatal error: Call to undefined function wp_pagenavi() in /home/public_html/wp-content/functions.php on line 434". Подскажите, пожалуйста, что я делаю не так.

    Ответить3.6 года назад #
    • @ campusboy3315 cайт: www.youtube.com/c/wpplus

      Здравствуйте. В указаной строчке вызывается функия, которая нигде не определена, то есть вызывается, а нигде не указано, что она должна делать. Что у Вас на в этой строке?

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

    Здравствуйте.
    А как вывести пагинацию на странице произвольных записей?
    У меня создан произвольный тип записей, которые выводятся на кастомной странице циклом WP_Query:

    <?php $affiliate = new WP_Query( array( 'post_type' => 'affiliate', 'posts_per_page' => 2, 'orderby' => 'date' ) ); ?>
    		 <?php while ( $affiliate->have_posts() ) : $affiliate->the_post(); ?>
    
    					Тело записи
    
    		<?php endwhile; ?>
    		<?php wp_reset_postdata(); ?>
    		<?php kama_pagenavi(); ?>

    ставлю в конце цикла <?php kama_pagenavi(); ?> и ничего не выводится

    Ответить3.5 года назад #
    • Kama7452

      Она работает на базе глобальной $wp_query, надо её изменить под ваш вариант.

      Не уверен что функцию будет работать, я это не продумывал когда писал её, щас подправить время нет.

      Попробуйте так, есть вероятность что все будет работать:

      global $wp_query;
      $foo = $wp_query; // сохраняем
      $wp_query = $affiliate; // изменяем
      
      kama_pagenavi(); // выводим пагинацию
      
      $wp_query = $foo; // возвращаем
      1
      Ответить3.5 года назад #
      • @ Иван

        Отлично, заработало!
        Благодарю за оперативный ответ, спасибо smile

        Ответить3.5 года назад #
        • Kama7452

          Надо бы тогда переменную эту добавить в функцию, чтобы так не извращаться smile

          1
          Ответить3.5 года назад #
          • @ Иван

            А как это грамотней сделать?

            Ответить3.5 года назад #
            • Kama7452

              Обновил код до версии 2.3 вызывается так:

              kama_pagenavi('', '', 1, array(), $affiliate ); // выводим пагинацию
              1
              Ответить3.5 года назад #
  • @ Иван

    Снова здравствуйте.
    Пагинация работает без нареканий. Правда столкнулся с такой проблемой.
    Есть фильтр, который сортирует записи по алфавиту, по датам вверх-вниз, по рейтингу плагина WP-PostRatings. Все отлично сортирует, но при переходе на след. страницу сбрасывается сортировка на пункт по умолчанию.
    Вы не могли бы подсказать каким образом сделать так, чтобы сортировка не сбрасывалась? Надо как-то сделать так, чтобы выбранный пункт оставался на месте при переходе на другую страницу, не знаю куда копать)
    Вот код фильтра на всякий случай покажу:

    <?php
    $order = "orderby=date&order=DESC";
    $s2 = ' selected="selected"';
    if ($_POST['select'] == 'title') { $order = "orderby=title&order=ASC"; $s1 = ' selected="selected"'; $s2 = ''; }
    if ($_POST['select'] == 'newest') { $order = "orderby=date&order=DESC"; $s2 = ' selected="selected"'; }
    if ($_POST['select'] == 'oldest') { $order = "orderby=date&order=ASC"; $s3 = ' selected="selected"'; $s2 = ''; }
    if ($_POST ['select']== 'rating') { $order = "meta_key=ratings_average&orderby=meta_value&order=DESC"; $s5 = ' selected="selected"'; $s4 = ''; }
    ?>
    
    <form method="post" id="order" class="ordering-wrapper">
    <?php _e('Сортировать', 'article-directory'); ?>:
    <select name="select" onchange='this.form.submit()'>
    <option value="title"<?=$s1?>><?php _e('По названию', 'article-directory'); ?></option>
    <option value="newest"<?=$s2?>><?php _e('Новые вначале', 'article-directory'); ?></option>
    <option value="oldest"<?=$s3?>><?php _e('Старые вначале', 'article-directory'); ?></option>
    <option value="rating"<?=$s5?>>По рейтингу</option>
    </select>
    </form>
    
    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged'): 1;
    
    $affiliate = new WP_Query("post_type=affiliate&posts_per_page=3&paged=$paged" . "&" . $order);
    
    while ( $affiliate->have_posts() ) : $affiliate->the_post(); ?>
    
    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
    
    <?php kama_pagenavi('', '', 1, array(), $affiliate ); ?>
    Ответить3.5 года назад #
    • @ Иван

      Вобщем сам допер) т.к. я ни разу не программист для меня это серьезный прорыв)
      Меняем post на get в форме и в условиях.
      Таким образом в урл передаются параметры сортировки, и при переходе на следующую страницу выбор не сбрасывается.
      Также надо добавить в форму

      action="http://site.ru/page"

      Чтобы при выборе сортировке по другим значениям нас перекидывало на первую страницу, иначе останемся на той куда пролистали.

      1
      Ответить3.5 года назад #
  • Антон

    Добрый день, все сделал по инструкции, появилась навигация, но при нажатие на другую страницу грузятся записи которые были на первой странице, что не так?
    1-ой страницы адрес: test/специалисты, при нажатие на другие страницы test/специалисты/page/2

    $page_index = new WP_Query(array( 'post_type' => array('page'), 'meta_key' => 'специалист', 'orderby' => 'menu_order', 'order' => 'ASC',));
    <?php if ( $page_index->have_posts() ) : while ( $page_index->have_posts() ) : $page_index->the_post(); ?>
    Текст
    <?php endwhile; ?>
    <?php endif; ?>
    
    <?php kama_pagenavi('', '', 1, array(), $page_index );  ?>
    1
    Ответить3.5 года назад #
    • Roman527 cайт: forweb52.ru

      Тоже сначало не работало, так же как и у вас. Нужно передавать параметр paged в WP_Query. Так примерно:

      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      $args = array(
      	//тут ваши параметры
      	'paged'=> $paged,
      );

      Думаю поможет кому нибудь. А то тоже по началу не понял, почему не работает.

      1
      Ответить2 года назад #
  • Уникальный у вас сайт. Приятно тут проводить время в море полезной информации.

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