O conteúdo é parte essencial de um site. Definir a estrutura do projeto passa pelo estudo do conteúdo que será divulgado, como também pela relação que os usuários terão com essas informações. No WordPress temos o recurso de Usuários que por sua vez são gerenciados pelas Roles e Capabilities. Essas definições permitem definir o acesso de cada usuário, concedendo ou limitando seu acesso a determinadas informações, áreas do site e ações a serem executadas.

Para ilustrar todo o processo de criação de usuários, atribuição de permissões, processo de entrada e saída do sistema e o uso de meta dados; você poderá acompanhar a criação de um site cujo gerenciamento se dá de modo compartilhado por diferentes utilizadores e níveis de acesso.

ema WordPress do projeto Entrelinhas

Tema WordPress do projeto Entrelinhas

O projeto consiste em um site onde os usuários possam publicar seus artigos e seja capaz de limitar seu acesso somente para pessoas autorizadas. O projeto baseia-se em:

  • Permitir o envio de conteúdo por diferentes autores;
  • Manter o acesso restrito ao conteúdo para usuários identificados;
  • Caso o visitante do site não esteja logado deverá exibir um único texto fixo, porém editável pelo painel administrativo;
  • Criar um formulário de entrada no site;
  • Todo usuário cadastrado apenas com permissão de leitura deve possuir em seu cadastro o nome da empresa para a qual trabalha.

Sabendo que a integração do conteúdo é extensível a praticamente qualquer tipo de informação utilizando os Tipos Personalizados de Posts, logo você tende a pensar que qualquer conteúdo deve ser tratado como tal; e realmente pode. No entanto em alguns casos todo o processo de registro e tratamento do CPT não é necessário para o projeto.

Perceba que o projeto Entrelinhas necessita apenas que uma tela de conteúdo dinâmico seja apresentada na home do site. Nesse caso não será preciso criar um novo tipo de conteúdo chamado Home Page, por exemplo. Em vez disso opte por trabalhar com os Modelos de Páginas e em meio a integração faça uso de consultas diretas ao banco de dados para otimização o trabalho.

$wpdb para consultas SQL no WordPress

As operações de banco de dados são feitas mediante as funções do WordPress sem que exista a necessidade de se definir nenhuma instrução SQL. No entanto para situações específicas onde os resultados recuperados são mais que o necessário ou mesmo para trabalhar com tabelas próprias, o WordPress oferece a classe $wpdb para manipulação da base de informações.

A classe pode ser utilizada a partir do momento em que você a recupera do contexto global para o escopo do Tema. No projeto atual está definida a presença de um conteúdo dinâmico na Home do site caso o visitante não esteja logado. Esse conteúdo será definido como uma Template Page.

A recuperação dessa template page pode ser feita de diferentes modos; seja com get_posts, get_pages ou mesmo get_page_by_path onde você determina o slug completo da página a ser recuperado. Porém em get_posts e get_pages muita informação é recuperada, são retornados todos os campos do conteúdo recuperado; enquanto que get_page_by_path qualquer mudança na slug da página colocaria o funcionamento do site em risco.

Nessa situação opte por utilizar o acesso direto ao banco de dados a fim de recuperar apenas o identificador da página que possui o template desejado:

function pw_get_template( $template )
{
    global $wpdb;
    $page_id = (int) $wpdb->get_var(
        $wpdb->prepare(
            "SELECT p.ID FROM {$wpdb->posts} p
            INNER JOIN {$wpdb->postmeta} pm ON p.ID=pm.post_id
            WHERE pm.meta_key='_wp_page_template'
            AND pm.meta_value=%s
            AND p.post_type='page'
            ORDER BY p.post_date DESC
            LIMIT 1",
            $template
        )
    );
    return get_page( $page_id );
}

