Почему может понадобиться отключить пагинацию на отдельных страницах WordPress
Пагинация — важный элемент навигации, который помогает разбивать длинные списки постов или товаров на удобные для восприятия части. Однако в ряде случаев требуется отключить пагинацию для отдельных страниц или архивов. Например, если на странице выводится кастомный контент, где пагинация не нужна, или если заказчик хочет показать полный список товаров без разбивки.
Также отключение пагинации помогает улучшить пользовательский опыт, если контент небольшой или если есть технические ограничения, связанные с пагинацией на конкретных страницах.
В этой статье мы рассмотрим, как отключить пагинацию в WordPress для отдельных страниц или архивов, используя как код, так и плагины. Примеры будут полезны разработчикам и продвинутым пользователям.
Как WordPress реализует пагинацию: основные моменты
Чтобы понять, как отключить пагинацию, важно разобраться, как она работает в WordPress. Обычно пагинация реализуется через параметры запроса, например paged или page, и функцию paginate_links() или the_posts_pagination(), которая выводит ссылки на страницы.
В зависимости от темы, пагинация может отображаться в шаблонах archive.php, index.php, category.php и других. Чтобы отключить пагинацию, можно изменить параметры запроса перед выполнением основного цикла, либо убрать вызовы пагинации в шаблонах.
Также пагинация может управляться через WP_Query — если вы создаёте кастомный запрос, то стоит контролировать параметр posts_per_page и paged.
Отключение пагинации для конкретных страниц через functions.php
Самый гибкий способ — фильтровать параметры запроса с помощью хука pre_get_posts. Рассмотрим пример, где пагинация отключается для страницы с ID 42, показывая все посты на одной странице:
function wppagenavi_disable_pagination_for_page( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
if ( is_page( 42 ) ) { // Замените 42 на ID вашей страницы
$query->set( 'posts_per_page', -1 ); // Выводим все записи без пагинации
$query->set( 'paged', 1 ); // Сбрасываем пагинацию
}
}
}
add_action( 'pre_get_posts', 'wppagenavi_disable_pagination_for_page' );Этот код проверяет, что запрос — главный и что мы на нужной странице, затем снимает ограничения по количеству постов и сбрасывает страницу пагинации. В результате все записи будут выведены на одной странице без разбивки.
Если у вас кастомный тип записей, например product, и нужно отключить пагинацию на архиве этого типа, добавьте проверку $query->is_post_type_archive( 'product' ).
Удаление вывода пагинации в шаблонах тем
Даже если вы отключили пагинацию в запросе, в шаблонах темы могут оставаться вызовы функций вывода пагинации, например:
the_posts_pagination()paginate_links()previous_posts_link()иnext_posts_link()
Чтобы полностью убрать пагинацию, нужно условно скрыть эти функции в шаблонах. Например, в файле archive.php можно обернуть вызов пагинации в условие:
if ( !is_page( 42 ) ) {
the_posts_pagination();
}Или добавить дополнительную проверку в функцию вывода пагинации в functions.php через фильтры.
Использование плагинов для управления пагинацией
Если вы не хотите править код вручную, можно использовать плагины, которые позволяют гибко настраивать пагинацию.
Например, плагин WP-PageNavi позволяет заменить стандартную пагинацию на более удобную. В его настройках можно отключить пагинацию на отдельных страницах через фильтры.
Для отключения пагинации с помощью WP-PageNavi можно добавить следующий фильтр в functions.php:
function wppagenavi_disable_wp_pagenavi_on_page( $args ) {
if ( is_page( 42 ) ) {
return false; // Отключаем пагинацию плагина WP-PageNavi
}
return $args;
}
add_filter( 'wp_pagenavi', 'wppagenavi_disable_wp_pagenavi_on_page' );Таким образом, вы можете комбинировать отключение пагинации на уровне запроса и на уровне вывода.
Отключение пагинации для категорий и архивов по условию
Иногда требуется отключить пагинацию не только для страниц, но и для определённых категорий или архивов.
Например, отключим пагинацию для категории с ID 5:
function wppagenavi_disable_pagination_for_category( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
if ( is_category( 5 ) ) {
$query->set( 'posts_per_page', -1 );
$query->set( 'paged', 1 );
}
}
}
add_action( 'pre_get_posts', 'wppagenavi_disable_pagination_for_category' );И не забудьте убрать вызовы пагинации в шаблонах, если они есть.
Подводные камни и рекомендации
Отключение пагинации увеличивает количество выводимых записей на одной странице. Если записей очень много, это может негативно сказаться на скорости загрузки и нагрузке на сервер.
Поэтому лучше использовать такой подход для небольших списков или при наличии эффективного кэширования.
Также тестируйте изменения на разных устройствах и браузерах, чтобы убедиться, что пользовательский интерфейс остаётся удобным.
Если вы используете кастомные запросы через WP_Query, не забудьте применять аналогичные изменения в параметрах запроса.
Итог
Мы рассмотрели несколько способов отключения пагинации в WordPress для отдельных страниц, категорий и архивов, включая работу с хуком pre_get_posts, условное изменение шаблонов и использование плагинов.
Применяйте эти методы в зависимости от ваших задач, и вы сможете гибко управлять отображением контента на сайте без пагинации там, где она не нужна.