В WordPress кастомные типы записей (Custom Post Types, CPT) часто используются для создания собственных разделов контента, отличных от стандартных постов и страниц. Однако по умолчанию управление правами доступа к таким типам записей ограничено, и без дополнительной настройки пользователи с разными ролями могут получить нежелательные возможности, например, редактировать или удалять записи, к которым они не должны иметь доступа.
Почему важно управлять правами доступа для кастомных типов записей
Управление правами доступа позволяет разграничить возможности различных пользователей и ролей. Например, если у вас сайт с каталогом товаров или проектами, вы можете захотеть, чтобы редакторы могли только создавать и править свои записи, а администраторам были доступны все записи. Без правильной настройки все пользователи с базовыми правами могут получить доступ к чужим данным, что чревато ошибками и нарушением логики работы сайта.
К тому же, не настроив права, вы рискуете, что плагин или тема будут вести себя некорректно при попытке пользователя выполнить действия, которые по логике должны быть ограничены.
В этой статье мы рассмотрим, как правильно задать и расширить права доступа для CPT, а также приведём примеры кода и советы по плагинам для удобного управления.
Как задать права доступа при регистрации кастомного типа записей
При регистрации CPT с помощью функции register_post_type() важно правильно задать параметр capabilities, который задаёт набор прав для этого типа записей.
Пример регистрации CPT с кастомными правами доступа:
function wpturbo_register_cpt_project() {
$labels = [
'name' => 'Проекты',
'singular_name' => 'Проект',
];
$capabilities = [
'edit_post' => 'wpturbo_edit_project',
'read_post' => 'wpturbo_read_project',
'delete_post' => 'wpturbo_delete_project',
'edit_posts' => 'wpturbo_edit_projects',
'edit_others_posts' => 'wpturbo_edit_others_projects',
'publish_posts' => 'wpturbo_publish_projects',
'read_private_posts' => 'wpturbo_read_private_projects',
'delete_posts' => 'wpturbo_delete_projects',
'delete_private_posts'=> 'wpturbo_delete_private_projects',
'delete_published_posts' => 'wpturbo_delete_published_projects',
'delete_others_posts' => 'wpturbo_delete_others_projects',
'edit_private_posts' => 'wpturbo_edit_private_projects',
'edit_published_posts'=> 'wpturbo_edit_published_projects',
];
register_post_type('project', [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => ['title', 'editor', 'thumbnail'],
'capability_type' => ['project', 'projects'],
'capabilities' => $capabilities,
'map_meta_cap' => true,
]);
}
add_action('init', 'wpturbo_register_cpt_project');
В этом примере мы создали набор уникальных capabilities для типа записи project. Это позволит нам более гибко управлять доступом.
Как назначить права ролям пользователей
После регистрации CPT с кастомными правами необходимо назначить эти права нужным ролям пользователей. Обычно это делают при активации темы или плагина.
Пример функции для назначения прав:
function wpturbo_add_caps_to_roles() {
$roles = ['administrator', 'editor', 'author'];
$caps = [
'wpturbo_edit_project',
'wpturbo_read_project',
'wpturbo_delete_project',
'wpturbo_edit_projects',
'wpturbo_edit_others_projects',
'wpturbo_publish_projects',
'wpturbo_read_private_projects',
'wpturbo_delete_projects',
'wpturbo_delete_private_projects',
'wpturbo_delete_published_projects',
'wpturbo_delete_others_projects',
'wpturbo_edit_private_projects',
'wpturbo_edit_published_projects',
];
foreach ($roles as $role_name) {
$role = get_role($role_name);
if (!$role) continue;
foreach ($caps as $cap) {
// Администраторы получают все права, редакторы и авторы - частично
if ($role_name === 'administrator') {
$role->add_cap($cap);
} elseif ($role_name === 'editor') {
// редакторы могут всё, кроме удаления чужих записей
if (strpos($cap, 'delete_others') === false) {
$role->add_cap($cap);
}
} elseif ($role_name === 'author') {
// авторы могут создавать и редактировать только свои записи
if (in_array($cap, ['wpturbo_edit_project','wpturbo_read_project','wpturbo_delete_project','wpturbo_edit_projects','wpturbo_publish_projects'])) {
$role->add_cap($cap);
}
}
}
}
}
register_activation_hook(__FILE__, 'wpturbo_add_caps_to_roles');
Такой подход даёт максимальную гибкость, и вы сможете контролировать, кто что может делать с вашими кастомными типами записей.
Как проверить права доступа в шаблонах и коде
Для ограничения доступа к функционалу в шаблонах и плагинах можно использовать функции current_user_can() с вашими capabilities.
Пример проверки права на редактирование конкретной записи:
if (current_user_can('wpturbo_edit_project', $post_id)) {
// показываем кнопку редактирования
} else {
// выводим сообщение об отсутствии прав
}
Это важно, чтобы интерфейс пользователя соответствовал его правам и не допускал ошибок.
Плагины для удобного управления правами доступа на CPT
Если не хочется писать код вручную, можно использовать плагины. Например:
- Members — популярный плагин для управления ролями и правами. Позволяет создавать и назначать capabilities для CPT через удобный интерфейс.
- User Role Editor — мощный инструмент для детального редактирования ролей и прав, совместим с кастомными capabilities.
- Clearfy Pro — комплексное решение для оптимизации и безопасности, в том числе позволяет управлять правами доступа.
Использование плагинов подходит для тех, кто не хочет углубляться в код, но всё же нуждается в гибком управлении доступом.
Советы по безопасности при работе с правами доступа
Не забывайте, что неправильная настройка capabilities может привести к серьёзным проблемам безопасности. Внимательно тестируйте доступы под разными ролями, обязательно проверяйте, что никто не может редактировать чужие записи без разрешения.
Рекомендуется использовать map_meta_cap = true при регистрации CPT, чтобы WordPress корректно обрабатывал сопоставление прав.
Также полезно добавить логику проверки в хуки, например, current_user_can() в save_post, чтобы дополнительно контролировать права при сохранении данных.
Пример расширенной проверки прав при сохранении записи
function wpturbo_check_caps_before_save($post_id, $post, $update) {
if ($post->post_type !== 'project') return;
if (!current_user_can('wpturbo_edit_project', $post_id)) {
wp_die('У вас нет прав на редактирование этой записи.');
}
}
add_action('wp_insert_post', 'wpturbo_check_caps_before_save', 10, 3);
Этот пример гарантирует, что даже если пользователь попытается обойти интерфейс, права будут проверены на сервере.