Especado o uso da classe $wpdb, foi feito o uso do método get_var para recuperar um valor único, no caso o identificador da página. Note também a definição de que mesmo se existirem várias páginas com o template adotado será recuperado o id daquela que fora publicada mais recentemente. O template da página é armazenado sob a tabela de meta dados com a chave _wp_page_template.

O uso do método prepare trata as informações que podem conter algum caracter especial ou dados que possam conflitar com a consulta feita; assim a requisição é executada sem imprevistos. Adote o uso da nomenclatura das tabelas tal como apresentado, pois o prefixo das tabelas é facilmente editável e sua mudança não deve implicar na quebra do seu Tema.

Além do método get_var existem outros, dentre os quais o aqueles que você mais utilizará serão:

Através da classe $wpdb você consegue efetuar todo tipo de interação com o banco de dados de modo prático

Através da classe $wpdb você consegue efetuar todo tipo de interação com o banco de dados de modo prático

Funções nativas x Funções personalizadas

Mesmo sabendo que é possível fazer as consultas diretamente no banco de dados, o ideal é evitar o uso dessa técnica de integração ao máximo, principalmente quando o SQL determinar inserções, alterações e exclusões. Isso se deve ao fato que na maioria dos casos, para cada tarefa executada muitas verificações são feitas e possivelmente algumas informações auxiliares são também adicionadas ao banco de dados; permitindo ao sistema gerenciar melhor o conteúdo em questão.

Veja por exemplo se você pretender criar uma nova categoria, para compensar o uso de wp_insert_category seria preciso fazer manualmente uma série de verificações para evitar redundância dos dados e a posterior inserção deveria ocorrer nas tabelas terms e term_taxonomy; além de trabalhoso seria muito mais propenso a ocorrência de falhas.

De modo geral a classe deve ser aplicada apenas em tabelas personalizadas, que você tenha criado; ou então para consultas de resultados específicos e limitados que preferencialmente, não possuam função correspondente ou com o mesmo propósito.

Usuários

Seguindo as especificações, o projeto Entrelinhas necessita de um gerenciamento de usuários, sendo que alguns poderão enviar material para o site e outros terão apenas a possibilidade de leitura do conteúdo. O WordPress oferece de modo inerente um sistema de permissões de usuários que conta com cinco níveis de acesso:

  • Administrador – Tem acesso total ao Dashboard;
  • Editor – Gerencia e publica seus próprios posts e também os posts de outros usuários;
  • Autor – Gerencia e publica somente os próprios posts;
  • Colaborador – Gerencia e escreve posts de sua própria autoria, no entanto não pode publicá-los; como também não está habilitado a fazer uploads de arquivos ao servidor;
  • Assinante – Apenas tem acesso a edição de seu perfil no painel de controle.

Com isso, assume que nesse trabalho deverá existir um ou mais administradores, e os usuários que enviarão as matérias podem ser definidos como autores ou colaboradores de modo que não possam interferir nas publicações de terceiros.

Você pode também assumir que os usuários com permissão de leitura possam ter a permissão de Assinantes, no entanto a leitura do material não seria permitida pelo fato desse tipo de nível de acesso não possuir as capacidades necessárias para tal ação.

Roles e Capabilities

Cada nível de acesso dos usuários chama-se Role. As Roles servem para classificar os usuários e agrupar as permissões que eles possuem; tais permissões são as capabilities. Uma capability nada mais é que a permissão do usuário executar determinada ação, como por exemplo o que se espera do projeto, acessar o perfil no painel de controle ou ler conteúdo privado. Crie uma nova Role para especificar o novo grupo de usuários.

global $wp_roles;
if ( !isset( $wp_roles->roles[ 'reader' ] ) ) {
    $caps = array(
        'read' => true,
        'read_private_posts' => true,
        'read_private_pages' => true
    );
    add_role( 'reader', 'Leitor', $caps );
}

Informe as instruções dentro da função de setup do tema. Verificada a não existência da role, ela é incorporada as demais roles do WordPress. Em add_role é definido um nome, um rótulo de identificação e as capacidades da nova role, no caso acima read permite o acesso ao perfil no Dashboard e as demais permitem a leitura de posts e páginas de acesso privado.

Gatilhos de Ativação e Desativação do Tema

As roles e capabilities personalizadas devem ser adicionadas uma única vez ao seu Tema, logo o processo acima não precisa ser verificado a cada requisição do site. Uma alternativa é fazer uma verificação com a API de opções para uma opção em específica e então executar as rotinas pretendidas.

Como não será preciso editar essas atribuições você tem a possibilidade de configurar ações para ocorrerem logo que o tema é ativado ou desativado.

function pw_activation()
{
    // Rotinas de ativação
}
add_action( 'after_switch_theme', 'pw_activation' );

Dentro do escopo da função determine as instruções a serem executadas no momento em que o tema é ativado. A técnica pode ser aplicada para roles, capabilities e também adicionar opções personalizadas do Tema na base de dados.

function pw_deactivation()
{
    // Rotinas de desativação
}
add_action( 'switch_theme', 'pw_deactivation' );

No ato em que seu Tema está sendo desativado você pode optar por remover as opções, roles, capabilities e demais informações a respeito do seu projeto.

Gerenciamento de permissões

Do mesmo modo que é possível adicionar um novo nível de acesso você também poderá removê-lo caso seja necessário em eventuais atualizações do projeto.

remove_role( 'reader' );

Se você pretende remover a role para cadastrá-la novamente mediante alteração de suas capabilities, não o faça. Ao invés disso determine a incorporação ou remoção das capacidades do seguinte modo:

$reader = get_role( 'reader' );
$reader->remove_cap( 'read' );
$reader->add_cap( 'custom-capability' );

Com os códigos acima você retirou o acesso do usuário ao painel de controle do WordPress e em seguida adicionou uma nova capacidade personalizada a ele.

Como você pode perceber, no projeto em questão seria bem possível utilizar a role de assinante com alterações em suas capacidades ao invés da criação de uma nova. A escolha fica a seu critério. Porém atente ao fato de estar trabalhado em um projeto novo ou já existente; para atualizações de Temas existentes é possível que os Assinantes atuais não devam receber os novos privilégios, logo a criação de uma nova Role seria a melhor escolha.

Tratadas as questões de níveis de acesso e permissões, você precisa verificar se o visitante do site está logado, dentro do sistema ou não. Faça isso na tela inicial do site e estabeleça a apresentação da template page para usuários não logados ou então o conteúdo privado para aqueles que estiverem ativos no site.

<?php
if ( !is_user_logged_in() ) {
$about = pw_get_template( 'pg-about.php' );
if ( !isset( $about->ID ) ) {
    $title = 'Site de conteúdo restrito!';
    $content = 'É preciso estar logado no sistema para interagir com o projeto.';
} else {
    $title = $about->post_title;
    $content = apply_filters( 'the_content', $about->post_content );
} ?>

<div>
    <h2><?php echo $title; ?></h2>
    <div style="clear: both;">&nbsp;</div>
    <div><?php echo $content; ?></div>
</div>

<?php } else { // Exibição do conteúdo através do Loop do WordPress ?>

A função is_user_logged_in verifica se o usuário está logado ou não retornando verdadeiro ou falso respectivamente. Em seguida recupera uma página com o referido template. Repare que a fim de não exibir um conteúdo em branco caso não exista uma página com tal template, define-se um título e texto padrão; em seguida estes são apresentados aos usuários não logados.

Entrada e saída do sistema

O cadastro de novos usuários no site deve ser ativado nas Configurações Gerais do site, dentro do painel de controle.

Tela de configurações, campo para permitir cadastros no WordPress

Configurações Gerais do WordPress. Campo para habilitar o registro de novos usuários

Concedido o registro, aponte um link para a área do WordPress que permite a inscrição dos novos usuários.

<?php wp_register(); ?>

O link será criado automaticamente para o endereço dominio/wp-login.php?action=register. Caso prefira exibir um formulário personalizado de acordo com o Tema, também é possível. Faça isso usando o método POST, como nome dos campos atribua user_login e user_email, e como destino da submissão do formulário o mesmo endereço obtido pela função acima. Assim você envia as informações para o WordPress e deixa que o sistema se encarrega de verificar os dados e fazer as demais rotinas para inserção do usuário.

De modo manual, você ainda tem a possibilidade de utilizar a função wp_insert_user para criar um novo usuário com as especificações pretendidas; por exemplo você pode ter um formulário somente para cadastrar autores e outro para os leitores.

Após viabilizar o cadastro dos visitantes é preciso determinar uma área onde eles possam fazer o login em seu site. Uma alternativa é exibir um link que destine o visitante a tela de login do WordPress.

<a href="<?php echo wp_login_url(); ?>" title="Efetuar Login">Entrar no sistema</a>

Já que o propósito do projeto não é esse, e sim exibir um formulário personalizado; faça isso utilizando-se da função wp_login_form.

<h2>Entrar no sistema</h2>
<?php wp_login_form(); ?>

O formulário é gerado de modo automático. É possível a você customizar o formulário atribuindo configurações a função em seu parâmetro único, como por exemplo os rótulos e identificadores dos campos, uma URL para redirecionar o acesso após entrada no sistema e outras mais.

Do mesmo modo que o cadastro, para efetuar o login através de um formulário próprio basta determinar o envio via $_POST dos dados para dominio/wp-login.php e os campos de usuário e senha nomeados com log e pwd.

Incorpore ao projeto o link de cadastro, o formulário de login lembrando de realizar a verificação se o usuário está logado ou não no sistema. Apresente a ele também um link que permita que ele saia do sistema quando pretender.

<?php if ( !is_user_logged_in() ) { ?>
<ul>
    <li>
        <h2>Entrar no sistema</h2>
        <?php wp_login_form( 'remember=' ); ?>
        <?php wp_register(); ?>
        <div style="clear: both;">&nbsp;</div>
    </li>
<?php } else { $user = wp_get_current_user(); ?>
<p>
    <strong>Olá, <?php echo $user->display_name; ?></strong><br />
    <a href="<?php echo wp_logout_url(); ?>" title="Sair">Fazer logoff</a>
</p>
<?php // Demais instruções da sidebar

Caso o usuário esteja logado suas informações são recuperadas com wp_get_current_user; isso permite a você exibir um texto de boas vindas com o nome do usuário para confirmar a ele que o acesso foi concedido. Em seguida é apresentado o link para fazer a saída do sistema com wp_logout_url.

O WordPress oferece ainda o recurso de recuperar senha a seus usuários. Insira um link para o recurso padrão com wp_lostpassword_url ou então crie um formulário próprio enviando via $_POST o nome do usuário (campo user_login) para dominio/wp-login.php?action=lostpassword.

User Meta Data – Meta Dados para usuários

Assim como os posts e comentários, os usuários também possuem uma tabela auxiliar para manipulação dos meta dados. A especificação do projeto em que você está trabalhando determina que todos os usuários cadastrados com a nova Role informem em qual empresa trabalham atualmente.

Campos personalizados

A primeira etapa na atribuição de um meta dado para o usuário consiste em disponibilizar ao usuário um local onde ele possa editar tal informação. Incorpore um novo campo a tela de edição do perfil utilizando o gatilho personal_options.

add_action( 'personal_options', 'pw_user_edit' );

function pw_user_edit( $user )
{
    if ( current_user_can( 'reader' ) ) { ?>
    <table>
        <tr>
            <th>Empresa</th>
            <td><input type="text" name="pw_company" value="<?php echo get_user_meta( $user->ID, 'pw_company', true ); ?>" /></td>
        </tr>
    </table>
    <?php
    }
}

Com current_user_can você verifica se o usuário atual possui a role ou capability passada como parâmetro. Acima a condição trata de exibir o novo campo apenas para os usuários com permissão de leitura. Logo após efetuar a criação do campo é preciso realizar a atualização do valor no banco de dados, será preciso utilizar um novo gancho e também uma função responsável por tal ação.

add_action( 'personal_options_update', 'pw_user_save' );

function pw_user_save( $user_id )
{
    if ( isset( $_POST[ 'pw_company' ] ) && current_user_can( 'edit_user', $user_id ) )
        update_user_meta( $user_id, 'pw_company', $_POST[ 'pw_company' ] );
}

Feito o envio do formulário do Perfil do usuário é checado se o campo com o nome da empresa foi enviado e se o usuário possui a capacidade de alterar o perfil do usuário em questão, no caso ele mesmo. Ambas condições sendo verdadeiras atualiza o valor no banco de dados com update_user_meta.

Template Tags

A denominação Template Tags é atribuída as funções que o WordPress disponibiliza com intuito de tratar o conteúdo e aplicar seus resultados dentro de um Tema. São Template Tags as funções the_title, the_content, the_permalink e outras mais com esses mesmos propósitos.

A criação de uma função customizada dentro do seu Tema determina que você está criando sua própria template tag. Utilize desse artifício sempre que precisar replicar rotinas em diferentes locais do site.

Como a manipulação de modelos de páginas pelo WordPress não é muito explorada pelas Template Tags, aproveite o exemplo da função que você criou em pw_get_template. Voce pode fazer um atalho para recuperar todos os modelos de página de um determinada modelo.

Faça isso traçando um paralelo a get_pages e estabeleça como opções da nova função a quantidade de resultados a serem recuperados, a ordenação dos mesmos, o status pretendido e obviamente qual o modelo que se deseja recuperar.

function get_templates( $args )
{
    $pages = get_pages( array(
            'number'        => $args[ 'posts_per_page' ],
            'sort_column'   => $args[ 'orderby' ],
            'sort_order'    => $args[ 'order' ],
            'post_status'   => $args[ 'status' ],
            'meta_key'      => '_wp_page_template',
            'meta_value'    => $args[ 'template' ]
        )
    );
    return $pages;
}

wp_parse_args

Perceba o funcionamento de get_pages com as opções em formato de array como também em uma string semelhante a requisições do tipo $_GET; atribuindo o nome da variável e seu respectivo valor separados pelo sinal de igual e o símbolo & separando os campos.

get_pages( 'number=-1&meta_key=_wp_page_template&meta_value=' . $args[ 'template' ] );

Esse comportamento também pode ser aplicado a suas template tags mediante o uso de wp_parse_args.

function get_templates( $args )
{
    $defaults = array(
        'posts_per_page'    => 1,
        'orderby'           => 'menu_order',
        'order'             => 'ASC',
        'post_status'       => 'private',
        'template'          => ''
    );
    $args = wp_parse_args( $args, $defaults );

    $pages = get_pages( array(
            'number'        => $args[ 'posts_per_page' ],
            'sort_column'   => $args[ 'orderby' ],
            'sort_order'    => $args[ 'order' ],
            'post_status'   => $args[ 'status' ],
            'meta_key'      => '_wp_page_template',
            'meta_value'    => $args[ 'template' ]
        )
    );
    return $pages;
}

A função irá mesclar os valores padrão com as opções passadas via parâmetro, sendo que essas últimas irão sobrepor o preenchimento default. Esse tratamento dado as opções da Template Tag é muito relevante de ser aplicado pois além de especificar os valores de preenchimento padrão, possibilita simplificar a passagem de muitos parâmetros a sua função.

Para não esquecer

  • Manipulação do banco de dados através do Tema
  • Gerenciamento de usuários com suas permissões, níveis de acesso e campos personalizados
  • Entrada e saída do sistema
  • Criação de Template Tags