Marcelo Mesquita

Apenas mais um desenvolvedor WordPress

Plugins e Banco de Dados

Começando a trabalhar com plugins pode surgir a necessidade  de armazenagem de dados, nesse momento você deve começar a 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 serem armazenados.

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.

postmetaPostmeta

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);

Adiciona 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); ?>

Adiciona um campo ‘contador’ a um post.

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

Recupera 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); ?>

Pega o campo ‘contador’ de um post.

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

Atualiza 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 queria alterar não exista, ele será criado automáticamente. Exemplo:

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

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

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

Apaga 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'); ?>

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

usermetaUsermeta

Assim como o post meta, essa tabela armazena os dados extras dos usuários. Nickname, biografia e preferencias 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

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 automáticamente e $deprecated era a descrição do campo mais 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 precisa 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 metodos 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 metodo ‘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)'); ?>

Cria uma tabela no banco.

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

Insere 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>"; }; ?>

Imprime 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 forma 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 e 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 intalaçã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 post e espero que tenha ajudado.

11 Comments

  • responder

    Opções de Widgets » Marcelo Mesquita

    9 anos atrás

    […] Explicando… começando na linha 18 ($opcoes = get_option(’posts_mais_quentes’)) carrega as opções desse widget do banco. Notem que usei a tabela ‘options’ do banco do WordPress para salvar as opções do plugins, como foi explicado no post plugins e banco de dados. […]

  • responder

    Andre

    9 anos atrás

    Olá, seus tutoriais são excelente. Parabéns! Estou aprendendo o PHP agora que passeia a usar o WordPress, então ainda fico meio perdido. Se for possível gostaria de uma ajuda.

    No meu plugin preciso pegar as informações que o usuário lança no caixa de texto (no widget com caixa de texto e botão submit) e comparar com a tabela (wp_ACF) para exibir um resultado. Eu criei o plugin coforme o tutorial e está perfeito, mas na hora de pegar os dados do formulário para usar na consulta do bd não estou conseguindo. Se puder me passar o código desse processo eu lhe agradeço.

    • responder

      Marcelo Mesquita

      9 anos atrás

      Olá André,
      se você salvou os dados usando ‘update_option’, então para recuperá-los use ‘get_option’. Mas se tiver usado ‘update_usermeta’ para guardar o dado, a função para busca-lo de volta será ‘get_usermeta’.

      Qualquer coisa é só avisar… boa sorte!

  • responder

    Andre

    9 anos atrás

    Olá Marcelo,

    Os dados a que me refiro são os que foram digitados no formulário pelo usuário (antes de serem usados para busca no banco de dados). Ao clicar no botão submit “buscar”, como pego esses dados ? A action do form é direcionada para onde? Exemplo: O usuário digita “mateus” e eu quero buscar na minha tabela todos os registros que contenham a palavra “mateus”. Eu quero resgatar os dados do form para jogar na minha consulta sql. Não há gravação no banco de dados.

    Obrigado.

    • responder

      Marcelo Mesquita

      9 anos atrás

      André,
      não sei se entendi direito sua pergunta, mas para usar um dado enviado por um formulário no php, você pode usar $_GET[‘nome_do_campo’] se o formulário enviar via ‘get’, $_POST[‘nome_do_campo’] se o formulário for via ‘post’ ou $_REQUEST[‘nome_do_campo’] que serve para ambos os métodos de envio do formulário. Não se esqueça de substituir o ‘nome_do_campo’ pelo nome do elemento do formulário (ex. <input name=’nome_do_campo’>).

      Espero que tenha ajudado.

  • responder

    Andre

    9 anos atrás

    Olá Marcelo,

    É isso mesmo! Perfeito! Quando estiver funcionando posto o link para que vc veja.

    Fica com Deus

  • responder

    Daniel Ribeiro França

    8 anos atrás

    Estou tentando criar meu primeiro plugin, adicionei campos de texto no form do editor de post e até ai tudo bem, ele salva a meta no banco, mas acredito que o salvar automatico do post, esta apagando os meus registros, existe uma forma de lidar com isso? já coloquei um IF perguntando se foi postado etc…

    • responder

      Marcelo Mesquita

      8 anos atrás

      Daniel,
      só pra entender, as metas estão sendo salvas mas depois somem? Qual action vocês está usando para salvar as metas (‘save_post’ serve para salvamento automático também)? Você está usando o id do post ou da revisão (‘wp_is_post_revision’ retorna o id do post original)?

      Qualquer coisa, me adiciona no gtalk que fica mais fácil conversarmos.

      Abraço.

  • responder

    jean

    5 anos atrás

    Olá marcelo vi que você tem conhecimentos na área de wordpress estou tentando montar uma página e quem sabe vc pode me dar uma força.

    eu preciso criar uma tabela em uma página no meu site e colocar 3 text fields
    onde o usuário digitaria os valores no imput e eles fossem gravados no banco do wordpress e a qualquer hora eles pusessem alterar ou excluir os valores dos campos você sabe a forma mais simples de se realizar isso?

    • responder

      Marcelo Mesquita

      5 anos atrás

      Oi Jean,

      Se os usuário tiverem que se registrar antes de inserir os valores, a maneira mais simples é usando as funções: get_user_meta e update_user_meta.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *