WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

WP_Roles::remove_cap() WP 2.0

Удаляет возможность у указанной роли пользователя или у конкретного пользователя.

Изменив возможность один раз, изменение останется навсегда, пока не будет переменено еще раз.

Эти настройки сохраняются в БД (в таблицу wp_options, поле wp_user_roles), поэтому эту функцию нужно запускать единожды при активации/деактивации плагина или темы.

remove_cap() не публичная функция - это метод класса WP_Roles, WP_Role и WP_User, поэтому она должна вызываться из экземпляров этих классов, как показано в примерах.

Хуков нет.

Возвращает

Ничего не возвращает.

Использование

global $wp_roles;
$wp_roles->remove_cap( $role, $cap );

// или
$role = get_role( 'author' );
$role->remove_cap( $cap );
$role(строка) (обязательный)
Название роли: Super Admin, Administrator, Editor, Author, Contributor, Subscriber.
По умолчанию: нет
$cap(строка) (обязательный)
Название возможности. Таблица с ролями и их возможностями по умолчанию.
По умолчанию: нет

Примеры

#1. Запретим чтение приватных постов, пользователям в ролью editor

Функцию нужно вызывать во время активации плагина, т.е. один раз, а не постоянно:

function remove_editor_read_private_posts() {

	// get_role возвращает экземпляр класса WP_Role.
	$role = get_role( 'editor' );
	$role->remove_cap( 'read_private_posts' );
}

// тоже самое можно сделать через класс WP_Roles:
function remove_editor_read_private_posts(){
	global $wp_roles;
	$wp_roles->remove_cap( 'editor', 'read_private_posts' );
}

2. Удаление нескольких возможностей

Удалим некоторые возможности у всех пользователей с ролью "редактор" (editor):

// вызывайте функцию один раз, при активации плагина/темы
function wpcodex_set_capabilities() {
	// получаем объект роли.
	$editor = get_role( 'editor' );

	// Список возможностей, которые нужно удалить у editor
	$caps = array(
		'moderate_comments',
		'manage_categories',
		'manage_links',
		'edit_others_posts',
		'edit_others_pages',
		'delete_posts',
	);

	foreach ( $caps as $cap ) {
		$editor->remove_cap( $cap );
	}
}

3. Удалим возможность у конкретного пользователя

Нельзя удались право пользователя, если оно относится к правам его роли! Удалять можно права, только которые были ему добавлены и выходят за пределы его роли. Например юзеру с правами автора, было добавлено право редактировать чужие посты. Если нужно удалить право роли юзера, то это право нужно удалять у самой роли. Но такое изменение коснется всех юзеров с этой ролью.

По умолчанию у юзеров нет прав, кроме тех что ему дает его роль (ролей у юзера может быть одновременно несколько). Поэтому по умолчанию у юзера невозможно удалить какие-либо права.

Если нужно ограничить юзера в правах и при этом не трогать права его роли. То нужно создать новую роль, передать ей все необходимые права и установить эту роль для юзера.

Удалим возможность чтения приватных постов у пользователя с ID 5, только если такое право выходит за пределы его роли и оно было добавлено (делегировано) для юзера 5:

$user_id = 5;
$user = new WP_User( $user_id );
$user->remove_cap( 'read_private_posts' );

Код WP Roles::remove cap: wp-includes/class-wp-roles.php VER 4.9.6

<?php
public function remove_cap( $role, $cap ) {
	if ( ! isset( $this->roles[$role] ) )
		return;

	unset( $this->roles[$role]['capabilities'][$cap] );
	if ( $this->use_db )
		update_option( $this->role_key, $this->roles );
}

Cвязанные функции

Из метки: Роли и возможности (role capabilities)

7 комментов
  • @ Дмитрий cайт: www.vislushau.ru

    Добрый день. Подскажите как вернуть стандартные роли пользователей вордпресс после удаления плагина User Role Editor. Он видимо внес изменения в БД

    Ответить2.4 года назад #
    • Kama5320

      Установите его обратно и там есть кнопка «RESET»: В Пользователи > User Role Editor. Попробуйте ею воспользоваться...

      Ответить2.4 года назад #
  • Здравствуйте, скажите пожалуйста:

    1. Куда прописывать код с примера 1?
    2. Должен ли быть включен плагин User Role Editor?
    3. Можете привезти пример, как отключить "редактору" возможность править и удалять чужие посты и страницы?
    Ответить2 года назад #
    • Kama5320

      Открой User Role Editor, переключись там на роль Редактор и отмени ненужные права (убери галку). Эта статья вам вообще не нужна...

      Правка чужих записей это права: edit_others_posts, edit_others_pages

      Удаление чужих записей: delete_others_posts, delete_others_pages

      1
      Ответить2 года назад #
  • Антон
    $user_id = 5;
    $user = new WP_User( $user_id );
    $user->remove_cap( 'read_private_posts' )

    Подскажите пожалуйста в каком хуке прописывать этот код? after_setup_theme, init, admin_init - > не работают

    • Kama5320

      В примере была ошибка! Поправил. Спасибо за коммент! thank_you

      Пояснения:

      Нельзя удались право пользователя, если оно относится к правам его роли! Удалять можно права, только которые были ему добавлены и выходят за пределы его роли. Например юзеру с правами автора, было добавлено право редактировать чужие посты. Если нужно удалить право роли юзера, то это право нужно удалять у самой роли.

      По умолчанию у юзеров нет прав, кроме тех что ему дает его роль (ролей у юзера может быть одновременно несколько). Поэтому по умолчанию у юзера невозможно удалить какие-либо права.

      Если нужно ограничить юзера в правах и при этом не трогать права его роли. То нужно создать новую роль, передать ей все необходимые права и установить эту роль для юзера.

      Ответитьмесяц назад #

Здравствуйте, !