Grupos de capacidades: usuários com múltiplas funções?

9

Tenho certeza que entendo a configuração de funções e recursos no WordPress: recursos granulares, agrupados em funções que podem ser atribuídas a usuários. O código deve verificar os recursos granulares, não as funções (porque os recursos para funções específicas podem mudar). As funções não são necessariamente hierárquicas (embora as funções padrão sejam).

Existe alguma maneira de atribuir várias funções aos usuários? Como alternativa, ter vários grupos de recursos e associar um ou mais grupos a um usuário? A maneira como meu site funciona, há uma série de responsabilidades óbvias: atualizar páginas da web, moderar fóruns, atualizar o calendário de eventos e assim por diante. Cada responsabilidade tem um grupo de recursos necessários para executar as tarefas associadas a ela. Gostaria de permitir que um usuário execute uma ou mais responsabilidades. Assim, o usuário A pode atualizar páginas da Web e o calendário de eventos, mas não moderar os fóruns, mas o usuário B pode moderar fóruns, atualizar o calendário de eventos, mas não é permitido perto das páginas da Web.

Falta de definir um papel para cada possível combinação de responsabilidades, existe alguma maneira de fazer isso?

    
por lpryor 26.08.2011 / 09:47

3 respostas

3

A falta de papéis mutiple me irritou por um longo tempo desde que a classe WP_User subjacente suporta vários papéis. Eu até considerei procurar uma solução de software alternativa. @lpryor - depois de ler o seu post, fui motivado a implementá-lo sozinho.

Levou um número surpreendentemente curto de linhas para fazer, embora eu tenha tido que hackar o arquivo users.php desde que eu estava com preguiça de criar um plugin separado para fazer isso por mim. Claramente esta é a maneira errada de fazê-lo, por isso, se estiver motivado o suficiente no futuro, posso tentar fazê-lo corretamente.

Se você não se importa em poder atualizar para a versão mais recente do Wordpress (o que você deveria) - você pode implementar várias funções com os trechos de código abaixo. Por favor, tenha em mente que eu não sou um especialista em wordpress. Acabei de abrir os arquivos relevantes e fiz as alterações sem tentar entender todas as implicações do que estava fazendo. O código parece razoável para mim, mas eu não confiaria na minha vida.

(estou usando o 3.2 para que seus números de linha possam variar) Na classe wp-users-list-table.php logo antes da linha 150, adicione algumas como as seguintes:

<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>

altere a função current_account para algo parecido com isto

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();

}

Agora em users.php Comente as linhas 71-76

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

Substitua o set_role na linha 83 por add_role

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

Na linha 92, adicione o seguinte: (Esta é apenas uma cópia e colagem levemente editadas da ação de promoção - não verifiquei se o recurso promote_user é apropriado para remover funções)

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();

Na linha 370, adicione o seguinte

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

O plug-in do Editor de funções do usuário lida com várias funções para um usuário.

Após a instalação, os usuários > sob cada usuário é a opção Capabilities. O URE trata o primeiro papel do WP como "papel principal" e permite que você adicione "outros papéis".

    
por garec 23.05.2013 / 17:09
0

Eu uso o plug-in do Members junto com recursos personalizados criados.

Não é possível atribuir várias funções a uma pessoa, mas você pode criar todas as funções e especificar quais recursos essa função possui.

Nos tempaltes, você pode usar algo como current_user_can () .

    
por Steven 26.08.2011 / 10:26