Intereting Posts
Замените URL-адреса изображения (абсолютные, а не относительные), используя фильтр на одной странице Запустите WP-CLI с помощью PHP Как связать образ с термином taxononmy и опубликовать его на главной странице? WordPress, генерирующий 404 на .mp4 файле в папке темы как группировать сообщения из обычных категорий Ссылка подтверждения была отправлена ​​на ваш (текущий адрес электронной почты) PHP XMLRPC для WordPress: добавление метатегов и описание Ошибка SQL при восстановлении базы данных Ограничить query_posts до 1, независимо от липкой почты? Показывать все данные в таблице базы данных и превращать их в интерактивную таблицу Как отобразить измененный пост сегодня Проверка наличия расширения файла или типа mime Можно ли восстановить удаленных пользователей? Название таксономии Используйте специальные шрифты в незарегистрированном блоге WordPress

Предотвратите удаление любой роли пользователя, кроме подписчика.

В администрировании моего блога я хотел бы запретить любому пользователю (администратору) удалять любого пользователя, если он не является простым подписчиком.

В основном, в разделе «пользователи» администрации я бы хотел, чтобы опция «удалить» была видна только под подписчиками, а не администраторами, редакторами, авторами или участниками.

Как я могу сделать это в моем файле functions.php (меня не интересует плагин)?

Я попробовал функцию remove_cap ('delete_users'), но у нее слишком большая область, поскольку она предотвращает удаление любого пользователя, в то время как я хотел бы предотвратить удаление любого пользователя, НО подписчиков.

Спасибо за помощь.

Solutions Collecting From Web of "Предотвратите удаление любой роли пользователя, кроме подписчика."

Если вы имеете в виду кнопку удаления в списке пользователей в /wp-admin/users.php , то эта кнопка создается классом WP_Users_List_Table вокруг (текущей) строки 256 . Если вы посмотрите немного дальше – несколько строк – вы увидите фильтр с именем user_row_actions . Вы можете использовать это, чтобы скрыть ссылку «удалить».

 add_filter( 'user_row_actions', function($actions, $user_object) { if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) { unset($actions['delete']); } return $actions; }, 1,2 ); не add_filter( 'user_row_actions', function($actions, $user_object) { if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) { unset($actions['delete']); } return $actions; }, 1,2 ); 

Минимально проверены, но я думаю, что логика правильная. Вы должны увидеть ссылку «удалить» для подписчиков, но не для пользователей с любой другой ролью, включая пользователей с «подписчиком» и некоторой другой ролью, если у вас есть эта нечетная настройка.

Если вы внимательно посмотрите и будете иметь озорной ум, вы заметите, что вы все равно можете удалить любого пользователя, который вы хотите, манипулируя идентификатором пользователя в URL-адресе. Смотри внимательно:

 /wp-admin/users.php?action=delete&user=9&_wpnonce=8059e669c1 

Фильтр выше просто скрывает ссылку. Это не препятствует доступу к экрану удаления. Для этого нам понадобится больше кода:

 add_action( 'load-users.php', function() { if (isset($_GET['action']) && 'delete' === $_GET['action']) { if (isset($_GET['user'])) { $user_object = get_userdata($_GET['user']); if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) { wp_die('This user cannot be deleted'); } } } } ); 

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

 add_action( 'delete_user', function($id) { $user_object = get_userdata($id); if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) { wp_die('This user cannot be deleted'); } } ); 

Примечание: этот код был протестирован в файле MU-Plugin. Я думаю, что, вероятно, следует работать с functions.php но обязательно проверьте это. Кроме того, на практике я, вероятно, попытаюсь извлечь часть этой логики, чтобы она была повторно использована. Эти обратные вызовы опасно близки к повторяющимся.

Ok s_ha_dum, я получил его для работы с некоторыми изменениями:

«count», кажется, разрушает функцию, но, как это, она работает как шарм:

 function test($actions, $user_object) { if ( 'subscriber' !== $user_object->roles[0]) {unset($actions['delete']);} return $actions; } add_filter('user_row_actions','test',1,2); 

Спасибо вам за большую помощь!

Да, мы можем добиться этого, следуя.

 add_filter( 'user_row_actions', 'custom_action_function', 1, 2 ); function custom_action_function($actions, $user_object) { if ( 1 >= count( $user_object->roles ) && 'subscriber' !== $user_object->roles[0] ) { unset( $actions['delete'] ); } return $actions; }