Eliminar la capacidad de acceder a ciertos menús de administración

26 abr 2014, 16:12:06
Vistas: 22.5K
Votos: 3

Estoy tratando de eliminar algunas de las características de administración para un usuario con el rol de colaborador. Con eliminar algunas características de administración me refiero a impedirles ver ciertos elementos del menú de administración, como comentarios, herramientas, medios, etc. He logrado eliminar los elementos que quiero del menú de administración usando este código:

function remove_menus(){

$author = wp_get_current_user();
if(isset($author->roles[0])){ 
    $current_role = $author->roles[0];
}else{
    $current_role = 'no_role';
}

if($current_role == 'contributor'){  
  remove_menu_page( 'index.php' );                  //Panel de control
  remove_menu_page( 'edit.php' );                   //Entradas
  remove_menu_page( 'upload.php' );                 //Medios
  remove_menu_page( 'tools.php' );                  //Herramientas
  remove_menu_page( 'edit-comments.php' );          //Comentarios

}

}
add_action( 'admin_menu', 'remove_menus' );

Funciona perfectamente. El problema al que me enfrento es que puedo simplemente agregar manualmente la cadena de consulta a la URL, por ejemplo /wp-admin/edit.php y eso me llevará a la pantalla de edición de entradas. ¿Alguien sabe una manera de restringir el acceso a estas páginas por completo, además de ocultarlas del menú de administración?

4
Comentarios

¿Qué es exactamente lo que quieres que este usuario pueda hacer? Parece más que necesitas un rol personalizado en lugar de intentar modificar el rol de colaborador de la manera en que lo estás haciendo.

s_ha_dum s_ha_dum
26 abr 2014 18:09:06

Quiero que el usuario pueda editar su perfil y gestionar sus propias publicaciones de un tipo de contenido personalizado. Realmente no creo que necesite un rol personalizado, ya que el de colaborador está haciendo lo que necesito. Solo necesito una forma de evitar que se vean ciertas páginas en el área de administración. Si creo un rol personalizado y les doy la capacidad de gestionar sus propias publicaciones, ¿no ocurriría el mismo problema?

RoseCoder RoseCoder
26 abr 2014 19:45:08

¿Cómo puedo deshabilitar el acceso a la configuración de Woocommerce para un tipo de usuario específico?

MOSD MOSD
1 feb 2021 17:26:42

@MOSD no publiques una pregunta como solución a otra pregunta. Sé que no tienes la reputación suficiente para dejar comentarios en las preguntas de otras personas, pero eso no es excusa, y el sistema anti-spam te marcará como spammer si continúas haciéndolo

Tom J Nowell Tom J Nowell
1 feb 2021 18:03:29
Todas las respuestas a la pregunta 4
1

Al final lo resolví y este es el código que utilicé:

function restrict_menus() {
    $author = wp_get_current_user();

    if( isset( $author->roles[0] ) { 
        $current_role = $author->roles[0];
    } else {
        $current_role = 'no_role';
    }

    if( 'contributor' == $current_role ) {  
        $screen = get_current_screen();
        $base   = $screen->id;


        if( 'edit-post' == $base || 'upload' == $base || 'tools' == $base || 'edit-comments' == $base ) {
            wp_die( '¿Intentando hacer trampa?' );
        }
    }
}
add_action( 'current_screen', 'restrict_menus' );
26 abr 2014 20:55:21
Comentarios

esto fue realmente útil, gracias por seguir con tu propia solución

Snowball Snowball
14 abr 2016 09:16:26
0

Sé que esta pregunta ya ha sido respondida y es antigua. Sin embargo, quería proporcionar una solución alternativa. Así es como lo hice en un plugin que escribí hace un tiempo (he modificado mi código para usar tus páginas).

Como quieres restringir el rol de colaborador, puedes usar capacidades de roles. Los colaboradores no pueden publicar entradas, por lo que podrías hacer lo siguiente.

Parte 1: Eliminar elementos del menú de administración

add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {

    // no hacer nada si el usuario puede publicar entradas
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // eliminar estos elementos del menú de administración
    remove_menu_page( 'edit.php' );          // Entradas
    remove_menu_page( 'upload.php' );        // Medios
    remove_menu_page( 'tools.php' );         // Herramientas
    remove_menu_page( 'edit-comments.php' ); // Comentarios

}

Como dijiste, esto no restringe al usuario de ingresar directamente la URL de la página. Así es como escribí mi restricción de página:

Parte 2: Restringir el acceso a páginas de administración

add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {

    // no hacer nada si el usuario puede publicar entradas
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // recuperar el ID de la página actual
    $current_screen_id = get_current_screen()->id;

    // determinar qué pantallas están prohibidas
    $restricted_screens = array(
        'edit',
        'upload',
        'tools',
        'edit-comments',
    );

    // Restringir acceso a la página
    foreach ( $restricted_screens as $restricted_screen ) {

        // comparar el ID de la pantalla actual contra cada pantalla restringida
        if ( $current_screen_id === $restricted_screen ) {
            wp_die( __( 'No tienes permiso para acceder a esta página.', 'tcd' ) );
        }

    }

}

Para mí, usar capacidades de roles y un array hizo que fuera un poco más fácil trabajar. De todos modos, espero que este método sea útil.

Saludos.

16 mar 2017 00:21:47
0

Normalmente uso (y recomiendo) el plugin Members. Su interfaz de usuario es muy fácil de usar, y tienes la ventaja adicional de almacenar la lógica de roles/permisos en la base de datos (en lugar de en el código), lo que facilita realizar cambios "sobre la marcha".

Este plugin incluso te permite crear un rol personalizado (quizás quieras inventar uno llamado "Editor de Fotos" o "Aprobador de Comentarios", etc.) y limitar qué menús pueden ver y acceder. Creo que esto hará exactamente lo que necesitas.

26 abr 2014 18:14:20
0

Podrías crear un rol personalizado como sugiere s_da_hum o eliminar capacidades del rol de colaborador añadiendo este código al archivo functions.php de tu tema hijo.

add_action( 'init', 'wpsites_remove_contributor_capabilities' );

function wpsites_remove_contributor_capabilities() {

$contributor = get_role( 'contributor' );

$caps = array(
    'edit_posts',
    'delete_posts',
);

foreach ( $caps as $cap ) {

    $contributor->remove_cap( $cap );
    }
}

Fuente https://codex.wordpress.org/Function_Reference/add_role

26 abr 2014 18:57:26