WordPress как на ладони
wordpress jino

wp_link_pages() WP 0.71

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

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

nextpage2

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

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

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

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

Строку. 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 WP 4.8.2

<?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вязанные функции

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

wp_link_pages 14 комментариев
  • 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

    Ответить6 лет назад #
    • Kama4464

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

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

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

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

      Ответить2.1 года назад #
  • asha

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Ответить3.6 года назад #
      • 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 и показываем поисковикам язык.

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

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

  • А как сделать, что бы выводились и стрелочки вперед/назад и цифры? Почему нет комбинированного варианта для парамета 'next_or_number'? smile

    Ответить27 дней назад #
    • Отвечу сам, что бы не отвлекать уважаемого 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
      Ответить27 дней назад #
      • Kama4464

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

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

        Ответить27 дней назад #

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

Ваш комментарий