Как установить ограничения на количество публикаций для пользователей в WordPress

Диагностика задачи: зачем ограничивать количество публикаций для пользователей

В проектах с большим количеством авторов или пользователей, имеющих права на публикацию, часто возникает необходимость ограничить максимальное число публикаций, которые может создать каждый пользователь. Это нужно для контроля качества, предотвращения спама и распределения нагрузки на редактирование.

Например, на сайтах с гостевыми блогами или мультиавторских порталах важно, чтобы авторы не публиковали более допустимого количества записей без проверки администрации.

Пошаговое решение: ограничение количества публикаций через функции темы

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, поддержка кастомных ролей Переизбыток функционала, возможна нагрузка и конфликты Использование готовых решений
Оптимизация запросов в WordPress с помощью WP7: практическое руководство
20.02.2026
WooCommerce: запрет покупки товара для неавторизованных пользователей
13.05.2026
Как создать плагин для автоматизации задач в WordPress
30.11.2025
WordPress: как создать собственный виджет с примером кода
27.11.2025
Как создать динамические формы с помощью WPForms в WordPress
22.12.2025