В WordPress часто возникает необходимость ограничить количество выводимых постов на страницах блога, в архивах, на главной или в кастомных запросах. Это помогает улучшить производительность сайта, сделать интерфейс удобнее и адаптировать вывод под конкретные задачи. В этой статье подробно разберём, как правильно ограничить количество постов с помощью настроек WP, хуков и плагинов, а также рассмотрим примеры кода для разных случаев.
Почему важно ограничивать количество постов в WordPress
Большое количество постов на одной странице может негативно повлиять на скорость загрузки и восприятие контента пользователем. Особенно это заметно, когда тема или плагин выводят все записи без пагинации. Ограничение числа постов позволяет:
- Улучшить производительность страницы;
- Сделать навигацию по сайту удобнее;
- Оптимизировать запросы к базе данных;
- Повысить юзабилити и снизить показатель отказов.
Важно понимать, что WordPress по умолчанию выводит число постов, заданное в настройках «Число записей на странице» в разделе «Чтение». Но часто нужна более гибкая настройка для отдельных страниц и запросов.
Как задать ограничение количества постов на главной и страницах архива
Самый простой способ — изменить параметр posts_per_page в основном запросе WordPress. Для этого используйте хук pre_get_posts. Он позволяет модифицировать параметры WP_Query перед выполнением запроса.
Пример функции для ограничения постов на главной странице и страницах архива до 5:
function wpdemo_limit_posts_per_page( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
if ( $query->is_home() || $query->is_archive() ) {
$query->set( 'posts_per_page', 5 );
}
}
}
add_action( 'pre_get_posts', 'wpdemo_limit_posts_per_page' );Здесь мы проверяем, что запрос основной и не из админки, затем для главной и архивных страниц задаём ограничение в 5 постов. Этот метод прост и эффективен, подходит для большинства тем и проектов.
Ограничение постов в кастомных WP_Query
Часто вывод постов происходит через собственные запросы. В таких случаях ограничение задаётся параметром при создании объекта:
$args = array(
'post_type' => 'post',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
);
$custom_query = new WP_Query( $args );
if ( $custom_query->have_posts() ) {
while ( $custom_query->have_posts() ) {
$custom_query->the_post();
// вывод контента
}
wp_reset_postdata();
}Здесь posts_per_page ограничивает количество записей до 3. Такой подход нужен при создании кастомных блоков, виджетов и шаблонов.
Ограничение в REST API запросах WordPress
Если вы используете WP REST API для вывода постов на фронтенде, то ограничение задаётся параметром per_page. Например, чтобы получить 4 записи, запрос выглядит так:
https://example.com/wp-json/wp/v2/posts?per_page=4
Если вы создаёте свои кастомные эндпоинты, обязательно обрабатывайте параметр per_page или задавайте дефолтное ограничение в обработчике.
Плагины для управления количеством постов
Если не хотите писать код, можно использовать плагины, которые расширяют возможности по управлению выводом:
- WP Limit Posts — простой плагин для ограничения постов в виджетах и шорткодах.
- Clearfy Pro — комплексный инструмент оптимизации, в том числе позволяет управлять настройками вывода контента.
Использование плагинов удобно, если нужно быстро настроить ограничения без программирования.
Как сделать ограничение с сохранением пагинации
При выводе постов с ограничением важно сохранить пагинацию, чтобы посетители могли перейти к следующим страницам с постами. Для этого нужно правильно настроить WP_Query и разметку.
Пример функции для главной страницы с пагинацией:
function wpdemo_limit_posts_with_pagination( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'wpdemo_limit_posts_with_pagination' );И в шаблоне используйте стандартные функции пагинации:
the_posts_pagination( array(
'mid_size' => 2,
'prev_text' => __( 'Назад', 'wpdemo' ),
'next_text' => __( 'Вперед', 'wpdemo' ),
) );<Так посетитель увидит 5 постов на странице и сможет перейти к следующим при помощи пагинации.
Вывод ограниченного количества постов в виджетах и сайдбарах
Если вы используете стандартный виджет «Последние записи», то количество задаётся в настройках виджета. Для кастомных виджетов или плагинов используйте параметр posts_per_page.
Пример вывода 3 последних постов в виджете с помощью WP_Query:
class Wpdemo_Recent_Posts_Widget extends WP_Widget {
public function __construct() {
parent::__construct('wpdemo_recent_posts', 'WPdemo Последние записи');
}
public function widget( $args, $instance ) {
$query = new WP_Query( array( 'posts_per_page' => 3 ) );
echo $args['before_widget'];
echo $args['before_title'] . 'Последние записи' . $args['after_title'];
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
}
echo $args['after_widget'];
}
}
add_action( 'widgets_init', function(){
register_widget( 'Wpdemo_Recent_Posts_Widget' );
} );Так вы легко адаптируете вывод постов в сайдбаре с нужным ограничением.
Советы по оптимизации запросов с ограничением постов
При работе с ограничением количества постов стоит учитывать оптимизацию запросов:
- Используйте кеширование результатов WP_Query (например, transient API или плагин Clearfy Pro);
- Минимизируйте выборку полей, если нужна только часть данных (
fields => 'ids'или'no_found_rows' => trueдля запросов без пагинации); - Избегайте лишних JOIN и фильтров, если не нужны дополнительные метаданные;
- Проверяйте нагрузку на базу при больших сайтах и используйте индексирование.
Это позволит сохранить скорость и стабильность сайта даже при большом количестве записей.
Итог
Ограничение количества постов в WordPress — простая, но важная задача для любого сайта. Используйте хук pre_get_posts для изменения основного запроса, задавайте параметр posts_per_page в кастомных WP_Query и REST API, применяйте плагины для удобства. Не забывайте про пагинацию и оптимизацию запросов, чтобы сохранить хорошую производительность и удобство пользователей.