Пагінація для контенту запису 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>',
)));


Глобальні змінні

Коли потрібно перевірити чи розбитий пост на сторінки, скільки всього сторінок, отримати контент конкретної сторінки і т.д. Можна користуватися глобальними змінними, які визначаються всередині 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 get_the_content() повертають лише частину контенту підходящу під поточну сторінку пагінації.

Якщо незважаючи на поділ тексту потрібно вивести весь текст, можна скористатися таким хаком:

global $post;

$content = apply_filters( 'the_content', $post->post_content );
echo $content;


Як це працює

При виклику функції generate_postdata($post) . Цей метод, серед іншого, розбиває поточний контент запису ( $post->post_content) на сторінки та кладе ці дані на глобальну змінну global $pages.

Потім під час виклику функції get_the_content() використовується глобальна змінна global $pagesз якої вибирається поточний контент (поточна сторінка пагінації).

І тепер усі хуки the_content застосовуються до вибраної частини пагінації контенту, а не до всього контенту.

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *