Restringir la vista de tipos de contenido personalizados por rol de usuario

23 abr 2013, 18:06:36
Vistas: 23.2K
Votos: 5

He creado un tipo de contenido personalizado y varios roles de usuario personalizados, y quiero poder restringir la vista del tipo de contenido según roles específicos.

¿Existe alguna manera directa de restringir esto?

2
Comentarios

Por favor, pega tu código. ¿Qué has intentado hasta ahora?

Brad Dalton Brad Dalton
12 ene 2014 23:53:50
Todas las respuestas a la pregunta 4
0

Cada rol tiene capacidades.

Aquí hay un simple colaborador para nuestro proyecto: (solo escribe y edita)

add_role('contributor', 'Contributor', array(
    'read' => true,
    'edit_posts' => true,
    'delete_posts' => false,
));

Ahora él tiene una nueva capacidad (puede editar publicaciones de otras personas)

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');

Ahora para agregar sus nuevas capacidades para nuestro nuevo tipo de publicación. Primero creemos el tipo de publicación:

function create_myposttype()
{
    register_post_type(
        'myposttype',
        array(
            'public' => true,
            'capability_type' => 'myposttype',
            'capabilities' => array(
                'publish_posts' => 'publish_myposttypes',
                'edit_posts' => 'edit_myposttypes',
                'edit_others_posts' => 'edit_others_myposttypes',
                'read_private_posts' => 'read_private_myposttypes',
                'edit_post' => 'edit_myposttype',
                'delete_post' => 'delete_myposttype',
                'read_post' => 'read_myposttype',
            ),
        )
    );
}
add_action('init', 'create_myposttype');

El tipo de publicación está creado pero el colaborador no tiene poder sobre él. Vamos a darle algo de poder:

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('read_myposttype');
    $role->add_cap('edit_myposttypes');
    $role->add_cap('delete_myposttype', false); // para estar seguros
}
add_action('admin_init', 'add_capability');

La capacidad read_post y read_* asegura que el usuario con ese rol asignado no podrá ver y acceder a esa área actual. Obtendrá ese error genérico de WordPress:

No tienes permisos suficientes para acceder a esta página

Y hagamos que nuestros autores (ese rol predeterminado) no puedan ver las publicaciones de myposttype:

function remove_author_capability()
{
    $role = get_role('author');
    $role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');

Recuerda limpiar:

function add_roles_on_activation() // agregar roles en la activación
{
    add_role('contributor', 'Contributor', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => false,
    ));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');

function add_roles_removal()  // limpiamos después de nosotros
{
    remove_role('contributor');
}
register_deactivatin_hook(__FILE__, 'add_roles_removal');

Ahora si solo quieres eliminar elementos del menú (haciéndolos accesibles por URL de todos modos) aquí está cómo:

Desde la barra de administración (ese pequeño menú flotante superior):

function my_edit_adminbar($wp_admin_bar)
{
    if(current_user_can('read_myposttype'))
        $wp_admin_bar->remove_node('new-myposttype');
}
add_action('admin_bar_menu', 'my_edit_adminbar');

Desde el menú:

function my_edit_menu()
{
    if(current_user_can('read_myposttype'))
    {
        $slug = 'edit.php?post_type=myposttype';
        remove_menu_page($slug);
    }
}
add_action('admin_menu', 'my_edit_menu');
3 sept 2014 19:46:10
1

Bueno... no veo ningún código... así que no sé si creaste el tipo de entrada personalizado tú mismo o usaste un plugin. Estoy asumiendo que creaste el tipo de entrada personalizado en functions.php. Allí puedes tener una declaración if para verificar si el usuario tiene ciertas capacidades.

<?php current_user_can( $capability, $args ); ?>

Realmente ayudaría si pudieras publicar algo de código, para que pueda dar un ejemplo específico de cómo hacer esto.

http://codex.wordpress.org/Function_Reference/current_user_can

23 abr 2013 18:34:19
Comentarios

Esto aplica a capacidades y no a roles. Debido a que la configuración se guarda en la base de datos wp_user_roles, cualquier función solo debería ejecutarse una vez.

Brad Dalton Brad Dalton
13 ene 2014 00:17:09
0

En primer lugar, aquí te muestro cómo podemos obtener el rol del usuario actual.

<?php 

// Obtener el ID del usuario actual
$user_id = get_current_user_id(); 

// Obtener los datos del usuario basados en este ID
// devueltos en un array
$user_data = new WP_User( $user_id );


// Podríamos mostrar el primer elemento del rol  
// en el array así...
echo $user->roles[0];


// O podríamos imprimir todo el
// array de esta manera
print_r($user->roles);

?> 

Ahora podríamos usar los datos anteriores para construir una simple declaración condicional en las plantillas. Esto variará dependiendo de lo que estés intentando lograr, pero...

<?php 

$user_roll = $user->roles[0];
if($user_roll =="administrator") {

    // El código aquí solo se ejecutará si el usuario
    // actual es un administrador
}
?> 

Ya captas la idea ;)

28 may 2014 02:24:08
0

Al registrar un Custom Post Type (CPT) utilizamos el hook de acción init:

add_action( 'init', 'mi_funcion_de_tipo_de_entrada_personalizado', 0 );

Lo que necesitamos es colocar una condición de rol de usuario alrededor de este registro específico de CPT en dos pasos:

1. Tener una función que devuelva el rol del usuario actual como una cadena

    function mi_obtener_rol_de_usuario_actual() {
     $usuario = wp_get_current_user();
     $roles = (array)$usuario->roles;
     return $roles[0];
    }

2. Luego restringir

    if(mi_obtener_rol_de_usuario_actual() == 'administrator'){
     add_action( 'init', 'mi_funcion_de_tipo_de_entrada_personalizado', 0 );
    }
1 dic 2021 17:37:04