Grupos de recursos: usuários com várias funções?


9

Tenho certeza de que entendo as funções e os recursos configurados no WordPress: recursos granulares, agrupados em funções que podem ser atribuídas aos usuários. O código deve verificar os recursos granulares, não os papéis (porque os recursos de papéis específicos 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 um número de grupos de recursos e associar um ou mais grupos a um usuário? Da maneira como meu site funciona, há várias responsabilidades óbvias: atualizar páginas da Web, moderar fóruns, atualizar o calendário de eventos e assim por diante. Cada responsabilidade possui 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 as páginas da web e o calendário de eventos, mas não modera os fóruns (não é muito diplomático o suficiente), mas o usuário B pode moderar os fóruns, atualizar o calendário de eventos, mas não é permitido nas páginas da web.

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


O plug-in Role Scoper pode conseguir o que você está procurando.
Devin Humbert

Acho que é mais por página ou por postagem, o que não é exatamente o que estou procurando, mas vou investigar um pouco mais, obrigado.
Lpryor 26/08/11

@lpryor - O Role Scoper tem várias opções, você pode controlar por página e por postagem para usuários ou grupos, mas também por categoria, por taxonomia e por tipo de postagem, para que você consiga alcançar o que deseja. é depois disso.
Milo

Tente este gist.github.com/nikolov-tmw/7808046 Adicione várias caixas de seleção para seleção Role
OzzyCzech

Respostas:


3

A falta de várias funções me irrita há muito tempo, já que a classe WP_User subjacente suporta várias funções. Eu até considerei procurar uma solução de software alternativa. @ lpryor - depois de ler sua postagem, fiquei motivado a implementá-la eu mesmo.

Demorou um número surpreendentemente curto de linhas para fazer, embora eu tenha tido que hackear o arquivo users.php desde que fiquei com preguiça de criar um plugin separado para fazer isso por mim. Claramente, esta é a maneira errada de fazê-lo; se eu 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ê deve) - 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 nele com a minha vida.

(Estou usando o 3.2 para que seus números de linha possam variar) Na classe-wp-users-list-table.php, imediatamente antes da linha 150, adicione alguns como os 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>

então mude 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 editada da ação de promoção - não verifiquei se o recurso promover_usuário é 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;

Isso parece ótimo, @ adi-eyal, muito obrigado! Vou trabalhar o meu caminho e experimentá-lo.
Lpryor 6/09/11

@lpryor hey, estava me perguntando se você conseguiu implementar várias funções sem invadir o código principal do WP? Seria ótimo saber! Não consegui encontrar nenhum plug-in, mas ao mesmo tempo não quero invadir o código principal do WP. Obrigado!
Dashaluna #

@dashaluna Ainda não consegui chegar a esse ponto, mas está chegando ao topo da minha lista!
lpryor

5
Hacking core como este não é o caminho a percorrer. Isso seria removido em qualquer atualização do núcleo do WordPress. Enganche ou esqueça - desculpe, mas isso é (mesmo que funcione) nada que deva ser recomendado.
Kaiser

Atualizar o núcleo não é uma boa prática. Use ganchos de ação / filtro.
тнє Sufi

3

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

Uma vez instalado, Usuários> em cada usuário é a opção Recursos. O URE trata a primeira função do WP como "função principal" e permite adicionar "outras funções".


0

Eu uso o plugin Members junto com recursos personalizados criados.

Você não pode atribuir várias funções a uma pessoa, mas pode criar quaisquer funções e especificar quais recursos essa função possui.

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


Sim, eu percebo isso. Mas eu queria saber se há alguma maneira de não ter que definir uma função separada para cada combinação possível de responsabilidades. A combinatória pode torná-lo não muito divertido e propenso a erros.
Lpryor

Não encontrei muito pesquisando no Google. O mais próximo que cheguei foi desse tópico: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.