В некоторых проектах на WordPress возникает необходимость ограничить количество публикаций, которые может создать пользователь определенной роли. Это полезно, например, на многоавторских сайтах, где нужно контролировать нагрузку или качество контента, либо на сайтах с платным доступом, где пользователям предоставляется ограниченное число публикаций.
Почему важно ограничивать количество публикаций в WordPress
Без ограничений пользователь может создавать неограниченное число записей, что может привести к:
- загрязнению контента некачественными публикациями;
- перегрузке базы данных;
- нарушению бизнес-логики сайта, если публикации связаны с платными услугами;
- сложностям в модерации и управлении сайтом.
Способы реализации ограничения количества публикаций
Для реализации задачи можно выбрать два основных пути:
- Использовать готовые плагины, которые управляют правами и ограничениями пользователей.
- Написать собственный код, который будет проверять количество уже созданных публикаций и блокировать создание новых.
Плагины для ограничения публикаций
Вот несколько популярных и проверенных плагинов, которые позволяют ограничивать количество постов:
- Post Limit — простой плагин для ограничения количества публикаций по ролям.
- User Post Limit — более гибкий инструмент с возможностью задать лимиты по типам записей.
- Clearfy Pro — многофункциональный плагин для оптимизации и управления WordPress, в который входит возможность контроля публикаций.
Использование плагина подойдет, если вы хотите быстро и без программирования ввести ограничения.
Реализация ограничения публикаций на примере собственного кода
Для более тонкой настройки и интеграции с вашим сайтом можно использовать хук user_has_cap и функцию проверки количества публикаций у пользователя.
Пример кода для ограничения публикаций
function wp7_limit_user_posts( $allcaps, $cap, $args, $user ) {
// Проверяем право на публикацию
if ( 'publish_posts' === $args[0] ) {
$user_id = $user->ID;
$max_posts = 5; // Максимальное количество публикаций
// Получаем количество опубликованных записей пользователя
$args_query = array(
'author' => $user_id,
'post_type' => 'post',
'post_status' => array('publish', 'pending', 'draft'),
'posts_per_page' => -1,
'fields' => 'ids'
);
$user_posts = get_posts( $args_query );
$count_posts = count( $user_posts );
if ( $count_posts >= $max_posts ) {
// Запрещаем публикацию, если достигнут лимит
$allcaps['publish_posts'] = false;
}
}
return $allcaps;
}
add_filter( 'user_has_cap', 'wp7_limit_user_posts', 10, 4 );
В этом коде мы задаем максимальное количество публикаций ($max_posts), которое пользователь может создать. Если пользователь достиг лимита, ему запрещается публиковать новые записи.
Разъяснения к коду
Функция wp7_limit_user_posts перехватывает проверку прав пользователя на публикацию записей. Она считает все записи пользователя, включая черновики и ожидающие модерации, и если их количество превышает лимит, то снимает право публикации.
Этот метод хорошо работает для стандартного типа записей post. При необходимости можно расширить проверку на другие типы записей, изменив параметр post_type.
Уведомление пользователя о достижении лимита публикаций
Важно не только ограничить публикацию, но и уведомить пользователя о причине отказа. Для этого можно добавить вывод сообщения в админ-панели с помощью хука admin_notices.
function wp7_limit_user_posts_notice() {
$user_id = get_current_user_id();
$max_posts = 5;
$args_query = array(
'author' => $user_id,
'post_type' => 'post',
'post_status' => array('publish', 'pending', 'draft'),
'posts_per_page' => -1,
'fields' => 'ids'
);
$user_posts = get_posts( $args_query );
$count_posts = count( $user_posts );
if ( $count_posts >= $max_posts ) {
echo '<div class="notice notice-error"><p>Вы достигли максимального количества публикаций (' . $max_posts . '). Создание новых записей недоступно.</p></div>';
}
}
add_action( 'admin_notices', 'wp7_limit_user_posts_notice' );
Теперь пользователь, который превысил лимит, увидит понятное сообщение в админ-панели.
Как расширить функционал
Вы можете доработать код и добавить:
- Разные лимиты для разных ролей пользователей;
- Ограничения на определённые категории или типы записей;
- Автоматическое снятие ограничений через определённое время;
- Интеграцию с плагинами платного контента или подписок.
Для примера, вот как можно задать лимиты по ролям:
function wp7_limit_user_posts_by_role( $allcaps, $cap, $args, $user ) {
if ( 'publish_posts' === $args[0] ) {
$user_id = $user->ID;
$user_info = get_userdata( $user_id );
$role_limits = array(
'author' => 10,
'contributor' => 3,
'subscriber' => 0,
);
foreach ( $role_limits as $role => $limit ) {
if ( in_array( $role, $user_info->roles ) ) {
$max_posts = $limit;
break;
}
}
if ( !isset( $max_posts ) ) {
$max_posts = 5; // дефолтный лимит
}
$args_query = array(
'author' => $user_id,
'post_type' => 'post',
'post_status' => array('publish', 'pending', 'draft'),
'posts_per_page' => -1,
'fields' => 'ids'
);
$user_posts = get_posts( $args_query );
$count_posts = count( $user_posts );
if ( $count_posts >= $max_posts ) {
$allcaps['publish_posts'] = false;
}
}
return $allcaps;
}
add_filter( 'user_has_cap', 'wp7_limit_user_posts_by_role', 10, 4 );
Заключение
Ограничение количества публикаций — простой и эффективный способ контролировать контент на сайте WordPress. Выбор между плагинами и собственным кодом зависит от задач и уровня владения PHP. Код из статьи можно адаптировать под ваши нужды и расширять функционал.
Для быстрого старта и расширенных возможностей рекомендуем обратить внимание на плагин Clearfy Pro — он содержит много инструментов для управления правами и оптимизации сайта.