Restringir el acceso de administrador a ciertas páginas para ciertos usuarios

18 mar 2013, 15:52:16
Vistas: 24K
Votos: 7

Como dice el título, me gustaría restringir el acceso del back-end a ciertas páginas para ciertos usuarios.

Mientras desarrollaba un sitio con 45-50 páginas, me di cuenta que sería una mejor experiencia de usuario si el menú de Páginas solo mostrara aquellas páginas que el usuario debería poder modificar/actualizar.

He probado los siguientes plugins sin éxito. Advanced Access Manager tiene la funcionalidad pero no funciona/tiene errores en la versión 3.5.1.

http://wordpress.org/extend/plugins/advanced-access-manager http://wordpress.org/extend/plugins/role-scoper http://wordpress.org/extend/plugins/adminimize http://wordpress.org/extend/plugins/s2member

¿Algún fragmento de código para functions.php?

3
Comentarios

¿Quieres controlar el acceso por usuario? Es decir, ¿no puedes usar Roles o Capacidades para hacerlo?

s_ha_dum s_ha_dum
18 mar 2013 16:27:49

¡El acceso/visualización basado en Roles o Capacidades funcionará!

BoBoz BoBoz
18 mar 2013 16:31:29

Debería enfatizar que la parte importante es que el usuario/rol especificado no vea ciertas páginas en el back-end. A diferencia de no poder editar ciertas páginas.

BoBoz BoBoz
18 mar 2013 16:36:56
Todas las respuestas a la pregunta 2
7

Este código me ha funcionado bien (en functions.php):

$user_id = get_current_user_id();
if ($user_id == 2) {
    add_filter( 'parse_query', 'excluir_paginas_del_admin' );
}

function excluir_paginas_del_admin($query) {
    global $pagenow,$post_type;
    if (is_admin() && $pagenow=='edit.php' && $post_type =='page') {
        $query->query_vars['post__not_in'] = array('123','234','345');
    }
}
18 mar 2013 18:54:19
Comentarios

Esta es una respuesta muy buena, +1. Ten en cuenta que puedes aceptar tus propias respuestas como correctas...

Johannes Pille Johannes Pille
18 sept 2014 06:10:56

Vale, esto se hará :)

BoBoz BoBoz
18 sept 2014 20:51:33

La respuesta de BoBoz funcionó bien durante un tiempo, pero ahora me aparece una Advertencia: "call_user_func_array() espera que el parámetro 1 sea un callback válido, la función 'exclude_pages_from_admin' no se encuentra o el nombre de la función no es válido". ¿Cuál sería la mejor manera de arreglar este fragmento de código para que no produzca la advertencia? ¡Gracias!

ben.kaminski ben.kaminski
13 ene 2016 21:09:32

Soy nuevo en WordPress. Dime dónde se encuentra el archivo functions.php. ¿Está en la carpeta wp-includes? Si es así, me aparece el error Call to undefined function add_filter().

Nishad Up Nishad Up
18 feb 2016 11:35:11

Actualmente, mi usuario es un "Autor" y no tiene visible el menú "Páginas" en su sección de administración. No quiero aumentar sus permisos más de lo necesario para darle acceso a tres páginas. He puesto el código pero el usuario no tiene forma de acceder a las páginas porque no tienen "Páginas" en el menú izquierdo. ¿Cómo puedo hacer para mostrar ese elemento del menú para que cuando haga clic en él, pueda ver sus tres páginas que tiene permiso para editar? Si no es posible, si al menos pudiera mostrar el enlace "Editar" en la propia página, también funcionaría. Pero este fragmento de código tampoco proporciona esa funcionalidad.

harperville harperville
25 feb 2017 23:48:24

Sé que esto es antiguo, pero los condicionales realmente deberían colocarse dentro de la función llamada para que, sin importar qué, la función siempre exista en lugar de quedar sin declarar (editar) Veo que la respuesta de abajo también explica esto.

Philip Ingram Philip Ingram
15 ago 2019 22:28:25

¿Por qué estamos enlazando a parse_query? ¿Qué hace que este sea el más apropiado? Gracias

JDandChips JDandChips
13 sept 2021 17:09:17
Mostrar los 2 comentarios restantes
1

No me deja comentar, así que estoy agregando esto como una nueva respuesta.

El error:

Warning: "call_user_func_array() expects parameter 1 to be a valid callback, >function 'exclude_pages_from_admin' not found or invalid function name".

... ocurre porque la función solo se llama después de verificar el user_id. Entonces, si no estás conectado como ese usuario, la función no existe y el filtro devuelve ese error, ya que busca la función pero no puede encontrarla.

Por lo tanto, debería ser:

add_filter( 'parse_query', 'exclude_pages_from_admin' );

function exclude_pages_from_admin($query) {
    $user_id = get_current_user_id();

    if ($user_id == 2) {
    global $pagenow,$post_type;
     if (is_admin() && $pagenow=='edit.php' && $post_type =='page') {
        $query->query_vars['post__not_in'] = array('123','234','345');
     }
    }
}
11 ene 2017 18:28:16
Comentarios

Editeé la respuesta original para corregir el registro incorrecto de la devolución de llamada.

Tim Tim
9 jun 2020 16:45:55