Grupos de capacidades: ¿usuarios con múltiples roles?

9

Estoy bastante seguro de que entiendo la configuración de funciones y capacidades en WordPress: capacidades granulares, agrupadas en funciones que pueden asignarse a los usuarios. El código debe verificar las capacidades granulares, no los roles (porque las capacidades para roles particulares pueden cambiar). Los roles no son necesariamente jerárquicos (aunque los roles predeterminados son).

¿Hay alguna forma de asignar múltiples roles a los usuarios? Alternativamente, ¿tener un número de grupos de capacidades y asociar uno o más grupos a un usuario? En la forma en que funciona mi sitio, hay una serie de responsabilidades obvias: actualizar páginas web, moderar foros, actualizar el calendario de eventos, etc. Cada responsabilidad tiene un grupo de capacidades que son necesarias para realizar las tareas asociadas con ella. Me gustaría permitir que un usuario realice una o más responsabilidades. Por lo tanto, el usuario A podría actualizar las páginas web y el calendario de eventos, pero no moderar los foros (no es lo suficientemente discreto), pero el usuario B podría moderar los foros, actualizar el calendario de eventos, pero no está permitido cerca de las páginas web.

A falta de definir un rol para cada posible combinación de responsabilidades, ¿hay alguna forma de hacer esto?

    
pregunta lpryor 26.08.2011 - 09:47

3 respuestas

3

La falta de roles múltiples me ha irritado durante mucho tiempo, ya que la clase WP_User subyacente admite varios roles. Incluso he considerado buscar una solución de software alternativa. @lpryor - después de leer tu publicación, me motivaron a implementarla yo mismo.

Me tomó un número sorprendentemente corto de líneas, aunque tuve que hackear el archivo users.php ya que era demasiado vago para crear un complemento separado para hacerlo por mí. Claramente, esta es la forma incorrecta de hacerlo, por lo que si estoy lo suficientemente motivado en el futuro, puedo intentar hacerlo correctamente.

Si no te importa poder actualizar a la última versión de Wordpress (que deberías), puedes implementar múltiples roles con los fragmentos de código a continuación. Por favor, tenga en cuenta que no soy un experto en wordpress. Acabo de abrir los archivos relevantes e hice los cambios sin tratar de entender todas las implicaciones de lo que estaba haciendo. El código me parece razonable, pero no lo confiaría en mi vida.

(Estoy usando 3.2, por lo que sus números de línea pueden variar) En la clase-wp-users-list-table.php Justo antes de la línea 150 agregue algo como lo siguiente:

<div class="alignleft actions">
    <label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role &hellip;' ) ?></label>
    <select name="remove_role" id="remove_role">
        <option value=''><?php _e( 'Remove role &hellip;' ) ?></option>
        <?php wp_dropdown_roles(); ?>
    </select>
    <?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>

luego cambia la función current_account para que se parezca a esto

function current_action() {
    if ( isset($_REQUEST['changeit']) ) {
        if ( !empty($_REQUEST['new_role']) )
            return 'promote';
        elseif ( !empty($_REQUEST['remove_role']) )
            return 'remove_role';
    }

    return parent::current_action();

}

Ahora en users.php Comenta las líneas 71-76

/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
    $update = 'err_admin_role';
    continue;
}
*/

Reemplace el set_role en la línea 83 con add_role

$user->add_role($_REQUEST['new_role']);

En la línea 92, agregue lo siguiente (Esto es solo una copia y una copia ligeramente editadas de la acción de promoción. No he comprobado que la capacidad de promoción_usuario sea adecuada para eliminar roles)

case 'remove_role':
    check_admin_referer('bulk-users');

    if ( ! current_user_can( 'promote_users' ) )
            wp_die( __( 'You can&#8217;t edit that user.' ) );

    if ( empty($_REQUEST['users']) ) {
            wp_redirect($redirect);
            exit();
    }

    $editable_roles = get_editable_roles();
    if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
            wp_die(__('You can&#8217;t remove that role'));

    $userids = $_REQUEST['users'];
    $update = 'remove_role';
    foreach ( $userids as $id ) {
            $id = (int) $id;

            if ( ! current_user_can('promote_user', $id) )
                    wp_die(__('You can&#8217;t edit that user.'));
            // The new role of the current user must also have promote_users caps
            // Need to think this through
            /*
            if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
                    $update = 'err_admin_role';
                    continue;
            }
            */

            // If the user doesn't already belong to the blog, bail.
            if ( is_multisite() && !is_user_member_of_blog( $id ) )
                    wp_die(__('Cheatin&#8217; uh?'));

            $user = new WP_User($id);
            $user->remove_role($_REQUEST['remove_role']);
    }

    wp_redirect(add_query_arg('update', $update, $redirect));
    exit();

En la línea 370 agregue lo siguiente

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;
    
respondido por el Adi Eyal 01.09.2011 - 20:42
3

Complemento del editor de roles de usuario maneja múltiples roles para un usuario.

Una vez instalado, Usuarios > debajo de cada usuario está la opción de Capacidades. URE trata la primera función de WP como "función principal" y le permite agregar "otras funciones".

    
respondido por el garec 23.05.2013 - 17:09
0

Utilizo el complemento de miembros junto con las capacidades personalizadas creadas.

No puedes asignar varios roles a una persona, pero puedes crear cualquier rol y especificar qué capacidades tiene ese rol.

En los tempaltes, puedes usar algo como current_user_can () .

    
respondido por el Steven 26.08.2011 - 10:26

Lea otras preguntas en las etiquetas