Na primeira parte deste artigo vimos que os Papéis(Roles) agora têm sido parte integrante do WordPress já há algum tempo, sendo que muitas funções associadas à gestão deles estão em vigor desde a versão 2.0.0. Apesar dessa longevidade, eles raramente são utilizados como foram planejados, o que é uma pena, uma vez que permitem a fácil configuração e extensão dos tipos de usuário personalizadas (e também têm a capacidade de gerenciá-los).

Como vimos anteriormente Capacidades ou Permissões são o núcleo do sistema, que representam as coisas que você pode fazer. Um exemplo de uma permissão é o switch_themes. Um usuário que tem essa permissão será capaz de mudar o visual do site usando a seção Aparência no admin. Aqueles que não têm esta permissão não poderão fazê-lo.

Os papéis são simplesmente um conjunto nomeado de permissões. Imagine que você tem as seguintes permissões add_user, edit_post, e assim por diante. Em vez de listar todas as mais de 50 permissões para cada usuário que você gostaria que atuassem como um administrador,  você simplesmente atribui a cada usuário a função de “admin” e em seguida, atribui todas as capacidades para este papel.

A configuração padrão oferecido pelo WordPress está muito bem desenhada e estruturada, de forma que você não deveria modificá-la, e sim apenas adicionar novos papeis e permissões. Se ela for alterada, você poderá enfrentar problemas difíceis de resolver no futuro – como um contribuidor poder ser capaz de remover as mensagens do seu site, e um administrador não ser capaz de mudar o tema, só para citar alguns.

Roles

Então quando são necessários adicionar novos Papéis e Permissões?

Novos papéis geralmente vêm de mãos dadas com novas capacidades(permissões). Normalmente, defini,os um conjunto de novas permissões, que são realizadas por um administrador (e um novo papel, também).

Vamos supor que você tenha um site grande, suponhamos que você tenha uma equipe de marketing. Essa equipe, em primeiro momento, eles não precisam de ser capaz de editar e publicar posts, mas eles precisam ter acesso as estatísticas de publicidade, trending topics de pesquisa, etc Talvez, também seria benéfico permitir que gerenciem as categorias e os comentários para fins de SEO e satisfação do cliente , respectivamente.

Assim nossa primeira regra de negócio será a de permitir o acesso as estatísticas de publicidade e os trending topics de pesquisa. Por padrão o WordPress não nos oferece isto, então vamos supor que tenha sido construído um plugin. Onde iremos criar um recurso chamado view_stats. Que será atrobuido a equipe de marketing e, claro, para o administrador. Os demais usuários – como editores e autores – não terão este recurso(que, em muitos casos, são dados sensíveis).

Nossa segunda tarefa é decidir o que outras capacidades nosso pessoal de marketing precisa. Com base em nossas premissas acima, eles terão a leitura, manage_links, manage_categories e capacidades moderate_comments.

Como segunda tarefa será decidir quais outros recursos nossa equipe de marketing necessitará. Com base em nossas premissas acima, eles devem possuir capacidade de read, manage_links, manage_categories e o recurso de moderate_comments.

Para o nosso caso então precisaremos codificar um novo papel que iremos nomea-lo de “Marketing”e atribuiremos os recursos mencionado acima para este novo papel. Uma vez que isso foi feito, nós teremos a capacidade de atribuir o Papel de “Marketing” para qualquer usuário em “Adicionar Usuário” ou “Editar perfil”.

Funções básicas do WordPress

Para gerenciar os Papéis e Permissões efetivamente, tudo o que precisamos é conhecer 5 funções simples, porém poderasas:

  • add_role() – Nos possibilita adiciona um novo Papel Personalizado
  • remove_role() – Nos possibilita remover um Papel Personalizado adicionado com a função anterior
  • add_cap() – Nos possibilita adicionar uma nova Permissão Personalizada
  • remove_cap() – Nos possiblita remover uma Permissão adicionada com a função anterior
  • get_role() – Usamos para obter informções sobre um Papel e suas permissões associadas

Recomendo a você desenvolvedor que leia a página de Documentação sobre estas funções contendo maiores detalhes no Codex.

Implementando um novo Papel e Permissões

