WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

wp_link_pages() WP 0.71

Выводит ссылки навигации по страницам, для многостраничных постов (для разделения используется <!--nextpage-->, один или более раз в контенте).

Чтобы функция работала, нужно разделить контент записи html комментариями <!--nextpage-->. После этого функция разобьет контент на страницы. Страниц получиться столько, сколько раз был вставлен разделитель <!--nextpage--> + одна страница.

nextpage2

Пагинация по контенту страницы.

Этот Тег шаблона нужно использовать на отдельной странице. Условно можно сказать, что нужно использовать внутри Цикла WordPress.

Для быстрой вставки <!--nextpage--> в визуальном редакторе, используйте комбинацию клавиш: alt + shift + p.

Чтобы узнать находимся ли мы на странице пагинации, используйте функцию is_paged().

Хуки из функции:
Возвращает

Строку/null. Если параметр echo=true, то вернет null и выведет результат на экран. Если echo=false, то вернет строку - HTML код для обработки.

Использование

<?php wp_link_pages( $args ); ?>

Параметры по умолчанию

$args = array(
	'before'           => '<p>' . __('Pages:'),
	'after'            => '</p>',
	'link_before'      => '',
	'link_after'       => '',
	'next_or_number'   => 'number',
	'nextpagelink'     => __('Next page'),
	'previouspagelink' => __('Previous page'),
	'pagelink'         => '%',
	'echo'             => 1,
); 

wp_link_pages( $args );
$args(строка/массив)
Параметры функции, передаваемые в виде массива или строки.

Аргументы параметра $args

before(строка)
Текст, который будет находится перед ссылками.
По умолчанию: '<p>Pages: '
after(строка)
Текст, который будет находится после ссылок.
По умолчанию: '</p>'
link_before(строка)
Текст, который будет до каждой ссылки. С версии 2.7.
По умолчанию: ''
link_after(строка)
Текст, который будет после каждой ссылки. С версии 2.7.
По умолчанию: ''
next_or_number(строка)
Переключатель, определяющий нужно ли показывать ссылки как номера всех страниц (number) или показать две ссылки навигации: "вперед", "назад". Может быть: number или next.
По умолчанию: 'number'
nextpagelink(строка)
Текст ссылки "следующая страница".
По умолчанию: 'Next page'
previouspagelink(строка)
Текст ссылки "предыдущая страница".
По умолчанию: 'Previous page'
pagelink(строка)
Формат текста ссылок. % будет заменено на число, так "Страница %" выведет ссылки с текстом: "Страница 1", "Страница 2" и т.д.
По умолчанию: '%'
echo(логический)
Выводить на экран (1) или возвращать для обработки (0).
По умолчанию: 1 (true)

Примеры

#1 Базовое использование

Выведем навигацию по страницам с параметрами по умолчанию, т.е. в теге <p>, с использованием постраничных ссылок (страница 1, страница 2) и ссылок навигации "назад", "вперед".

<?php wp_link_pages(); ?>

#2 Добавление кнопки разрыва страницы в Виз.Редактор TyniMCE

Такая кнопка предусмотрена WordPress но она не выводиться. Поэтому все что нам нужно сделать - это через хук добавить в массив название этой кнопки, остальное WP сделаем сам... Для этого нужно вставить такой код в functions.php темы:

## Добавление кнопки разрыва страницы в Виз.Редактор TyniMCE
add_filter('mce_buttons', 'mce_page_break');
function mce_page_break( $mce_buttons ){
	$pos = array_search('wp_more', $mce_buttons, true);

	if( $pos !== false ) {
		$buttons = array_slice( $mce_buttons, 0, $pos );
		$buttons[] = 'wp_page';
		$mce_buttons = array_merge( $buttons, array_slice($mce_buttons, $pos) );
	}

	return $mce_buttons;
}

В результате получим такую кнопку:

Кнопка "Следующая страница" в визуальном редакторе WordPress
Кнопка "Следующая страница" в визуальном редакторе WordPress

#3 Обернем ссылки в тег <div> и изменим текст каждой ссылки на "страница №":

<?php wp_link_pages('before=<div id="page-links">&after=</div>&pagelink=page %'); ?>

Альтернатива wp_link_pages

Навигация как в pagenavi. Когда нужно сделать навигацию как в этой статье, то вот код переделанный для страниц:

/**
 * Альтернатива wp_link_pages
 * ver: 1.0
 */
