Пагинация для контента записи 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 применяются к выбранной части пагинации контента, а не ко всему контенту.