Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Пользователи, роли и права

На сайте бывает несколько человек с разными обязанностями: один пишет статьи, другой их проверяет, третий настраивает сайт. 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() при каждой загрузке сайта: это лишняя запись в базу на каждый запрос.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.