function kama_link_pages(){

	## Настройки ================
	$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 $page, $numpages;

	$paged    = (int) $page;
	$max_page = $numpages;

	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 = '<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.= _wp_link_page($paged-1) . $backtext .'</a>';

		if( $start_page >= 2 && $pages_to_show < $max_page ) {
			$out .= _wp_link_page(1) . ( $first_page_text ?: 1 ) .'</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">'. $i .'</span>';
			else
				$out .= _wp_link_page($i) . $i .'</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 .= _wp_link_page($i) . $i .'</a>';
				}
			}
		}

		if( $end_page < $max_page ) {
			if( $dotright_text && $end_page != ($max_page-1) )
				$out.= '<span class="extend">'. $dotright_text2 .'</span>';
			$out .= _wp_link_page($max_page) . ( $last_page_text ?: $max_page ) .'</a>';
		}

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

	$out .= '</div>';

	return $out;
}

После того, как вставили код в файл темы functions.php вызываем функцию так:

<?php echo kama_link_pages(); ?>

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

Код wp_link_pages: wp-includes/post-template.php VER 5.0

<?php
function wp_link_pages( $args = '' ) {
	global $page, $numpages, $multipage, $more;

	$defaults = array(
		'before'           => '<p>' . __( 'Pages:' ),
		'after'            => '</p>',
		'link_before'      => '',
		'link_after'       => '',
		'next_or_number'   => 'number',
		'separator'        => ' ',
		'nextpagelink'     => __( 'Next page' ),
		'previouspagelink' => __( 'Previous page' ),
		'pagelink'         => '%',
		'echo'             => 1
	);

	$params = wp_parse_args( $args, $defaults );

	/**
	 * Filters the arguments used in retrieving page links for paginated posts.
	 *
	 * @since 3.0.0
	 *
	 * @param array $params An array of arguments for page links for paginated posts.
	 */
	$r = apply_filters( 'wp_link_pages_args', $params );

	$output = '';
	if ( $multipage ) {
		if ( 'number' == $r['next_or_number'] ) {
			$output .= $r['before'];
			for ( $i = 1; $i <= $numpages; $i++ ) {
				$link = $r['link_before'] . str_replace( '%', $i, $r['pagelink'] ) . $r['link_after'];
				if ( $i != $page || ! $more && 1 == $page ) {
					$link = _wp_link_page( $i ) . $link . '</a>';
				}
				/**
				 * Filters the HTML output of individual page number links.
				 *
				 * @since 3.6.0
				 *
				 * @param string $link The page number HTML output.
				 * @param int    $i    Page number for paginated posts' page links.
				 */
				$link = apply_filters( 'wp_link_pages_link', $link, $i );

				// Use the custom links separator beginning with the second link.
				$output .= ( 1 === $i ) ? ' ' : $r['separator'];
				$output .= $link;
			}
			$output .= $r['after'];
		} elseif ( $more ) {
			$output .= $r['before'];
			$prev = $page - 1;
			if ( $prev > 0 ) {
				$link = _wp_link_page( $prev ) . $r['link_before'] . $r['previouspagelink'] . $r['link_after'] . '</a>';

				/** This filter is documented in wp-includes/post-template.php */
				$output .= apply_filters( 'wp_link_pages_link', $link, $prev );
			}
			$next = $page + 1;
			if ( $next <= $numpages ) {
				if ( $prev ) {
					$output .= $r['separator'];
				}
				$link = _wp_link_page( $next ) . $r['link_before'] . $r['nextpagelink'] . $r['link_after'] . '</a>';

				/** This filter is documented in wp-includes/post-template.php */
				$output .= apply_filters( 'wp_link_pages_link', $link, $next );
			}
			$output .= $r['after'];
		}
	}

	/**
	 * Filters the HTML output of page links for paginated posts.
	 *
	 * @since 3.6.0
	 *
	 * @param string $output HTML output of paginated posts' page links.
	 * @param array  $args   An array of arguments.
	 */
	$html = apply_filters( 'wp_link_pages', $output, $args );

	if ( $r['echo'] ) {
		echo $html;
	}
	return $html;
}

Cвязанные функции

Из раздела: Страницы

Еще из тегов шаблона: Записи: посты, страницы, ...

