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

Пагинация для контента записи WordPress

Не все знают, что в WordPress отдельную запись или страницу можно разбить на несколько частей, организовав таким образом пагинацию для записи (поста). Для этого в контенте нужно использовать шоткод <!--nextpage-->. Такой код будет делить текст записи на несколько страниц. И URL, например, второй страницы будет выглядеть так: http://wptest.ru/privet-mir/2/

Эта возможность пригодится тем, кто планирует размещать объемные записи, с большим количеством картинок или текста, когда удобно разбить такое длинное полотно на части (подстраницы).

Смотрите также описание связанной функции: wp_link_pages().

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

Такая пагинация используется не часто, поэтому в стандартном WordPress редакторе (TinyMCE) нет кнопки для такой разбивки на страницы. Разбивка достигается путем вставки следующего html-кода в текстовом редакторе в нужном месте:

<!--nextpage-->

Или нажатием комбинации клавиш Shift + Alt + P в визуальном редакторе, в код при этом будет вставлен такой же HTML комментарий: <!--nextpage-->.

После вставки такого тега (кода-разделителя) на странице во фронт-энде сайта появится пагинация (вид зависит от оформления темы):

А каждая страница пагинации будет иметь следующие URL:

  • http://wptest.ru/privet-mir/2/
  • http://wptest.ru/privet-mir/3/

<!--nextpage--> Не работает внутри шорткодов:

Тег не будет работать, если использовать его в коде шорткода. Например:

Опубликовал страничку:

<p>Проверка разбиения на страницы</p>

<!--nextpage-->

[pag-test]

При этом внутри [pag-test] тоже вставляется <!--nextpage-->.

Разбиение на страницы ожидаемо происходит только в первом месте.

Дело тут в том, что тэг <!--nextpage--> обрабатывается в самом начале обработки данных поста, еще до выполнения каких либо хуков, а шорткоды обрабатываются на хуке. Т.е. когда шорткод встраивается в контент, теги <!--nextpage--> в нём уже не обрабатывается, потому что они уже были обработаны ранее, подробнее см. ниже.

меню

Добавление кнопки в визуальный редактор

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

Для добавления соответствующей кнопки в редактор WordPress, нужно добавить небольшой фрагмент кода в 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 + 1 );
		$buttons[]   = 'wp_page';
		$mce_buttons = array_merge( $buttons, array_slice($mce_buttons, $pos + 1) );
	}
	return $mce_buttons;
}

После этого в редакторе появится новая кнопка:

Кнопка для вставки тега разбиения страницы

Того же результата можно достичь установкой плагина TinyMCE Page Break Button

меню

Поддержка темы

Обратите внимание, что вывод страниц или записей с пагинацией предусмотрен не всеми WordPress темами.

Соответствующий файл шаблона вашей темы после вывода контента страницы должен содержать функцию wp_link_pages():

wp_link_pages( array(
	'before'      => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentyfifteen' ) . '</span>',
	'after'       => '</div>',
	'link_before' => '<span>',
	'link_after'  => '</span>',
	'pagelink'    => '<span class="screen-reader-text">' . __( 'Page', 'twentyfifteen' ) . ' </span>%',
	'separator'   => '<span class="screen-reader-text">, </span>',
) );

Глобальные переменные

Когда нужно проверить разбит ли пост на страницы, сколько всего страниц, получить контент конкретной страницы и т.д. Можно пользоваться глобальными переменными, которые определяются внутри цикла WordPress, функцией setup_postdata(), которая в свою очередь вызывается либо напрямую, либо через функцию the_post().

Список таких глобальных переменных внутри цикла:

$page(число)
Страница текущей записи, когда пост разделен на страницы с помощью тега <!--nextpage-->.
$pages(массив)
Контент страниц текущей записи (поста). Каждая страница тут разделяется с помощью тега <!--nextpage-->.
$multipage(логический)
Определяет разделяется ли текущая запись на страницы с помощью тега <!--nextpage-->. Содержит true или false.
$numpages(число)
Количество страниц, если запись разделена на страницы с помощью тега <!--nextpage-->.

С помощью этих глобальных переменных можно делать такие проверки, внутри цикла:

меню

# Проверка разделения записи на страницы

Взято из описания is_paged()

Пример 1

$paged = $wp_query->get( 'page' );

if ( $paged < 2 ){
	// Это первая страница или пост не разделен на страницы
}
else {
	// Это 2,3,4 ... страница разделенного поста.
}

Пример 2

$paged = get_query_var( 'page' ) ?: false;
if ( $paged < 2 ){
	// Пост не разделен на страницы или это не первая страница.
}
else {
	// Это 2,3,4 ... страница разделенного поста.

}

Пример 3

Проверим разделен ли пост на страницы вообще...

the_post();

if( !empty($GLOBALS['multipage']) ){
	// запись разделена на страницы
}

Узнаем сколько страниц у записи

the_post();

if( !empty($GLOBALS['numpages']) ){
	if( $GLOBALS['numpages'] === 1 ){
		// запись разделена на страницы
	}
	else {
		// запись разделена на страницы
		echo "Кол-во страниц {$GLOBALS['numpages']}";
	}
}
меню

Как это работает

При вызове функции the_post() или setup_postdata( $post ) срабатывает метод generate_postdata( $post ). Этот метод, среди прочего, разбивает текущий контент записи ($post->post_content) на страницы и кладет эти данные в глобальную переменную global $pages.

Затем при вызове функции the_content() или get_the_content() используется глобальная переменная global $pages из которой выбирается текущий контент (текущая страница пагинации).

И теперь все хуки the_content применяются к выбранной части пагинации контента, а не ко всему контенту.

7 комментов
    Войти