Пагинация для контента записи WordPress
Не все знают, что в WordPress отдельную запись или страницу можно разбить на несколько частей, организовав таким образом пагинацию для записи (поста). Для этого в контенте нужно использовать шоткод <!--nextpage-->. Такой код будет делить текст записи на несколько страниц. И URL, например, второй страницы будет выглядеть так: http://example.com/privet-mir/2/
Эта возможность пригодится тем, кто планирует размещать объемные записи, с большим количеством картинок или текста, когда удобно разбить такое длинное полотно на части (подстраницы).
Смотрите также описание связанной функции: wp_link_pages().
Использование тега nextpage
Такая пагинация используется не часто, поэтому в стандартном WordPress редакторе (TinyMCE) нет кнопки для такой разбивки на страницы. Разбивка достигается путем вставки следующего html-кода в текстовом редакторе в нужном месте:
<!--nextpage-->
Или нажатием комбинации клавиш Shift + Alt + P в визуальном редакторе, в код при этом будет вставлен такой же HTML комментарий: <!--nextpage-->.
После вставки такого тега (кода-разделителя) на странице во фронт-энде сайта появится пагинация (вид зависит от оформления темы):
А каждая страница пагинации будет иметь следующие URL:
- http://example.com/privet-mir/2/
- http://example.com/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']}";
}
}
Как получить весь контент страницы разделенной на под-страницы
Стандартные функции WP the_content() и get_the_content() возвращают только часть контента подходящую под текущую страницу пагинации.
Если несмотря на разделение текста нужно вывести весь текст, то можно воспользоваться таким хаком:
global $post; $content = apply_filters( 'the_content', $post->post_content ); echo $content;
Как это работает
При вызове функции the_post() или setup_postdata( $post ) срабатывает метод generate_postdata( $post ). Этот метод, среди прочего, разбивает текущий контент записи ($post->post_content) на страницы и кладет эти данные в глобальную переменную global $pages.
Затем при вызове функции the_content() или get_the_content() используется глобальная переменная global $pages из которой выбирается текущий контент (текущая страница пагинации).
И теперь все хуки the_content применяются к выбранной части пагинации контента, а не ко всему контенту.
