Редактор может создавать любого нового пользователя, кроме администратора

Я установил сайт WordPress для клиента. Клиент имеет роль редактора, однако я установил плагин Members и дал клиенту возможность добавлять новых пользователей в администратор WP. Это работает отлично.

Вопрос, который у меня есть, заключается в том, что я хотел бы, чтобы у клиента была возможность создать нового пользователя, как с роли Contributor, Subscriber, Editor и Author, но НЕ Administrator. Новые пользователи, созданные клиентом, не должны иметь роль администратора. Можно ли как-то скрыть эту опцию?

Спасибо Ваю

34 голоса | спросил Vayu 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 13:34:04 +0300 2010, 13:34:04

3 ответа


33

На самом деле это довольно легко. Вам нужно отфильтровать в map_meta_caps и остановить редакторы от создания /редактирования администраторов и удалить роль администратора из массива «редактируемые роли». Этот класс, как плагин или файл functions.php вашей темы, сделает это:

  класс JPB_User_Caps {

  //Добавить наши фильтры
  функция __construct () {
    add_filter ('editable_roles', array ($ this, 'editable_roles'));
    add_filter ('map_meta_cap', массив ($ this, 'map_meta_cap'), 10, 4);
  }

  //Удалить «Администратор» из списка ролей, если текущий пользователь не является администратором
  функция editable_roles ($ role) {
    if (isset ($ role ['administrator']) & amp; & amp;! current_user_can ('administrator')) {
      unset ($ role ['administrator']);
    }
    return $ role;
  }

  //Если кто-то пытается отредактировать или удалить и admin и этот пользователь не является администратором, не разрешайте его
  function map_meta_cap ($ caps, $ cap, $ user_id, $ args) {

    switch ($ cap) {
        case 'edit_user':
        case 'remove_user':
        case 'promotion_user':
            if (isset ($ args [0]) & amp; & amp; $ args [0] == $ user_id)
                ломать;
            elseif (! isset ($ args [0]))
                $ caps [] = 'do_not_allow';
            $ other = new WP_User (absint ($ args [0]));
            if ($ other-> has_cap ('administrator')) {
                если (! current_user_can ( 'Администратор')) {
                    $ caps [] = 'do_not_allow';
                }
            }
            ломать;
        case 'delete_user':
        case 'delete_users':
            if (! isset ($ args [0]))
                ломать;
            $ other = new WP_User (absint ($ args [0]));
            if ($ other-> has_cap ('administrator')) {
                если (! current_user_can ( 'Администратор')) {
                    $ caps [] = 'do_not_allow';
                }
            }
            ломать;
        по умолчанию:
            ломать;
    }
    return $ caps;
  }

}

$ jpb_user_caps = new JPB_User_Caps ();
 

ИЗМЕНИТЬ

Хорошо, поэтому я взглянул на то, почему это разрешало удаление пользователя. Похоже, что delete_user обрабатывается несколько иначе, чем edit_user; Я изменил метод map_meta_cap, чтобы обойти это. Я тестировал в версии 3.0.3, и это предотвратит удаление, редактирование или создание администратора у кого-нибудь, кроме администраторов.

EDIT 2

Я обновил код, чтобы отразить ответ @ bugnumber9 ниже. Пожалуйста, дайте ответ на этот вопрос!

ответил John P Bloch 25 42010vEurope/Moscow11bEurope/MoscowThu, 25 Nov 2010 01:07:34 +0300 2010, 01:07:34
5

Несмотря на то, что он составляет ~ 7 лет, эта нить легко может быть запущена в Google и по-прежнему обеспечивает рабочее решение. Я имею в виду код, предоставленный @John P Bloch.

Тем не менее, в PHP 7 он производит некритическую ошибку (PHP Устаревший) следующим образом:

  

PHP Устаревшие: методы с тем же именем, что и их класс, не будут   конструкторы в будущей версии PHP; JPB_User_Caps имеет   устаревший конструктор в ...

Чтобы исправить это, просто замените этот кусок:

  //Добавить наши фильтры
  функция JPB_User_Caps () {
    add_filter ('editable_roles', array (& amp; $ this, 'editable_roles'));
    add_filter ('map_meta_cap', массив (& amp; $ this, 'map_meta_cap'), 10,4);
  }
 

с этим:

  //Добавить наши фильтры
  функция __construct () {
    add_filter ('editable_roles', array (& amp; $ this, 'editable_roles'));
    add_filter ('map_meta_cap', массив (& amp; $ this, 'map_meta_cap'), 10, 4);
  }
 

