Editor puede crear cualquier usuario nuevo, excepto el administrador

34

He configurado un sitio de WordPress para un cliente. El cliente tiene el rol de Editor, sin embargo, he instalado el complemento de miembros y le he dado al cliente la capacidad de agregar nuevos usuarios a El administrador de WP. Esto está funcionando bien.

La pregunta que tengo es que me gustaría que el cliente tenga la capacidad de crear un nuevo usuario como con los roles de un Contribuidor, Suscriptor, Editor y Autor, pero NO Administrador. Los nuevos usuarios que el cliente crea no deben tener el rol de Administrador. ¿Es posible ocultar esta opción de alguna manera?

Gracias Vayu

    
pregunta Vayu 24.11.2010 - 11:34

3 respuestas

33

En realidad es bastante fácil. Debe filtrar en map_meta_caps y evitar que los editores creen / editen administradores, y eliminar la función de administrador de la matriz de "funciones editables". Esta clase, como complemento o en el archivo functions.php de tu tema, lo haría:

class JPB_User_Caps {

  // Add our filters
  function __construct(){
    add_filter( 'editable_roles', array($this, 'editable_roles'));
    add_filter( 'map_meta_cap', array($this, 'map_meta_cap'), 10, 4);
  }

  // Remove 'Administrator' from the list of roles if the current user is not an admin
  function editable_roles( $roles ){
    if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
      unset( $roles['administrator']);
    }
    return $roles;
  }

  // If someone is trying to edit or delete and admin and that user isn't an admin, don't allow it
  function map_meta_cap( $caps, $cap, $user_id, $args ){

    switch( $cap ){
        case 'edit_user':
        case 'remove_user':
        case 'promote_user':
            if( isset($args[0]) && $args[0] == $user_id )
                break;
            elseif( !isset($args[0]) )
                $caps[] = 'do_not_allow';
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        case 'delete_user':
        case 'delete_users':
            if( !isset($args[0]) )
                break;
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        default:
            break;
    }
    return $caps;
  }

}

$jpb_user_caps = new JPB_User_Caps();

EDITAR

Ok, así que eché un vistazo a por qué estaba dejando pasar la eliminación del usuario. Parece que delete_user se maneja de forma ligeramente diferente a edit_user; He modificado el método map_meta_cap para solucionar esto. He probado la versión 3.0.3 y esto evitará que nadie, excepto los administradores, elimine, edite o cree un administrador.

EDIT 2

Actualicé el código para reflejar la respuesta de @ bugnumber9 a continuación. ¡Por favor, dale un voto a esa respuesta!

    
respondido por el John P Bloch 24.11.2010 - 23:07
5

A pesar de tener ~ 7 años, este hilo se puede buscar en Google fácilmente y aún ofrece una solución de trabajo. Me refiero al código proporcionado por @John P Bloch.

Dicho esto, en PHP 7 se produce un error no crítico (PHP en desuso) de la siguiente manera:

  

PHP obsoleto: los métodos con el mismo nombre que su clase no serán   constructores en una futura versión de PHP; JPB_User_Caps tiene un   constructor obsoleto en ...

Para solucionar esto, simplemente reemplaza esta pieza:

// Add our filters
  function JPB_User_Caps(){
    add_filter( 'editable_roles', array(&$this, 'editable_roles'));
    add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
  }

con esto:

// Add our filters
  function __construct() {
    add_filter( 'editable_roles', array(&$this, 'editable_roles') );
    add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'), 10, 4 );
  }

Esto solucionará el problema.

    
respondido por el bugnumber9 02.07.2017 - 11:51
2

Estaba buscando una solución donde el Editor pudiera editar solo los menús Y crear / editar usuarios sin necesidad de un complemento. Así que terminé haciéndolo para aquellos que estén interesados.

// Customizes 'Editor' role to have the ability to modify menus, add new users
// and more.
class Custom_Admin {
    // Add our filters
    public function __construct(){
        // Allow editor to edit theme options (ie Menu)
        add_action('init', array($this, 'init'));
        add_filter('editable_roles', array($this, 'editable_roles'));
        add_filter('map_meta_cap', array($this, 'map_meta_cap'), 10, 4);
    }

    public function init() {
        if ($this->is_client_admin()) {
            // Disable access to the theme/widget pages if not 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', array($this, 'user_has_cap'));
        }
    }

    public function wp_die() {
        _default_wp_die_handler(__('You do not have sufficient permissions to access this page.'));
    }

    public function modify_menus() 
    {
        remove_submenu_page( 'themes.php', 'themes.php' ); // hide the theme selection submenu
        remove_submenu_page( 'themes.php', 'widgets.php' ); // hide the widgets submenu

        // Appearance Menu
        global $menu;
        global $submenu;
        if (isset($menu[60][0])) {
            $menu[60][0] = "Menus"; // Rename Appearance to Menus
        }
        unset($submenu['themes.php'][6]); // Customize
    }

    // Remove 'Administrator' from the list of roles if the current user is not an admin
    public function editable_roles( $roles ){
        if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
            unset( $roles['administrator']);
        }
        return $roles;
    }

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

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

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

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

    // If someone is trying to edit or delete and admin and that user isn't an admin, don't allow it
    public function map_meta_cap( $caps, $cap, $user_id, $args ){
        // $args[0] == other_user_id
        foreach($caps as $key => $capability)
        {
            switch ($cap)
            {
                case 'edit_user':
                case 'remove_user':
                case 'promote_user':
                    if(isset($args[0]) && $args[0] == $user_id) {
                        break;
                    }
                    else if(!isset($args[0])) {
                        $caps[] = 'do_not_allow';
                    }
                    // Do not allow non-admin to edit admin
                    $other = new WP_User( absint($args[0]) );
                    if( $other->has_cap( 'administrator' ) ){
                        if(!current_user_can('administrator')){
                            $caps[] = 'do_not_allow';
                        }
                    }
                    break;
                case 'delete_user':
                case 'delete_users':
                    if( !isset($args[0])) {
                        break;
                    }
                    // Do not allow non-admin to delete admin
                    $other = new WP_User(absint($args[0]));
                    if( $other->has_cap( 'administrator' ) ){
                        if(!current_user_can('administrator')){
                            $caps[] = 'do_not_allow';
                        }
                    }
                    break;
                break;
            }
        }
        return $caps;
    }

    // If current user is called admin or administrative and is an editor
    protected function is_client_admin() {
        $current_user = wp_get_current_user();
        $is_editor = isset($current_user->caps['editor']) ? $current_user->caps['editor'] : false;
        return ($is_editor);
    }
}
new Custom_Admin();
    
respondido por el SilbinaryWolf 14.11.2014 - 00:47

Lea otras preguntas en las etiquetas