В процессе разработки сайтов на WordPress часто возникает задача ограничить количество записей, отображаемых в определённом контейнере, например, в кастомном типе записи или категории. Это может быть полезно для оптимизации производительности, улучшения пользовательского интерфейса или соблюдения бизнес-логики сайта.
Почему важно ограничивать число записей в контейнере WordPress
Без ограничений WordPress выводит все записи, соответствующие запросу, что может привести к излишней нагрузке на сервер и замедлению загрузки страницы. Особенно актуально это для сайтов с большим количеством контента и сложными запросами.
Ограничение количества записей позволяет:
- Уменьшить время отклика сервера;
- Сделать интерфейс пользователя более удобным;
- Управлять отображением контента согласно бизнес-требованиям;
- Избежать перегрузки базы данных при сложных запросах.
Рассмотрим способы установки ограничений на число записей в разных сценариях WordPress.
Использование параметра posts_per_page в WP_Query
Если вы создаёте кастомный запрос с помощью класса WP_Query, самый простой способ ограничить число записей — использовать параметр posts_per_page. Например, чтобы вывести максимум 10 записей из кастомного типа записи product:
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Вывод записи
}
}
wp_reset_postdata();
Этот метод гибкий и подходит для большинства случаев, когда вы контролируете запрос напрямую.
Ограничение для главного запроса через pre_get_posts
Если нужно изменить количество записей в основном цикле WordPress, например, для категории или страницы архива, используйте хук pre_get_posts. Пример ограничения записей до 5 для категории с ID 12:
function wpco_limit_posts_per_page($query) {
if (!is_admin() && $query->is_main_query() && is_category(12)) {
$query->set('posts_per_page', 5);
}
}
add_action('pre_get_posts', 'wpco_limit_posts_per_page');
Этот подход позволяет глобально контролировать количество выводимых записей без изменения шаблонов.
Ограничение количества записей в пользовательских типах записей с помощью плагинов
Если вы предпочитаете не писать код, можно использовать плагины, которые добавляют функционал ограничения:
- Restrict Content Pro — позволяет ограничивать доступ и количество записей для разных ролей пользователей.
- WP User Frontend — в настройках можно задать лимит на количество создаваемых пользователем записей.
- Advanced Access Manager — расширенные права доступа, включая ограничение создания и просмотра записей.
Для конкретных задач ограничения количества выводимых записей стоит искать плагины, ориентированные на архивы и вывод контента, но чаще всего удобнее прописать простое решение на коде.
Практический пример: ограничение количества записей в кастомном REST API эндпоинте
Предположим, что вы создаёте REST API для собственного типа записи event и хотите ограничить число возвращаемых элементов. Пример регистрации эндпоинта с ограничением до 8 записей:
function wpco_register_events_endpoint() {
register_rest_route('wpco/v1', '/events', [
'methods' => 'GET',
'callback' => 'wpco_get_events',
]);
}
add_action('rest_api_init', 'wpco_register_events_endpoint');
function wpco_get_events(WP_REST_Request $request) {
$args = [
'post_type' => 'event',
'posts_per_page' => 8,
'orderby' => 'date',
'order' => 'DESC',
];
$query = new WP_Query($args);
$events = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$events[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'date' => get_the_date(),
];
}
wp_reset_postdata();
}
return rest_ensure_response($events);
}
Такой подход позволяет гибко управлять объемом данных на уровне API, что важно для мобильных приложений и SPA.
Установка ограничений на уровне базы данных и серверных настроек
В некоторых случаях, если сайт очень большой, можно пойти дальше и ограничить число записей на уровне запросов SQL или настроек сервера. Но это уже более сложные задачи, требующие внимательного тестирования.
Например, можно добавить фильтр на SQL-запрос через posts_limits:
function wpco_limit_sql_results($limits, $query) {
if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
return 'LIMIT 10';
}
return $limits;
}
add_filter('posts_limits', 'wpco_limit_sql_results', 10, 2);
Этот способ жёстко ограничит число записей на уровне SQL, но требует осторожности, чтобы не сломать пагинацию.
Советы по выбору и реализации ограничения
При установке ограничений учитывайте следующие моменты:
- Пагинация. Если вы ограничиваете число записей на странице, обязательно реализуйте пагинацию для удобства пользователей.
- Кэширование. Ограничение количества записей уменьшает нагрузку, но дополнительно используйте кэширование запросов (например, с помощью плагина Clearfy Pro или встроенного кэша).
- Удобство администрирования. Для сайтов с большим количеством контента стоит предусмотреть возможность менять лимиты через настройки.
- Тестирование. Любые ограничения тщательно тестируйте на разных страницах и типах запросов, чтобы избежать ошибок и потери данных.
Заключение
Ограничение количества записей в контейнерах WordPress — задача частая, но решаемая достаточно просто. Используйте posts_per_page в WP_Query или pre_get_posts для главного запроса, добавляйте REST API с контролем лимитов и при необходимости применяйте плагины для удобства. Главное — учитывать особенности проекта и не забывать про пагинацию и кэширование.
Если хотите расширить функционал и оптимизировать работу с записями, обратите внимание на Clearfy Pro — плагин, который помогает управлять производительностью и безопасностью WordPress.