A implementação completa de funções e capacidades exige mais do que apenas as cinco funções que eu mencionei anteriormente. Também precisaremos de funções adicionais que nos ajude com as verificações, pois iremos precisar de recursos que estão disponíveis apenas para certos papéis, e assim por diante.
O trecho de código a seguir mostra como fazer o que discutimos até este ponto.

$marketing = add_role(array(
'read' => true,
'manage_links',
'manage_categories',
'moderate_commets',
'view_stats'
));
$administrator = get_role('administrator');
$administrator->add_cap('view_stats');

O código acima irá adicionar o nosso novo papel “Marketing” e junto a ele também adicionamos 4 permissões que já estão incluídos no WordPress e uma quinta permissão que é um recurso personalizado. Como podemos concluir ao ler o código que nenhuma codificação especial foi necessária para adicionar os novos recursos – apenas incluí-los na matriz ao adicionar o papel. As duas últimas linhas são importantes, lembre-se sempre de adicionar as novas permissões ao Papel do Administrador.

Note que a função add_role() retorna um objeto WP_Role no sucesso ou NULL caso já exista este novo papel.

Aquí vale uma dica, sempre que precisar alterar o comportamento padrão do WordPress, utilize-se de um plugin próprio ao invés de adicionar ao functions.php do seu tema. Vamos utilizar um gancho para adicioanar o novo papel e adiciona-lo ao Administrador se o mesmo foi atribuido da forma que planejamos.

add_action( 'admin_init', 'register_marketing_role' );
function register_marketing_role() {
$marketing = add_role(array(
'read' => true,
'manage_links',
'manage_categories',
'moderate_comments',
'view_stats',
));

//Adicionamos a nova permissão no sucesso acima

if( null !== $marketing ) {
$administrator = get_role('administrator');
$administrator->add_cap('view_stats');
}
}

Verificando os Papéis e as Permissões

Uma vez que temos o nosso sistema no lugar, ou seja informamos das novas capacidades, então podemos fazer uso da verificação. Isto nos permite ter certeza de que apenas os usuários com as permissões adequadas podem fazer o que lhe foi atribuído.
O trecho de código a seguir adiciona uma nova página ao menu e verifica que somente os usuários com a permissão view_stats podem acessa-la, vejamos:

add_action('admin_menu', 'register_stats_menu_page');
function register_stats_menu_page() {
add_menu_page( 'Página de estatísticas', 'Página de estatísticas', 'view_stats', 'stats_info', 'show_stats_info' );
}

function show_stats_info() {
if( ! current_user_can( 'view_stats' ) )
wp_die('Você não está autorizado a ver esta página!');

echo "Página de estatísticas para uso do Marketing";
}

O código acima irá adicionar um menu de nível superior no admin para a nossa página de estatísticas. A função add_menu_page() permite que você especifique um recurso (o terceiro argumento), que determina se o menu debe ou não ser mostrado.

Repare que embora a função add_menu_page () em sua assinatura permite definir a permissão como um argumento, mas ainda assim precisaremos verifica-lo na função que irá exibir o conteúdo da página.
E aproveitaremos esse gancho para introduzir duas novas funções: current_user_can() e user_can().
Sempre que você quiser verificar se o usuário logado possui uma determinada permissão você deve escrever seguinte o código:

if( current_user_can( 'a_permissao_a_ser_verificada' ) ) {
//O usuário possui a permissão
} else {
// O usuário não possui a permissão
}

Se por um motivo ou outro você precisar verificar se um determinado usuário possui uma determinada permissão utilize-se da função user_can():

if( user_can( 24, 'a_permissao_a_ser_verificada' ) ) {
// O usuário cujo ID é 24 possui a permissão
} else {
//O usuário cujo ID é 24 não possui a referida permissão
}

Essas funções são tão poderosas que podemos verificar ambos os casos fazendo:

if( current_user_can( 'marketing' ) ) {
// O usuário está no grupo "Marketing"
} else {
// O usuário não pertence ao "Marketing"
}

Agora que conhecemos os recursos, na última parte deste artigo veremos como implentar vários tipos de usuários ao WordPress e integra-los não somente no Admin como no Frontend.

Abraços!