Диагностика задачи: зачем ограничивать количество публикаций для пользователей
В проектах с большим количеством авторов или пользователей, имеющих права на публикацию, часто возникает необходимость ограничить максимальное число публикаций, которые может создать каждый пользователь. Это нужно для контроля качества, предотвращения спама и распределения нагрузки на редактирование.
Например, на сайтах с гостевыми блогами или мультиавторских порталах важно, чтобы авторы не публиковали более допустимого количества записей без проверки администрации.
Пошаговое решение: ограничение количества публикаций через функции темы
1. Определение максимального лимита публикаций
Для начала решите, сколько публикаций может иметь пользователь. В примере ниже — 5 постов.
2. Использование хука user_has_cap для ограничения создания новых записей
Этот фильтр позволяет вмешаться в проверки прав пользователя. Мы проверим, сколько у пользователя уже опубликованных записей и при достижении лимита запретим создавать новые.
function limit_user_posts_capability( $all_caps, $caps, $args, $user ) {
// Проверяем, что это попытка создать или редактировать публикацию
if ( isset($caps[0]) && in_array($caps[0], ['edit_posts', 'publish_posts']) ) {
$user_id = $user->ID;
$post_type = 'post'; // Укажите свой тип записи, если необходимо
$args = [
'author' => $user_id,
'post_type' => $post_type,
'post_status' => ['publish', 'pending', 'draft'],
'fields' => 'ids',
];
$user_posts = get_posts($args);
$max_posts = 5; // Максимальное количество публикаций
if ( count($user_posts) >= $max_posts ) {
$all_caps[$caps[0]] = false; // Запретить право
}
}
return $all_caps;
}
add_filter('user_has_cap', 'limit_user_posts_capability', 10, 4);3. Сообщение пользователю о превышении лимита
Чтобы пользователь понимал причину отказа, добавим вывод сообщения при попытке создать новую публикацию.
function limit_posts_admin_notice() {
$screen = get_current_screen();
if ( $screen->id !== 'post' ) return;
$user_id = get_current_user_id();
$max_posts = 5;
$user_posts = get_posts([
'author' => $user_id,
'post_type' => 'post',
'post_status' => ['publish', 'pending', 'draft'],
'fields' => 'ids',
]);
if ( count($user_posts) >= $max_posts ) {
echo '<div class="notice notice-error">';
echo '<p>Вы достигли максимального количества публикаций ('. $max_posts .'). Обратитесь к администратору.</p>';
echo '</div>';
}
}
add_action('admin_notices', 'limit_posts_admin_notice');Проверка результата после внедрения
- Автор с ролью, позволяющей публиковать записи, пытается создать новую публикацию через админку.
- Если количество его записей меньше лимита — создание проходит без ограничений.
- При достижении лимита кнопка «Добавить новую запись» остается активной, но при попытке сохранить появляется ошибка или публикация блокируется (в зависимости от настроек).
- В админке появляется уведомление с причиной блокировки.
Для проверки можно создать тестового пользователя с ролью автора, опубликовать 5 записей и попытаться добавить шестую.
Частые ошибки и как исправить
- Ошибка: Запрет не срабатывает, пользователь может создавать больше записей.
Причина: Фильтрuser_has_capможет быть переопределён плагинами или темами. Проверьте приоритеты фильтров и конфликтующие плагины. - Ошибка: Сообщение об ошибке не отображается.
Причина: Хукadmin_noticesget_current_screen()). Возможно, нужно добавить дополнительные проверки. - Ошибка: Ограничение работает только для типа
post, а нужно для кастомных типов.
Решение: В коде замените'post_type' => 'post'на нужный тип записи или сделайте проверку для нескольких типов.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в
user_has_capбез кеширования. Для производительности кешируйте количество публикаций, например, с помощьюtransient APIили объекта кеша. - Проверяйте роли пользователей — возможно, для администраторов ограничение не нужно, добавьте условие.
- Если у сайта большое количество пользователей и публикаций, используйте прямые SQL-запросы с индексами для подсчёта, чтобы избежать нагрузки.
- Для расширения функциональности можно создать отдельный плагин, а не добавлять код в functions.php, чтобы легче управлять обновлениями и отключениями.
Сравнение вариантов реализации ограничения публикаций
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
Фильтр user_has_cap |
Гибко контролирует права, работает на уровне ядра WordPress | Нагрузка при большом числе пользователей, конфликт с другими фильтрами | Пример из статьи выше |
Проверка в pre_post_update или save_post |
Можно вызывать ошибку сохранения, гибко управлять | Публикация может быть частично сохранена, сложнее показать ошибку | Фильтр для валидации при сохранении записи |
| Плагины (например, PublishPress Permissions) | Простая настройка, GUI, поддержка кастомных ролей | Переизбыток функционала, возможна нагрузка и конфликты | Использование готовых решений |