Пользователи, роли и права
На сайте бывает несколько человек с разными обязанностями: один пишет статьи, другой их проверяет, третий настраивает сайт. WordPress разделяет их ролями, а каждая роль — это набор прав на конкретные действия.
Встроенные роли
| Роль | Что может |
|---|---|
Подписчик (subscriber) | Читать и менять свой профиль |
Участник (contributor) | Писать записи, но не публиковать |
Автор (author) | Публиковать и менять свои записи |
Редактор (editor) | Управлять всеми записями и страницами |
Администратор (administrator) | Всё, включая настройки, темы и плагины |
Проверка прав
Проверяют не роль, а право на действие:
if (current_user_can('edit_posts')) {
echo '<a href="' . esc_url(admin_url('post-new.php')) . '">Написать статью</a>';
}
if (current_user_can('edit_post', $postId)) {
edit_post_link('Изменить', '', '', $postId);
}| Право | Что разрешает |
|---|---|
read | Вход в панель и свой профиль |
edit_posts | Создавать записи |
publish_posts | Публиковать |
edit_others_posts | Менять чужие записи |
upload_files | Загружать файлы |
manage_options | Менять настройки сайта |
Право edit_post с номером записи — особое: WordPress сам решает, свой это текст или чужой и опубликован ли он.
Текущий пользователь
<?php
// header.php
if (is_user_logged_in()) {
$user = wp_get_current_user();
printf(
'Здравствуйте, %s! <a href="%s">Выйти</a>',
esc_html($user->display_name),
esc_url(wp_logout_url(home_url('/'))),
);
} else {
printf('<a href="%s">Войти</a>', esc_url(wp_login_url(get_permalink())));
}Своя роль
Роли хранятся в базе, поэтому создают их один раз — при активации плагина:
// books.php
register_activation_hook(__FILE__, function () {
add_role('librarian', 'Библиотекарь', [
'read' => true,
'edit_posts' => true,
'upload_files' => true,
]);
});
register_deactivation_hook(__FILE__, function () {
remove_role('librarian');
});Своё право
Существующей роли можно добавить новое право:
register_activation_hook(__FILE__, function () {
get_role('editor')?->add_cap('manage_books');
get_role('administrator')?->add_cap('manage_books');
});if (!current_user_can('manage_books')) {
wp_die('Недостаточно прав.', 403);
}Данные пользователя
Дополнительные сведения хранят в метаданных пользователя:
update_user_meta($userId, 'favorite_genre', 'fantasy');
$genre = get_user_meta($userId, 'favorite_genre', true);Создание пользователя
$userId = wp_insert_user([
'user_login' => 'anna',
'user_email' => 'anna@example.com',
'user_pass' => wp_generate_password(),
'role' => 'author',
]);
if (is_wp_error($userId)) {
error_log($userId->get_error_message());
}Пароль WordPress хеширует сам.
Закрытое содержимое
add_filter('the_content', function (string $content): string {
if (is_singular('book') && !is_user_logged_in()) {
return '<p>Войдите, чтобы прочитать книгу.</p>';
}
return $content;
});Частая ошибка
Проверка роли — in_array('editor', $user->roles) — ломается, как только на сайте появляется своя роль или плагин меняет набор прав. Спрашивайте о действии: current_user_can('edit_others_posts'). И не вызывайте add_role() при каждой загрузке сайта: это лишняя запись в базу на каждый запрос.