Intereting Posts
Список сообщений о терминах на странице редактирования admin Создайте WP-CLI @alias для каждого сайта на многопользовательском Специальная чистая короткая ссылка типа сообщения Изменение размера настраиваемого изображения в 20-й детской теме Контекстно-ориентированные виджеты. Моя работа продолжается Как предотвратить очистку настраиваемых полей во время массового редактирования? Мой сайт WordPress ушел Безопасно ли обновлять обновление данных WooCommerce? mod_rewrite loop, перенаправление http на https на определенную часть блога wordpress Facebook – как проверить пользователя в facebook api, чтобы пользователи не смешивались при входе в систему на моем сайте Не удается изменить post_modified в wp_insert_post (ошибка?) Меню Nav всех сообщений в настраиваемом типе сообщений Результаты поиска, отсортированные по типам сообщений Постоянная ссылка для конкретного имени страницы Удалите <p> </ p> после изображений

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

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

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

Как я могу сделать это в моем файле 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; }