Это устранит проблему.

ответил bugnumber9 2 J000000Sunday17 2017, 12:51:59
2

Я искал решение, в котором редактор мог редактировать только меню И создавать /редактировать пользователей, не нуждаясь в плагине. Поэтому я решил сделать это для тех, кто заинтересован.

  //настраивает роль «Редактор», чтобы иметь возможность изменять меню, добавлять новых пользователей
//и более.
class Custom_Admin {
    //Добавить наши фильтры
    public function __construct () {
        //Разрешить редактору редактировать параметры темы (например, Меню)
        add_action ('init', array ($ this, 'init'));
        add_filter ('editable_roles', array ($ this, 'editable_roles'));
        add_filter ('map_meta_cap', массив ($ this, 'map_meta_cap'), 10, 4);
    }

    public function init () {
        if ($ this-> is_client_admin ()) {
            //Отключить доступ к страницам темы /виджета, если не admin
            add_action ('admin_head', array ($ this, 'modify_menus'));
            add_action ('load-themes.php', array ($ this, 'wp_die'));
            add_action ('load-widgets.php', array ($ this, 'wp_die'));
            add_action ('load-customize.php', array ($ this, 'wp_die'));

            add_filter ('user_has_cap', массив ($ this, 'user_has_cap'));
        }
    }

    public function wp_die () {
        _default_wp_die_handler (__ ('У вас недостаточно прав для доступа к этой странице.));
    }

    public function modify_menus ()
    {
        remove_submenu_page ('themes.php', 'themes.php'); //скрыть подменю выбора темы
        remove_submenu_page ('themes.php', 'widgets.php'); //скрыть подменю виджетов

        //Меню появления
        глобальное $ menu;
        глобальное подменю $;
        if (isset ($ menu [60] [0])) {
            $ menu [60] [0] = «Меню»; //Переименование внешнего вида в меню
        }
        снята с охраны ($ подменю [ 'themes.php'] [6]); //Настроить
    }

    //Удалить «Администратор» из списка ролей, если текущий пользователь не является администратором
    public function editable_roles ($ role) {
        if (isset ($ role ['administrator']) & amp; & amp;! current_user_can ('administrator')) {
            unset ($ role ['administrator']);
        }
        return $ role;
    }

    public function user_has_cap ($ caps) {
        $ caps ['list_users'] = true;
        $ caps ['create_users'] = true;

        $ caps ['edit_users'] = true;
        $ caps ['promotion_users'] = true;

        $ caps ['delete_users'] = true;
        $ caps ['remove_users'] = true;

        $ caps ['edit_theme_options'] = true;
        return $ caps;
    }

    //Если кто-то пытается отредактировать или удалить и admin и этот пользователь не является администратором, не разрешайте его
    public function map_meta_cap ($ caps, $ cap, $ user_id, $ args) {
        //$ args [0] == other_user_id
        foreach ($ caps как $ key => $)
        {
            переключатель ($ cap)
            {
                case 'edit_user':
                case 'remove_user':
                case 'promotion_user':
                    if (isset ($ args [0]) & amp; & amp; $ args [0] == $ user_id) {
                        ломать;
                    }
                    else if (! isset ($ args [0])) {
                        $ caps [] = 'do_not_allow';
                    }
                    //Не разрешать не администратору редактировать admin
                    $ other = new WP_User (absint ($ args [0]));
                    if ($ other-> has_cap ('administrator')) {
                        если (! current_user_can ( 'Администратор')) {
                            $ caps [] = 'do_not_allow';
                        }
                    }
                    ломать;
                case 'delete_user':
                case 'delete_users':
                    if (! isset ($ args [0])) {
                        ломать;
                    }
                    //Не разрешать администратору удалять администратора
                    $ other = new WP_User (absint ($ args [0]));
                    if ($ other-> has_cap ('administrator')) {
                        если (! current_user_can ( 'Администратор')) {
                            $ caps [] = 'do_not_allow';
                        }
                    }
                    ломать;
                ломать;
            }
        }
        return $ caps;
    }

    //Если текущий пользователь называется администратором или администратором и является редактором
    защищенная функция is_client_admin () {
        $ current_user = wp_get_current_user ();
        $ is_editor = isset ($ current_user-> caps ['editor'])? $ current_user-> caps ['editor']: false;
        return ($ is_editor);
    }
}
новый Custom_Admin ();
 
ответил SilbinaryWolf 14 52014vEurope/Moscow11bEurope/MoscowFri, 14 Nov 2014 02:47:53 +0300 2014, 02:47:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132