Eliminar menú de Custom Post Type para usuarios no administradores

19 ene 2011, 23:06:13
Vistas: 18.7K
Votos: 2

He estado investigando esto todo el día y no he encontrado muchos resultados.

Quiero restringir quién puede ver mis Custom Post Types por nivel de usuario (o de alguna otra manera). Entonces, si la persona que inició sesión no es un 'administrador', los Custom Post Types agregados no son visibles para ellos.

Aquí hay parte de un Custom Post Type que tengo:

add_action('init', 'portfolio_register');

function portfolio_register() {

    $labels = array(
        'name' => _x('Estudios de Caso', 'nombre general del tipo de post'),
        'singular_name' => _x('Ítem de Estudio de Caso', 'nombre singular del tipo de post'),
        'add_new' => _x('Agregar Nuevo', 'ítem de portafolio'),
        'add_new_item' => __('Agregar Nuevo Ítem de Estudio de Caso'),
        'edit_item' => __('Editar Ítem de Estudio de Caso'),
        'new_item' => __('Nuevo Ítem de Estudio de Caso'),
        'view_item' => __('Ver Ítem de Estudio de Caso'),
        'search_items' => __('Buscar Estudios de Caso'),
        'not_found' =>  __('Nada encontrado'),
        'not_found_in_trash' => __('Nada encontrado en la Papelera'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        /*'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',*/
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

Y aquí están las posibles soluciones que encontré que no funcionan para eliminar el menú de Custom Post Type:

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login != 'admin')
    {
        $restricted = array(__('Entradas'),
                            __('Medios'),
                            __('Enlaces'),
                            __('Páginas'),
                            __('Comentarios'),
                            __('Apariencia'),
                            __('Plugins'),
                            __('Usuarios'),
                            __('Herramientas'),
                            __('Ajustes')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// fin while

    }// fin if
}
add_action('admin_menu', 'remove_menus');

Lo anterior funciona para eliminar los elementos del menú predeterminados, pero no pude hacer que eliminara un menú de Custom Post Type. Además, es específico del nombre de usuario, lo cual está bien si pudiera agregar más de un usuario.

global $user_login;
get_currentuserinfo();
   if (!current_user_can('update_plugins')) {
      .......
   }

Lo anterior no funcionó en absoluto.

Gracias.

0
Todas las respuestas a la pregunta 3
2
14

Codex - Registrar Tipo de Entrada

Consulta los argumentos capability_type y capabilities para register_post_type. Puedes pasar al argumento capabilities un array de capacidades para mapearlas a los permisos necesarios, aquí tienes un ejemplo del array de argumentos con capacidades personalizadas.

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => true,
    'capabilities' => array(
        'publish_posts' => 'AÑADIR_CAP_AQUÍ',
        'edit_posts' => 'AÑADIR_CAP_AQUÍ',
        'edit_others_posts' => 'AÑADIR_CAP_AQUÍ',
        'delete_posts' => 'AÑADIR_CAP_AQUÍ',
        'delete_others_posts' => 'AÑADIR_CAP_AQUÍ',
        'read_private_posts' => 'AÑADIR_CAP_AQUÍ',
        'edit_post' => 'AÑADIR_CAP_AQUÍ',
        'delete_post' => 'AÑADIR_CAP_AQUÍ',
        'read_post' => 'AÑADIR_CAP_AQUÍ',
    ),
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
); 

Por supuesto, reemplazarías AÑADIR_CAP_AQUÍ con una capacidad. Si quisieras limitar este tipo de entrada solo a administradores, simplemente usa una capacidad que solo los administradores tengan, como manage_options.

Tabla de roles y sus capacidades (para referencia rápida).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

20 ene 2011 15:27:19
Comentarios

¿Podrías explicarme ADD_CAP_HERE? Necesito ocultar el menú de mi tipo de contenido personalizado para los editores; Tu código no ayudó a ocultar el elemento del menú :(

numediaweb numediaweb
21 jul 2014 00:07:57

@numediaweb -- Desde http://codex.wordpress.org/Roles_and_Capabilities, verás una lista de capacidades para 'Editor' y superiores como 'edit_dashboard' (que te funcionará bien)

Douglas.Sesar Douglas.Sesar
8 dic 2014 16:44:39
1

Bien, después de hacer más búsquedas en Google finalmente encontré una respuesta y la combiné con uno de los scripts anteriores para crear lo que estaba buscando. A continuación está lo que hice por si alguien más está buscando hacer lo mismo:

global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
    .....
}

El código anterior obtendrá el nivel del usuario actual y si tiene permisos para actualizar/editar plugins, entonces tendrá acceso a las funciones contenidas.

add_filter( 'custom_menu_order', 'toggle_custom_menu_order' );

function remove_those_menu_items( $menu_order ){
    global $menu;

    foreach ( $menu as $mkey => $m ) {
        $key = array_search( 'edit.php?post_type=portfolio', $m );
        $keyB = array_search( 'edit.php?post_type=bio', $m );
        $keyC = array_search( 'edit.php?post_type=philo', $m );

        if ( $key || $keyB || $keyC )
            unset( $menu[$mkey] );
    }

    return $menu_order;
}
add_filter( 'menu_order', 'remove_those_menu_items' );

Lo anterior es lo que realmente te permite eliminar los tipos de contenido personalizados del menú de administración. Solo necesitas agregar tantas variables $key como necesites. En lugar de entrar en detalles sobre lo que significa lo anterior, puedes leerlo en el original aquí.

20 ene 2011 12:57:36
Comentarios

¡Ten cuidado con esto cuando uses el plugin WooCommerce, ya que anula la opción de filtrar el menú! Lo solucioné añadiendo add_filter( 'custom_menu_order' , '__return_true', 999);

numediaweb numediaweb
21 jul 2014 00:41:40
2

No sé qué está mal con el código, pero cada vez que necesito limitar elementos del menú a los usuarios, uso: Editor de Menú de Administración, un plugin que hace exactamente eso por ti.

20 ene 2011 01:10:53
Comentarios

Gracias por la respuesta, pero eso no hace realmente lo que necesito hacer. Te permite mover elementos del menú y todo, pero no ocultar elementos del menú para usuarios que no son administradores. Además, preferiría no usar un plugin para esto. Gracias.

jetDL jetDL
20 ene 2011 12:33:14

@Bainternet Normalmente también uso Admin Menu Editor, pero a veces simplemente no reconoce las limitaciones de capacidades que configuro.

User User
5 ene 2012 18:39:48