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

9

Estoy bastante seguro de que entiendo los roles y capacidades configurados en WordPress: capacidades granulares, agrupadas en roles 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 sí lo son).

¿Hay alguna forma de asignar múltiples roles a los usuarios? Alternativamente, ¿tener varios 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 a 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 lo suficientemente táctico), 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 combinación posible de responsabilidades, ¿hay alguna forma de hacerlo?

lpryor
fuente
El complemento Role Scoper puede lograr lo que está buscando.
Devin Humbert
Creo que es más por página o por publicación, que no es realmente lo que estoy buscando, pero investigaré un poco más, gracias.
lpryor
@lpryor: Role Scoper tiene múltiples opciones, puede controlar por página y por publicación para usuarios o grupos, pero también por categoría, por taxonomía y por tipo de publicación, por lo que parece que puede lograr lo que Estás después con esto.
Milo
Pruebe este gist.github.com/nikolov-tmw/7808046 Agregue varias casillas de verificación a la selección de roles
OzzyCzech

Respuestas:

3

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

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 por separado para hacerlo por mí. Claramente, esta es la manera incorrecta de hacerlo, así que si estoy lo suficientemente motivado en el futuro, podría intentar hacerlo correctamente.

Si no le importa poder actualizar a la última versión de Wordpress (que debería), puede implementar múltiples roles con los fragmentos de código a continuación. 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 confiaría en mi vida.

(Estoy usando 3.2, por lo que sus números de línea pueden variar) En class-wp-users-list-table.php justo antes de la línea 150 agregue algunos como los siguientes:

<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 cambie la función current_account para parecerse 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 Comente 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 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 pegado ligeramente editado de la acción de promoción: no lo he verificado para asegurarme de que la capacidad de promover_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;
Adi Eyal
fuente
Esto se ve genial, @ adi-eyal, ¡muchas gracias! Me abriré camino y lo probaré.
lpryor
@lpryor oye, ¿me preguntaba si lograste implementar múltiples roles sin hackear el código central de WP? ¡Sería genial saberlo! No pude encontrar ningún complemento, pero al mismo tiempo no quiero hackear el código WP central. ¡Gracias!
dashaluna
@dashaluna No he podido llegar a esto todavía, ¡pero se está acercando a la parte superior de mi lista!
lpryor
55
Hackear núcleos como este no es el camino a seguir. Esto se eliminaría en cualquier actualización del núcleo de WordPress. Engancharlo u olvidarlo, lo siento, pero esto (aunque funcione) no es nada que deba recomendarse.
kaiser
Actualizar el núcleo no es una buena práctica. Use ganchos de acción / filtro en su lugar.
Sufi
3

El complemento Editor de roles de usuario maneja múltiples roles para un usuario.

Una vez instalado, Usuarios> debajo de cada usuario es la opción Capacidades. URE trata el primer rol de WP como "rol principal" y le permite agregar "otros roles".

garec
fuente
0

Uso el complemento Miembros junto con capacidades creadas a medida.

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

En las plantillas, puede usar algo como current_user_can () .

Steven
fuente
Sí, me doy cuenta de eso. Pero me preguntaba si hay alguna forma de no tener que definir un rol separado para cada combinación posible de responsabilidades. La combinatoria podría hacer que no sea muy divertido y propenso a errores.
lpryor
No encontré mucho en Google. Lo más cercano que obtuve fue este hilo: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven