Feed e Twitter

Feed RSS Twitter

Busca

Por Lustosa em 14/09/2009 às 01:39

O WordPress é um excelente sistema para blogs, feito em PHP. Além de ser bastante fácil de instalar e usar, existe um sem número de plugins já prontos e disponíveis para estender suas funcionalidades, e mais tantos temas que podem ser usados para dar “cara nova” ao blog. De fato, este blog que você está lendo neste momento também usa o WordPress!
Os vários plugins disponíveis adicionam todo tipo de funcionalidade nova ao sistema, seja um widget para mostrar os últimos tweets de alguém, links para posts relacionados, enfim… tudo é possível!
Porém, volta e meia precisamos adicionar uma funcionalidade e não existe um plugin já pronto que sirva exatamente para o que queremos. Neste caso, uma opção é criar o nosso próprio plugin. A linguagem do WordPress é o PHP, e tendo alguma noção de como as coisas funcionam no WordPress, essa não é uma tarefa muito complexa.

Criando um plugin

Neste artigo, vamos mostrar o passo a passo da criação de um plugin simples, que visa guardar em uma tabela o número de visualizações de cada post do blog. Só isso. Não teremos gráficos, tabelas, nada do tipo. Apenas vamos guardar os dados, que podem ser utilizados por uma outra ferramenta qualquer.
O objetivo não é apenas mostrar como se criar um plugin. A partir deste esqueleto, adicionar mais funcionalidades fica mais fácil.

O cabeçalho do plugin

Antes de mais nada, logo no início precisamos ter um cabeçalho no arquivo do plugin que informará ao WordPress algumas informações, como nome do plugin, uma descrição, autor, versão, e outras coisas. É importante ter isso bem definido.
Essas informações entram em um comentário logo no início do arquivo. No nosso caso, teremos o seguinte:

<?php
/*
Plugin Name: View Counter
Description: Increments a counter each time a post is viewed
Version: 1.0
Author: Bruno Lustosa
Author URI: http://www.ataraxia.com.br/
*/

Pronto, já temos aí o nome do plugin (View Counter), uma breve descrição do que ele faz, a versão, o nome do autor e a URL do autor, para referência. O WordPress exibe essas informações na página dos plugins na área administrativa. Coloquei as informações em inglês, pois a interface administrativa deste blog está toda em inglês.

Os hooks

Entenda os hooks como ações onde você pode criar um callback. Ou seja, sempre que determinada ação for executada no WordPress, uma função definida por você será chamada. No nosso caso, vou definir 2 hooks e uma ação (a ação é parecida com o hook, mostrarei a diferença logo abaixo).

// Hooks
register_activation_hook(__FILE__, "viewcounter_activate");
register_deactivation_hook(__FILE__, "viewcounter_deactivate");
add_action('save_post', 'viewcounter_insert');

O primeiro hook determina que a função viewcounter_activate() será executada quando o plugin for ativado. Esta função cuidará da criação da tabela, caso necessário. Da mesma forma, o segundo hook executará viewcounter_deactivate(), que destruirá nossa tabela, para deixar o sistema limpo como estava antes da ativação. É sempre uma boa prática remover o que criamos após a desinstalação.
A ação é bem semelhante ao hook, e no caso, executará a função viewcounter_insert() assim que um post for salvo. Esta função irá inserir uma linha em nossa tabela, definindo o número de leituras como sendo zero.

Nossa tabela

Iremos criar uma tabela bem simples para guardar as nossas informações. Tudo que precisaremos, é de um campo para guardar o ID do post, e outro pra guardar o número de visualizações. Sim, poderíamos alterar a tabela de posts e adicionar um campo com o número de visualizações, porém, prefiro não mexer em tabelas do sistema, para evitar problemas de compatibilidade futura (vai que uma versão futura do WordPress possui um campo com esse mesmo nome?).
O comando para a criação da tabela:

CREATE TABLE viewcounter (
    post_ID INT NOT NULL PRIMARY KEY,
    views INT NOT NULL DEFAULT 0
);

O hook de ativação

Com a definição da nossa tabela em mãos, vamos partir para a função de ativação do plugin. Ela será executada uma única vez, quando o administrador ativar o plugin.
Nossa função, por segurança, irá checar se a tabela que queremos criar já existe, para evitar erros. A checagem usará o comando SQL SHOW TABLES.
A função ficará assim:

function viewcounter_activate() {
 
    global $wpdb, $viewcounter_table;
 
    if ($wpdb->get_var("SHOW TABLES LIKE '{$viewcounter_table}'") != $viewcounter_table):
        $wpdb->query("CREATE TABLE {$viewcounter_table} (post_ID INT NOT NULL PRIMARY KEY, views INT NOT NULL DEFAULT 0)");
    endif;
 
} // viewcounter_activate

Note que temos duas variáveis globais. A primeira, $wpdb, é do próprio WordPress, e é usada para acessar o banco de dados e executar queries. A segunda, foi definida por nós, e contem o nome da tabela que usaremos. Lembra, que durante a instalação do WordPress, ele te pediu um prefixo para as tabelas? Ao invés de deixarmos um nome fixo, é sempre bom definir o nome da tabela usando este prefixo.
Assim, esta segunda variável global foi definida fora da função, da seguinte forma:

global $viewcounter_table;
$viewcounter_table = "{$wpdb->prefix}viewcounter";

Resumindo, se você definiu o prefixo para as tabelas do WordPress como wp_, então nossa tabela se chamará wp_viewcounter. Isso é especialmente importante caso seu plugin seja usado em um sistema multi-usuário, como o WordPress MU.

A desativação

Bem semelhante à nossa função de ativação, temos a função que será executada quando o plugin for desativado. A idéia aqui é limpar tudo que fizemos, deixando o sistema como estava antes. Para tanto, basta destruir a nossa tabela.

function viewcounter_deactivate() {
 
    global $wpdb, $viewcounter_table;
 
    $wpdb->query("DROP TABLE {$viewcounter_table}");
 
} // viewcounter_deactivate

Simples assim. Desativou o plugin, destruiu a tabela.

Quando salvamos o post

Assim que um post é salvo, temos a função viewcounter_insert() que será chamada, tendo como parâmetro o ID do novo post. Esta função deve inserir uma linha em nossa tabela, indicando que esse novo post teve 0 visualizações até o momento, o que é lógico, pois ele acabou de ser criado.
A função também fica bem simples:

function viewcounter_insert($post_ID) {
 
    global $wpdb, $viewcounter_table;
 
    $wpdb->query("INSERT INTO {$viewcounter_table} (post_ID, views) VALUES ({$post_ID}, 0)");
 
} // viewcounter_insert

A contagem propriamente dita

E por último, temos a contagem das visualizações. Para tanto, teremos uma função chamada viewcounter_update(), que receberá como parâmetro o ID do post a ser atualizado. Para conveniência, essa função também irá retornar o número atualizado de visualizações que o post teve, que poderá ser usado no template em algum lugar.
Esta função tem algumas checagens extras que são feitas por segurança. Por exemplo, caso um post antigo seja visualizado, precisaremos rodar a função que cria a linha para o post, pois como ele foi criado antes da ativação do plugin, o hook anterior não foi chamado.
A função pode ficar assim:

function viewcounter_update($post_ID) {
 
    global $wpdb, $viewcounter_table;
 
    if (is_null($wpdb->get_var("SELECT views FROM {$viewcounter_table} WHERE post_ID = {$post_ID}"))):
        viewcounter_insert($post_ID);
    endif;
    $wpdb->query("UPDATE {$viewcounter_table} SET views = views + 1 WHERE post_ID = {$post_ID}");
 
    return $wpdb->get_var("SELECT views FROM {$viewcounter_table} WHERE post_ID = {$post_ID}");
 
} // viewcounter_update

A primeira query checa se o retorno é vazio, e caso seja, chama a função viewcounter_insert() para inserir uma linha com 0 visualizações. Em seguida, executa um update incrementando em 1 o número de visualizações. E por último, retorna o número atual de visualizações do post.

Atualizando

Tudo que faltou agora, é indicar o ponto onde viewcounter_update() deve ser chamada. Na hierarquia dos templates, o ponto ideal para colocarmos nossa chamada é no arquivo single.php.
Bastaria uma simples chamada como:

<?php
$num = viewcounter_update($post->ID);
?>

E já teríamos o banco atualizado (claro, supondo que temos em $post o objeto com o post). Caso queiramos exibir o número atual de visualizações, podemos utilizar a variável $num em qualquer ponto do template para mostrar ao usuário quantas vezes aquele post foi visto.

Conclusão

Este foi apenas um exemplo, bem tosco, de como criar um template para o WordPress. É claro que ele pode ser melhorado, e muito. Inclusive, aceito sugestões nos comentários.
Estou disponibilizando um arquivo com este plugin, para quem quiser baixar e experimentar.

Artigos relacionados

Arquivado em programação
Tags: ,

Feed RSS para os comentários deste artigo.


2 comentários em “Escrevendo plugins para o WordPress”

  1. Jan Seidl comentou:

    Maneiríssimo! Esse princípo de hooks é sine qua non em sistemas de plugin. Aliás, já que você começou “hookando”, podia fazer a função de update ser chamada por action ao invés de pelo template e, assim, uma função para ser chamada para ver no template. Desconsidero o overhead porque 1) você já faz duas queries mesmo, 2) suponho (for god sake) que o WP Super Cache esteja em uso. Epa… peraí… se o cache tiver on, será que conta?

    Esse plugin/conjunto de hooks é o mesmo para páginas?

  2. Optimização de site | Jonathan Dos Santos Web design - Blog comentou:

    [...] Escrevendo plugins para o WordPress [...]


Copyright 2009 Ataraxia!   Sinopse