Как настроить права доступа для кастомных типов записей в WordPress

В 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);

Этот пример гарантирует, что даже если пользователь попытается обойти интерфейс, права будут проверены на сервере.

Логика оценки продуктивности в WordPress: практическое руководство с примерами
31.12.2025
Как установить и настроить Object Cache в WordPress для ускорения сайта
22.03.2026
Как сделать двухуровневую кэшировку в WordPress для ускорения сайта
03.12.2025
Как создать своё виджет в WordPress с примером кода
07.01.2026
Как заблокировать и удалить злоупотребления в WooCommerce через .htaccess
02.05.2026