Avançar para conteúdo

Tudo para WordPress

Plugins, Temas, dicas de WordPress e muito mais para você que busca informação sobre este excelente CMS!

  • Twitter
  • Facebook
  • Google+
  • RSS
Entenda com funciona Assine nosso RSS

Funções de usuários e Capacidades no WordPress – Parte 3: Um exemplo prático

Publicado em 09/09/2013 às 10h00 por Guga Alves

Este artigo é a parte 3 de 3 da série Funções de usuários e Capacidades do WordPress

Esta série de três partes é um tutorial que visa cobrir bem as Funções de usuários e capacidades no WordPress. Esta séria irá cobrir a arquitetura e funcionamento das funções de usuários no WordPress; destacar as funções mais importantes para interação com usuários e gerenciamento de funções e capacidades; e no última parte, mostrar um exemplo prático que demonstra a utilidade da API do WordPress.


Introdução

Este tutorial será focado na construção de uma solução prática, usando os papéis e sistema de capacidades do WordPress. Se você perdeu os dois tutoriais anteriores, sugiro que você volte para os links no começo deste post. A primeira parte “Funções de usuários e Capacidades do WordPress – Parte 1: O básico”, explica o projeto do sistema, enquanto a segunda parte de “Funções de usuários e Capacidades no WordPress – Parte 2: Funções interessantes” se foca nas funções e classes que o WordPress oferece para interagir com o sistema.
A solução proposta neste tutorial é a mesma que o autor original da matéria, fulano, usou para um dos seus plugins Premium. Você pode facilmente adaptá-lo para o seu próprio plugin. O código está disponível no GitHub

Passo 1: Vejamos o Cenário

Vamos abstrair um pouco e imaginar que este plugin está sendo feito para o seguinte cenário: Estamos construindo um plugin para WordPress que tem um painel de administração especial para um cliente. Este painel de administração deve ser acessível apenas para um conjunto limitado de usuários, de um nível específico. Esses usuários podem ser selecionados pelo administrador do blog. Ele pode permitir diferentes funções, usuários ou todos eles para acessar o painel de administração do cliente ou suas funcionalidades.
Além disso, precisamos ter um acesso restrito à biblioteca de mídia para os usuários com acesso ao Painel de Cliente. O WordPress tem uma capacidade especial para acessar e fazer upload de arquivos para a biblioteca de mídia: upload_files. No entanto, isso dá ao usuário (ou papel), o pleno acesso à Biblioteca de mídia. Esta não é uma coisa boa, especialmente que as fotos (ou arquivos) não podem ser hierarquizados em diferentes categorias, onde você pode restringir o acesso para cada um.
Nós precisamos restringir o acesso à biblioteca de mídia apenas para os arquivos que o usuário enviou. Ele não deve ter acesso a envios de outros usuários. Esta restrição deve ser aplicada apenas para os usuários que não têm a capacidade de upload_files. Outros usuários e funções não estão preocupados com essa restrição, uma vez que já tem um acesso total à biblioteca de mídia.
O nosso blog vai ter estas quatro categorias de usuários:
categorias de usuarios
Os dois primeiros conjuntos de usuários são os que não têm acesso ao plugin ‘Painel do Cliente’. Destacamos o fato de que existem usuários que têm acesso à biblioteca de mídia e um conjunto que não tem ese acesso. É essencial que a nossa solução não afete as duas primeiras categorias e deixe suas capacidades intactas.
Com isso em mente, a nossa classe deve fazer duas coisas:

  • Defina as permissões adequadas para o terceiro e quarto conjunto de usuários
  • Ative um acesso restrito a Biblioteca de Mídias para a quarta categoria. Certifique-se de que depois de desativar o plugin ou alterar os direitos dos usuários, que esta categoria de usuários recebe de volta suas permissões originais.

Passo 2: Plugin

Antes de criar a nossa classe, vamos ter uma ideia mais profunda sobre o plugin. O plugin tem uma estrutura bastante simples. Ele é composto de dois menus diferentes: um para o administrador e serve como um painel administrativo, acessível apenas para usuários com uma capacidade de manage_options. O segundo menu é para os clientes e dá acesso ao Painel de Cliente. Este painel requer uma capacidade de wptuts_client_page.
Este recurso não existe no WordPress, precisamos adicionar e atribuí-lo aos usuários ou funções especificados. Mas antes disso, vamos dar uma olhada no plugin.

 

Temos dois ganchos <code>”admin_menu”</code> que agregam o menu de administração, tanto para o administrador quanto para o cliente. Podemos reduzí-lo a apenas um gancho, que acrescenta os dois, mas prefiro separá-los. Cada função <code>”add_menu_page”</code> faz um gancho para outra função que irá exibir o conteúdo da página.
Em seguida, é preciso inicializar a nossa classe de papéis de usuários. O código da classe é colocado em outro arquivo, e o processo de inicialização é feita durante o gancho <code>”init”</code>, que garante que o WordPress terminou de carregar.

A função construtora aceita três parâmetros:

<ul>
<li><em>$all</em> booleano (Opcional) – Se você quiser dar ao cliente o acesso a todos os usuários do blog, você pode definir isso como <em>true</em> e ignorar os restantes parâmetros.</li>
<li><em>$roles</em> vetor (Opcional) – Um vetor com ids dos papéis que terá acesso ao painel do cliente.</li>
<li><em>$users</em> vetor (Opcional) – Um vetor com nomes dos utilizadores que irão ter acesso ao painel de cliente.</li>
</ul>

