Пагинация для одиночного поста WordPress (Содержимое поста)

[pag-test].

В этом случае разбиение происходит только на первой странице. Дело в том, что тег <!--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'      => '',
    'link_before' => '',
    'link_after'  => '',
    'pagelink'    => '' . __( 'Страница', 'twentyfifteen' ) . ' %',
    'separator'   => ', ',
) );

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

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

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

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

Вот примеры, как можно использовать эти глобальные переменные внутри цикла:

Проверка пагинации поста

Пример 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']}";
    }
}

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

Стандартные функции WordPress 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) на страницы и помещает эти данные в глобальную переменную $pages.

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

И теперь все хуки the_content применяются только к выбранной части содержимого поста (а не ко всему содержимому поста).

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *