Back-End

29 out, 2009

Plugins e Banco de Dados no WordPress

Publicidade

Ao começar a trabalhar com plugins, pode surgir a
necessidade de armazenagem de dados. Nesse momento você deve considerar a criação de uma tabela no banco de dados para seu plugin,
mas antes disso é importante avaliar a relação dessa tabela com as
outras tabelas do WordPress e a quantidade de dados a ser armazenada.

Digamos que você queira desenvolver um plugin que conte os acessos
aos posts. Você só precisaria de um campo para armazenar esse valor,
mas ao criar uma tabela, você também deve informar qual post que obteve
determinada quantidade de acesso. Para casos como esse, existem algumas
tabelas no WP que, além de flexibilidade, oferecem todos os métodos
necessários para manipulação dos dados te poupando um bom tempo de
desenvolvimento. São elas: usermeta, postmeta e options.

Postmeta

Essa tabela armazena os dados extras dos posts. Por exemplo: a
última pessoa que o atualizou, ou se existe algum template relacionado
a ele, ou informações sobre os anexos. Enfim, qualquer informação
relativa ao post, tornando essa tabela uma ótima alternativa para
plugins que se relacionam com os posts, como um contador de acessos
mencionado acima.

Algumas das funções disponíveis para trabalhar com esses dados são:

add_post_meta($post_id, $meta_key, $meta_value, $unique = false);

Adicionar o novo campo à tabela, onde $post_id é o id do post que
possuirá o dado, $meta_key é o nome do campo, $meta_value é o valor do
campo e $unique é opcional e serve para definir se esse campo será
único. Exemplo:

<?php add_post_meta($post->ID, 'contador', 1, true); ?>

Adicionar um campo ‘contador’ a um post.

get_post_meta($post_id, $key, $single = false);

Recuperar o valor da tabela, onde $post_id é o id do post que possui
o dado, $key é o nome do campo que deve ser recuperado e $single é
opcional e (se true) retorna o valor em forma de string, caso contrário
o valor retornado será um array (sim, você pode armazenar um array
inteiro). Exemplo:

<?php $contador = get_post_meta($post->ID, 'contador', true); ?>

Pegar o campo ‘contador’ de um post.

update_post_meta($post_id, $meta_key, $meta_value, $prev_value = “);

Atualizar o valor na tabela, onde $post_id é o id do post que possui
o dado, $meta_key é o nome do campo a ser atualizado, $meta_value é o
novo valor do campo e $prev_value é opcional e é utilizado para
identificar o campo a ser atualizado quando existirem vários campos de
mesmo nome. Vale lembrar que caso o campo que queira alterar não
exista, ele será criado automaticamente. Exemplo:

<?php update_post_meta(1, 'contador', 10); ?>

Atualizar o valor do campo ‘contador’ no post número 1.

delete_post_meta($post_id, $meta_key, $meta_value = “);

Apagar o campo da tabela, onde $post_id é o id do post que possui o
dado, $meta_key é o nome do campo e $meta_value é opcional e serve para
identificar o campo a ser deletado quando existirem vários campos com o
mesmo nome. Exemplo:

<?php delete_post_meta(20, 'contador'); ?>

Apagar o campo ‘contador’ do post número 20.

Usermeta

Assim como o post meta, essa tabela armazena os dados extras dos
usuários. Nickname, biografia e preferências do usuário são alguns
exemplos que cito. Podemos portanto armazenar aqui os dados de nossos
plugins que trabalham com alguma informação de usuários.

Algumas das funções disponíveis:

get_usermeta($user_id, $meta_key = “)

Recupera os dados da tabela, onde $user_id é o id do usuário que
possui o dado e $meta_key é opcional e, quando informada, retorna o
valor do campo definido, caso $meta_key não seja informado, um array com
todos os dados desse usuário é retornado. Exemplo:

<?php $nickname = get_usermeta(1, 'nickname'); ?>

Busca o ‘nickname’ do usuário 1.

update_usermeta($user_id, $meta_key, $meta_value)

Atualiza os dados da tabela, onde user_id é o id do usuário que
possui o dado, $meta_key é o nome do campo e $meta_value é o valor do
campo. Caso o campo que queira alterar não exista, ele será criado.
Exemplo:

<?php update_usermeta($current_user->id, 'last_name', 'Mesquita') ?>

Altera o sobrenome do usuário atual para ‘Mesquita’.

delete_usermeta($user_id, $meta_key, $meta_value = “)

Deleta os dados da tabela, onde $user_id é o id do usuário que
possui o dado, $meta_key é o nome do campo a ser deletado e $meta_value
é opcional e serve para identificar o campo a ser deletado quando
existirem vários campos com o mesmo nome. Exemplo:

<?php delete_usermeta(1, 'last_name'); ?>

Deleta o sobrenome do usuário.

Options

A tabela options armazena variáveis do sistema, como nome do site,
url do site, tema ativo, tamanho padrão das imagens e uma infinidade de
outros campos de configuração do blog. Essa tabela é ideal para
armazenar variáveis de configuração dos plugins.

Abaixo, listo algumas funções úteis para a manipulação dos dados dessa tabela.

add_option($name, $value = “, $deprecated = “, $autoload = ‘yes’);

Adiciona um novo campo à tabela, onde $name é o único parâmetro
obrigatório e representa o nome do campo, $value é o valor do campo,
$autoload define se esse campo será carregado automaticamente e
$deprecated era a descrição do campo, mas caiu em desuso e não existe
mais. Exemplo:

<?php add_option('minha_variavel', 'minha cor favorita'); ?>

Adiciona ‘minha cor favorita’ a um campo chamado ‘minha_variavel’.

get_option($setting, $default = false);

Recupera o valor de um campo na tabela, onde $setting é o nome do
campo e $default é o valor a ser retornado caso o campo não exista.
Apesar de não possuir um valor single, como a função ‘get_post_meta’,
também é possível armazenar arrays nas opções. Exemplo:

<?php print get_option('db_version'); ?>

Imprime a versão do banco de dados do WP.

update_option($option_name, $option_value);

Atualiza o valor de um campo na tabela, onde $option_name é o nome do campo e $option_value é o novo valor. Exemplo:

<?php update_option('minha_variavel', 'minha_nova_cor_favorita'); ?>

Altera o campo ‘minha_variavel’ para ‘minha_nova_cor_favorita.’

delete_option($option_name);

Apaga um campo da tabela, onde $option_name é o nome do campo a ser apagado. Exemplo:

<?php delete_option('minha_variavel'); ?>

Exclui o campo ‘minha_variavel’.

Tabela Própria

Mas se seu plugin for muito complexo e precisar de uma tabela toda só
pra ele, então o primeiro passo é acessar o banco de dados e criar a
sua tabela. Para isso, o WordPress fornece o objeto ‘wpdb’, que já possui
os métodos para trabalhar com o Banco de Dados. Para utilizar esse
objeto, basta chamá-lo no escopo de seu plugin:

<?php global $wpdb; ?>

A classe wpdb
conta com diversos métodos, vou explicar apenas os necessários para que
você consiga instalar e utilizar seu plugin, para se aprofundar mais
confira a documentação do WordPress para essa classe.

$wpdb->query($query);

O método ‘query’ realiza consultas ao banco, mas não retorna valores
de consulta, apenas status (quantas linhas foram afetadas ou se a
consulta falhou). Exemplo:

<?php $wpdb->query('CREATE TABLE minha_tabela (campo1 tipo, campo2 tipo)'); ?>

Criar uma tabela no banco.

<?php $wpdb->query('INSERT INTO minha_tabela VALUES (dado1, dado2)'); ?>

Inserir um dado na tabela.

$wpdb->get_results($query = null, $output = OBJECT);

Já o ‘get_results’ recupera do banco os dados buscados e os retorna na forma de um objecto (por padrão). Exemplo:

<?php $resultados = $wpdb->get_results('SELECT campo1, campo2 FROM minha_tabela'); ?>
<?php foreach($resultados as $resultado) { print "<p>Campo1: {$resultado->campo1;}</p><p>Campo2: {$resultado->campo2}</p>"; }; ?>

Imprimir os campos 1 e 2 de cada registro.

Também é possível acessar alguns atributos do objeto wpdb como o nome das tabelas
ou o prefixo ($wpdb->prefix) usado para elas, que aliás deve ser
usado também no nome de suas tabelas para manter um padrão de
organização.

Ativando seu plugin

Até agora vimos como acessar o banco e quais as melhores formas de
armazenar seus dados, agora só falta saber como instalar seu plugin.
Para quem for usar as tabelas existentes do WP, a instalação se resume a
inicializar os valores de configuração de seu plugin. Já para quem vai
usar uma tabela própria, a instalação envolve criar as tabelas
necessárias no banco e inicializar seus valores (quando necessário). Em
ambos os casos o gancho (hook) é o mesmo ‘register_activation_hook’,
ele chama uma dada função quando o plugin é ativado a diferença será o
comportamento da função.

register_activation_hook($file, $function);

O primeiro parâmetro ($file) é o caminho para o arquivo de
instalação e $function é o nome da função que será chamada. Essa
chamada deve estar no arquivo de seu plugin. Exemplo:

<?php register_activation_hook(__FILE__, 'instalar_plugin'); ?>

Se a função de instalação estiver no mesmo arquivo do plugin, você
pode usar a constante ‘__FILE__’ para fazer a referência a ele mesmo,
caso contrário o caminho completo para seu arquivo de instalação deve
ser informado.

Desativando seu plugin

Por fim, todos dados ou tabelas criados no banco devem ser limpados
caso o plugin seja desativado. O gancho para essa ação é semelhante ao
de ativação:

register_deactivation_hook($file, $function);

Como vocês devem ter percebido é simples realizar a desinstalação de
plugins, portanto, façam esse favor aos usuários que confiaram em seu
plugin e limpem a bagunça dos bancos deles na desativação, é bem
estressante apagar manualmente tabelas do banco quando você não sabe de
qual plugin elas fazem parte ou se estão em uso ainda.

Resumindo tudo que foi dito aqui até agora, segue um exemplo de como seria a instalação de um plugin:

<?php
  function instalar_plugin()
  {
    global $wpdb;

    $wpdb->query("CREATE TABLE {$wpdb->prefix}minha_tabela (campo1 int not null, campo2 string null)");
  }

  function desinstalar_plugin()
  {
    global $wpdb;

    $wpdb->query("DROP TABLE {$wpdb->prefix}minha_tabela");
  }

  register_activation_hook(__FILE__, 'instalar_plugin');
  register_deactivation_hook(__FILE__, 'desinstalar_plugin');
?>

Parabéns aos que chegaram ao fim desse longo artigo! Espero que tenha ajudado.