Passo 3: Classe dos papéis (roles)

A classe tem apenas 3 propriedades: $all, $roles e $users. Estas são as mesmas variáveis ​​que você passa para a função construtora. O valor das variáveis ​​não é alterado no nosso exemplo, mas em um caso prático real, você pode querer as fundir com outra fonte. Para isso, você tem a função set_entities. Você pode utilizado para suas próprias necessidades.

Função Construtora

Em uma primeiro passo, a função construtora inicializa as variáveis $all, $roles e $users utilizando a função set_entitites (). Em seguida, ele chama uma função privada para a criação das capacidades, e outra para a restrição biblioteca de mídia. Estes são exatamente os passos que definimos no nosso cenário.

Funções Estáticas

Funções estáticas não requerem inicialização da classe. Eles são semelhantes às funções independentes, mas simplesmente ligados à classe especificada. Decidimos manter algumas funções estática porque eles podem ser usados ​​de forma independente, e elas podem ser úteis em outro contexto.
Estas funções são filter_roles() e filter_users() e que estes estão associados com duas outras funções role_has_caps() e user_has_caps(). As funções desempenham o papel de um filtro. Eles papéis de filtro (ou usuários), com base nos recursos que têm e não têm.
Ambas aceitam dois argumentos:

  • $include Vetor de capacidades que o papel tem.
  • $exclude Vetor de capacidades que o papel não tem

A função faz um loop por todas as funções e usuários no banco de dados. Para cada função (ou usuário), ele verifica se tem as capacidades necessárias, e não tem a capacidade de excluir. Esta verificação é feita com as funções<code>role_has_caps()</code> e <code>user_has_caps()</code>.
Essas duas funções <code>(role_has_caps () e user_has_caps ())</code> aceitam dois argumentos:
<ul>
<li><code>$role (ou $ user)</code><em>String</em> O ID do papel ou do usuário.</li>
<li><code>$caps</code><em>Vetor</em> Um vetor de capacidades a serem checadas.</li>
</ul>
Se o papel (ou usuário) tem os recursos especificados no array <code>$caps</code>, a função retornará verdadeiro. No outro caso, a função retorna falso. A função basicamente percorre cada capacidade e verifica se o papel (ou usuário) tem a capacidade especificada.

 

Adicionando Permissões

Este é o primeiro passo para organizar nosso plugin. Distribuímos a funcionalidade dele por 3 funções: uma para definir as permissões para todos os usuários, um para definir as permissões aos papéis, e outro para definir as permissões para os usuários especificados. A principal função simplesmente decide que funcão chamar.

A função set_all_permissions () percorre todos os usuários do blog, e adiciona (ou remove) a capacidade wptuts_client, dependendo do valor da variável $all. Temos a lista completa de usuários utilizando a função get_users () e inicializamos um novo objeto wp_user para ter acesso as funções add_cap () e remove_cap ().

A função set_roles_permissions() percorre todos os papéis no blog e elimina a capacidade wptuts_client. Depois disso, ele percorre papéis no array $roles e adiciona a capacidade wptuts_client. O primeiro passo foi assegurar que limpamos a capacidade de papéis podem já ter sido alterados.

A função set_users_permissions() faz a mesma coisa da função acima, mas com a diferença de ser focada em usuários, não em papéis.

Filtro da Biblioteca de Mídias

Agora temos que definir as permissões corretas para as entidades adequadas. (Ser um usuário ou um papel) Temos também que restringir o acesso à biblioteca de mídia para a quarta categoria que distingue no cenário.
Esta categoria de funções (ou utilizadores) tem a capacidade wptuts_client, mas não tem a capacidade upload_files. E é aí que as nossas funções de filtro entram em jogo. Eles vão nos ajudar a filtrar e retornar esta categoria de papéis (ou usuários).
Para esta categoria, vamos adicionar duas capacidades, upload_files e remove_upload_files. O upload_files vai dar pleno acesso à Biblioteca de mídia, e a outra capacidade será usada para retirar a biblioteca de mídia dos posts, e também vai ser usada para remover a capacidade de upload_files uma vez que a capacidade de wptuts_client for removida.

Depois de definir as capacidades para esta categoria, fazemos um gancho no filtro parse_query. Este filtro permite alterar as mensagens retornadas pelo WP_Query. No nosso caso, vamos definir a variável de consulta author. Isto resulta em retornar apenas as mensagens criadas pelo autor especificado.

Resultado final: código completo do plugin

Conclusão

Neste tutorial, usamos o material ensinado nos dois posts anteriorespara criar uma solução personalizada para as funções e capacidades. A solução foi encapsulada em uma classe que pode ser personalizado para suas próprias necessidades ou plugins. Você pode encontrar o código no Github.

Agora sim, você domina tudo sobre Funções(papeis) e Capacidades do WordPress!

Fonte: O texto acima é uma tradução livre do artigo escrito por Abid Omar e publicado originalmente no site WP Tuts

Seja o primeiro a comentar este artigo

Participe e deixe o seu comentário!

Procurando Temas?

Acesse o arquivo de Temas WordPress