В крупных проектах на WordPress часто возникает потребность ограничить, сколько записей определённые пользователи могут публиковать. Это позволяет контролировать нагрузку на сайт, качество контента и предотвращать спам. В этой статье мы подробно разберём, как реализовать ограничение количества публикаций для пользователей в зависимости от их ролей с помощью кода и плагинов.
Почему важно ограничивать количество публикаций по ролям
По умолчанию WordPress не ограничивает количество создаваемого контента для пользователей — если пользователь имеет права на добавление записей, он может публиковать сколько угодно. Однако на крупных сайтах и мультисайтах это может привести к следующим проблемам:
- Перегрузка базы данных и замедление сайта
- Потеря контроля над качеством и тематикой публикаций
- Риск спама со стороны новых или малоопытных авторов
- Неравномерное распределение контента по пользователям
Поэтому разумно вводить ограничение по количеству публикаций, особенно для ролей, таких как author, contributor и кастомных ролей.
Как определить количество публикаций пользователя в WordPress
Для начала нужно уметь определить, сколько записей уже опубликовал пользователь. Для этого удобно использовать WP_Query с параметром author и статусом publish. Пример функции, которая возвращает число опубликованных записей пользователя:
function wpvip_get_user_published_posts_count($user_id) {
$query = new WP_Query(array(
'author' => $user_id,
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids'
));
return $query->found_posts;
}
Данная функция возвращает количество опубликованных записей для пользователя по ID.
Ограничение публикаций по ролям с помощью хука save_post
Чтобы запретить публикацию, если лимит достигнут, можно использовать хук save_post и проверять количество записей пользователя. Если превышен лимит — отменять публикацию и показывать ошибку.
Пример реализации функции, которая ограничивает авторов и контрибьюторов до 5 публикаций:
function wpvip_limit_posts_by_role($post_id, $post, $update) {
// Проверяем, что это публикация
if ($post->post_status !== 'publish') {
return;
}
// Получаем автора
$user_id = $post->post_author;
$user = get_userdata($user_id);
if (!$user) {
return;
}
// Определяем роли с ограничением
$limited_roles = array('author', 'contributor');
if (array_intersect($limited_roles, $user->roles)) {
$max_posts = 5; // лимит публикаций
$count = wpvip_get_user_published_posts_count($user_id);
if ($count > $max_posts) {
// Снимаем публикацию
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'draft'
));
// Выводим уведомление об ошибке в админке
add_filter('redirect_post_location', function($location) {
return add_query_arg('wpvip_limit_error', 1, $location);
});
}
}
}
add_action('save_post', 'wpvip_limit_posts_by_role', 10, 3);
// Отображаем сообщение об ошибке
function wpvip_limit_posts_error_notice() {
if (isset($_GET['wpvip_limit_error'])) {
echo '<div class="error notice"><p>Вы достигли лимита публикаций и не можете добавить новую запись.</p></div>';
}
}
add_action('admin_notices', 'wpvip_limit_posts_error_notice');
Этот код переводит пост в черновики, если лимит превышен, и выводит ошибку в админке.
Использование плагинов для ограничения публикаций
Если хочется готовое решение без программирования, можно использовать плагины:
- Restrict Author Posting — позволяет задавать лимиты публикаций по ролям и пользователям;
- Limit Posts — простой плагин для ограничения количества записей;
- Clearfy Pro — в расширенных настройках оптимизации есть функции управления пользователями и ограничениями по контенту;
- WPVIP — мощный инструмент для управления большими WordPress-проектами с настройкой ролей и прав, включая ограничения по публикациям.
Выбор плагина зависит от задач и уровня контроля, который нужен.
Дополнительные рекомендации и расширения
1. Разграничение по типам записей. Если у вас в проекте несколько типов записей (Custom Post Types), учитывайте их отдельно в ограничениях. Для этого модифицируйте функцию подсчёта публикаций, добавив параметр post_type.
function wpvip_get_user_published_posts_count($user_id, $post_type = 'post') {
$query = new WP_Query(array(
'author' => $user_id,
'post_status' => 'publish',
'post_type' => $post_type,
'posts_per_page' => -1,
'fields' => 'ids'
));
return $query->found_posts;
}
2. Настройка лимитов через пользовательский интерфейс. Для удобства можно добавить страницу настроек в админке, где администратор сможет задавать лимиты для каждой роли без правки кода.
3. Уведомления пользователям. Вместо простой блокировки публикации лучше уведомлять пользователей заранее, когда они подходят к лимиту.
4. Интеграция с WPVIP. Если вы используете WPVIP, там есть расширенные возможности по управлению правами, что позволяет гибко настраивать ограничения без кастомного кода.
Итог
Ограничение количества публикаций для пользователей по ролям — важный инструмент для контроля качества и безопасности на WordPress-сайте. С помощью описанного кода и плагинов можно быстро внедрить такую функциональность и адаптировать её под свои задачи. Обязательно тестируйте решение на тестовом сайте, чтобы избежать конфликтов с другими плагинами и темами.