21 коммент
Полезные 1 Вопросы 1 Все
  • asha

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

    Подскажите, пожалуйста, как настроить ЧПУ при использовании функция wp_link_pages()

    Структура ссылок моего сайта: /%category%/%postname%.html
    И соответственно получаются ссылки:

    http://домен/рубрика/статья.html/2
    http://домен/рубрика/статья.html/3 и т.д.

    Очень бы хотелось найти решение (ищу, к сожалению, безрезультатно уже давно), например:
    http://домен/рубрика/статья-2.html
    http://домен/рубрика/статья-3.html и т.д.
    или
    http://домен/рубрика/статья/2.html
    http://домен/рубрика/статья/3.html и т.д.
    А также сохранить структуру ссылок /%category%/%postname%.html

    Буду очень рада любой помощи. smile

    Ответить7.2 лет назад #
    • Kama7099

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

      Вообще было бы логично просто убрать .html и все бы стало выглядеть очень даже нормально. Попробуйте изменить ЧПУ (убрать .html) и проверьте, чтобы старые с .html редиректились на новые. В WP подобный редирект должен делаться автоматически.

      Ответить7.2 лет назад #
    • Netscout

      Здравствуйте !
      Скажите, пожалуйста - Вам удалось побороть эту проблему с адресами подстраниц ?
      Столкнулся с такой-же задачей и не знаю с какой стороны подойти к её решению.

      -1
      Ответить3.2 года назад #
  • asha

    Да тут баг на баге!!! Если url оставить в покое…, то title имеют одинаковое содержание.
    Есть правда решение проблемы с дублированными заголовками ... , но с плагином All in One SEO это не работает.
    Вот и получается, чтобы разбить нормально страницу надо отключить:
    1) плагин All in One SEO (отказаться от SEO);
    2) изменить структуру постоянных ссылок /%category%/%postname% (убрать .html) и
    3) исправить дублирование заголовков.
    И останется сайт без SEO, но с навигацией по страницам постаnea. Прискорбно все это, а функцию wp_link_pages для обычных юзеров в топку…
    Плагин с исправлением всего выше перечисленного нужен людям не только в рунете… Работа стоит денег. Возьметесь?

    Ответить7.1 лет назад #
    • Антон

      убрать .html
      Господи, 2016 год на дворе.. зачем вам вообще был нужен этот .html? Кроме лишних символов, засоряющих url, наличие или отсутствие этой подстроки вообще никакой роли не играет.

      3) исправить дублирование заголовков.
      По-хорошему, в заголовок должно добавляться что-то вроде "... -- Страница X", а это уже не дублирование заголовка. Не знаю, как это работает в All in One SEO, есть замечательный плагин Yoast SEO, в нём, я думаю, нет такой проблемы.

      Работа стоит денег. Возьметесь?
      Не вижу никаких сложностей обратиться на биржу фриланса, где вам с радостью сделают, как вам надо.

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

    Меня немного не устраивает расположение вот это навигации. наверно это нужно в css изменить?только в css у меня этого нету,самому прописать надо?

    Ответить7 лет назад #
  • Val

    Тимур, есть ли возможность выдернуть переменную $i из цикла и запихнуть ее в title через функцию the_title()?

    Как-нибудь на подобии:

    <title><?php the_title('', 'Страница - $i'); ?></title>

    Ну или что-нить в этом роде?

    С уважением...

    Ответить4.8 года назад #
    • Kama7099

      Нет так не получится. no Заголовок уже выведен и после этого срабатывает функция пагинации... Тут надо отдельно заголовок менять... В массиве $wp_query есть параметр page в, на основе него можно... Подробнее не подскажу. sorry

      Ответить4.8 года назад #
      • Val

        Тимур, спасибо за наводку, собственно вот код, может кому пригодится:

        function my_title(){
        	global $wp_query;
        
        	if( $ptit = $wp_query->query_vars['page'] )
        		echo get_the_title() . ' | Страница - '.$ptit;
        	else 
        		the_title();
        }

        в header.php меняем the_title(); на my_title и показываем поисковикам язык.

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

    Здравствуйте. Подскажите, как сделать для данных ссылок rel nofollow, чтоб не было дублей контента, так как яндекс к примеру их индексирует и выводит в поиск.

    Ответить1.5 год назад #
    • Kama7099
      $links = wp_link_pages( [ 'echo'=>0 ] );
      $links = str_replace('<a ','<a rel="nofollow" ', $links );
      1
      Ответить1.5 год назад #
  • А как сделать, что бы выводились и стрелочки вперед/назад и цифры? Почему нет комбинированного варианта для парамета 'next_or_number'? smile

    Ответить1.1 год назад #
    • Отвечу сам, что бы не отвлекать уважаемого wp-kama от более важных дел (на других страницах я задал более сложные вопросы, на которые пока что никто не смог дать ответ) smile
      В файле functions.php нужно вставить код:

      add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');
      
      function wp_link_pages_args_prevnext_add($args)
      {
      	global $page, $numpages, $more, $pagenow;
      	if (!$args['next_or_number'] == 'next_and_number') 
      		return $args; # exit early
      	$args['next_or_number'] = 'number'; # keep numbering for the main part
      	if (!$more)
      		return $args; # exit early
      	if($page-1) # there is a previous page
      		$args['before'] .= _wp_link_page($page-1)
      			. $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
      		;
      	if ($page<$numpages) # there is a next page
      		$args['after'] = _wp_link_page($page+1)
      			. $args['link_before'] . $args['nextpagelink'] . $args['link_after'] . '</a>'
      			. $args['after']
      		;
      	return $args;
      }

      (подсмотрел на англоязычном форуме)

      1
      Ответить1.1 год назад #
      • Kama7099

        Спасибо за код. Хорошо бы еще к нему скрин для наглядности, как это выглядит в итоге...

        П.С. Вчера добавил возможность загружать картинки к комментам...

        Ответить1.1 год назад #
  • Анастасия

    Добрый вечер!
    Подскажите пожалуйста добрые люди, как добавить атрибут class="page-link" к ссылкам, надо чтоб так было <a class="page-link" href="#">1</a>

    • Анастасия

      Вставляем такую строчку перед return $out;

      $out = str_replace( '<a', '<a class="page-link"', $out );
      1
  • Намор

    Добрый вечер!
    Как разделить страницы и прописать заголовки каждому разделу для <!--nextpage--> как в примере в теге <p> ниже в html коде.

    Вместо нумерации для title страниц использовал это решение https://wordpress.stackexchange.com/questions/202709/how-to-give-paged-links-custom-title/295994#295994

    осталось проделать заголовки/название каждой рубрики для <!--nextpage-->.

    <div class="postlink">
    <p style="text-align: center;">Outstanding country musicians</p>
    
    <a rel="nofollow" href="https://domen.com/linkpost/2/"> Dolly Rebecca Parton </a>
    <a rel="nofollow" href="https://domen.com/linkpost/3/"> Troyal Garth Brooks </a>
    <a rel="nofollow" href="https://domen.com/linkpost/4/"> Waylon Jennings </a>
    <a rel="nofollow" href="https://domen.com/linkpost/5/"> George Glenn Jones </a>
    
    <p style="text-align: center;">Outstanding actors</p>
    
    <a rel="nofollow" href="https://domen.com/linkpost/6/"> Charlie Chaplin </a>
    <a rel="nofollow" href="https://domen.com/linkpost/7/"> Buster Keaton </a>
    <a rel="nofollow" href="https://domen.com/linkpost/8/"> Harold Clayton Lloyd </a>
    
    <p style="text-align: center;">Outstanding footballers</p>
    
    <a rel="nofollow" href="https://domen.com/linkpost/9/"> Diego Armando Maradona /a>
    <a rel="nofollow" href="https://domen.com/linkpost/10/"> Pelé </a>
    <a rel="nofollow" href="https://domen.com/linkpost/11/"> Zinedin Zidan </a>
    </div>

    Зарание благодарен

    1
  • BigDimoz15 cайт: pribylvseti.ru

    Тимур, здравствуй! Такой вопрос, немного не по теме, но рядом. Вот разбил я большой пост на много страниц, стали люди комментировать, и вот какое дело. Все комментарии выводятся на каждой из страниц поста, а можно ли сделать, чтобы комментарии выводились только на последней старнице. Мне кажется так логичней ведь будет, ладно бы комментарий оставленный, допустим, на странице № 3 к ней и привязывался, но когда вся куча на каждой странице, это слишком.

    • Kama7099

      Вот тут почитай. Чтобы на последний странице выводить, нужно заюзать такой код:

      if( !empty($GLOBALS['numpages']) && get_query_var('page') == $GLOBALS['numpages'] ){
      	// последняя страница пагинации записи
      }

      Код не проверял...

      • BigDimoz15 cайт: pribylvseti.ru

        Применил код, но комментарии всё равно выводятся на каждой странице пагинации записи. no

  • BigDimoz15 cайт: pribylvseti.ru

    Вопрос. Как проще всего сделать только две ссылки, ведущие на следующую и предыдущую страницу (например, "Вперёд" и "Назад"), и всё! Кручу, верчу и никак не получается.

Здравствуйте, !     Войти . Зарегистрироваться