<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ataraxia! &#187; wordpress</title>
	<atom:link href="http://www.ataraxia.com.br/posts/tag/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ataraxia.com.br</link>
	<description>O estado da arte em TI</description>
	<lastBuildDate>Sun, 17 Jul 2011 21:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Agendando eventos no WordPress</title>
		<link>http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress</link>
		<comments>http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress#comments</comments>
		<pubDate>Wed, 13 Apr 2011 15:13:07 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=382</guid>
		<description><![CDATA[As vezes, precisamos que alguma ação seja executada de tempos em tempos no WordPress. Pode ser uma função que busca conteúdo externo, ou uma rotina de manutenção qualquer. A forma mais comum de fazer isso, é usando o serviço cron (em ambientes Unix), ou o agendador de tarefas (no Windows). Embora ambos funcionem bem, existe [...]]]></description>
			<content:encoded><![CDATA[<p>As vezes, precisamos que alguma ação seja executada de tempos em tempos no WordPress. Pode ser uma função que busca conteúdo externo, ou uma rotina de manutenção qualquer.</p>
<p>A forma mais comum de fazer isso, é usando o serviço cron (em ambientes Unix), ou o agendador de tarefas (no Windows). Embora ambos funcionem bem, existe uma alternativa, que é usar o próprio WordPress para isso.</p>
<h2>Como fazer</h2>
<p>Para agendar uma tarefa, existe uma função chamada wp_schedule_event(). Uma chamada típica dessa função seria da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
wp_schedule_event<span style="color: #009900;">&#40;</span><span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hourly'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hook'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hook'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'funcao_agendada'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Isso agendaria a função &#8220;funcao_agendada()&#8221; para ser executada de hora em hora, na hora atual.</p>
<p>O primeiro parâmetro informa a hora de agendamento. Como passamos time(), que se traduz na hora atual, o WordPress usará esse valor como hora. O segundo parâmetro é a frequência, que pode ser hourly, daily ou twicedaily (respectivamente de hora em hora, diariamente, ou duas vezes por dia). E por último, o nome de uma &#8220;action&#8221;, que indicará a função a ser executada.</p>
<p>Para remover o agendamento, a chamada é feita a wp_clear_schedule_hook(), passando como parâmetro somente o nome do hook utilizado (no caso, &#8220;hook&#8221;).</p>
<p>Um detalhe é que essa função deve ser chamada uma única vez, por isso, pode ser conveniente colocá-la dentro de um plugin, e executar o agendamento na ativação, e remover o agendamento na desativação.</p>
<p>Uma outra forma de se agendar, sem usar plugins, é usar a função wp_next_scheduled() para checar se o evento já foi agendado, da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'meu_evento'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'funcao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> ativacao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>wp_next_scheduled<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'meu_evento'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        wp_schedule_event<span style="color: #009900;">&#40;</span><span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hourly'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'meu_evento'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ativacao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> funcao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// isso executará de hora em hora</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Assim, caso o evento não esteja agendado, o WordPress se encarregará de agendá-lo.</p>
<h2>As vantagens</h2>
<p>A principal vantagem é que o agendamento fica independente de qualquer coisa externa. Tudo fica gerenciado pelo próprio WordPress, e numa eventual mudança de servidor, não haveria necessidade de se preocupar com as tarefas agendadas.</p>
<h2>As desvantagens</h2>
<p>Como não temos um daemon pra verificar a hora, e chamar as tarefas, dependemos de um visitante (humano ou não) pra executar as tarefas. Em cada acesso ao site, o WordPress checa se existe alguma tarefa que já deveria ter sido executada. Caso exista, ele executa. Simples assim.</p>
<p>Um problema nisso é que não há garantia de que a tarefa será executada precisamente no horário agendado, mas sim, no primeiro acesso após esse horário (que pode ser segundos, num site muito visitado, ou minutos/horas em um site com quase nenhum acesso).Caso a rotina que se queira agendar seja sensível a hora, é melhor usar os métodos convencionais.</p>
<h2>Conclusão</h2>
<p>Usar a funcionalidade de agendamento do WordPress pode ser uma boa alternativa, principalmente quando não há preocupação com o &#8220;quando&#8221; a tarefa será executada, ou quando não se tem acesso aos sistemas de agendamento do servidor, o que pode ser comum em ambientes compartilhados.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Removendo o &#8220;generator&#8221; do WordPress</title>
		<link>http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress</link>
		<comments>http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress#comments</comments>
		<pubDate>Thu, 26 Aug 2010 15:43:15 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[dicas]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=375</guid>
		<description><![CDATA[Ok, dica rápida para os que não gostam do WordPress anunciando para o mundo a versão em suas tags meta. Normalmente, qualquer site em WordPress vai ter uma tag meta em seu header mais ou menos assim: &#60;meta name=&#34;generator&#34; content=&#34;WordPress 2.8.4&#34; /&#62; Muita gente não gosta de anunciar para o mundo a versão usada. Seja [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, dica rápida para os que não gostam do WordPress anunciando para o mundo a versão em suas tags meta. Normalmente, qualquer site em WordPress vai ter uma tag meta em seu header mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="xhtml" style="font-family:monospace;">&lt;meta name=&quot;generator&quot; content=&quot;WordPress 2.8.4&quot; /&gt;</pre></div></div>

<p>Muita gente não gosta de anunciar para o mundo a versão usada. Seja por não querer exibir o uso do WordPress, ou por medo de alguem usar essa informação para um possível ataque contra essa versão específica do WordPress, existe uma forma muito simples de retirar isso do cabeçalho, sem precisar editar os arquivos do sistema (que a priori, nunca devem ser editados).<br />
Essa tag é inserida no cabeçalho através de uma <em>action</em> padrão, chamada <strong>wp_generator</strong>. Para não exibir, basta remover a action, adicionando o seguinte código no functions.php do seu tema:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
remove_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_head'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'wp_generator'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Pronto, com isso o seu site não irá mais exibir esta tag no cabeçalho.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escrevendo plugins para o WordPress</title>
		<link>http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress</link>
		<comments>http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress#comments</comments>
		<pubDate>Mon, 14 Sep 2009 04:39:52 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=347</guid>
		<description><![CDATA[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 &#8220;cara nova&#8221; ao blog. De fato, este blog que você está [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://wordpress.org/">WordPress</a> é 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 &#8220;cara nova&#8221; ao blog. De fato, este blog que você está lendo neste momento também usa o WordPress!<br />
Os <a href="http://wordpress.org/extend/plugins">vários plugins disponíveis</a> adicionam todo tipo de funcionalidade nova ao sistema, seja um widget para mostrar os últimos tweets de alguém, links para posts relacionados, enfim&#8230; tudo é possível!<br />
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.</p>
<h2>Criando um plugin</h2>
<p>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.<br />
O objetivo não é apenas mostrar como se criar um plugin. A partir deste esqueleto, adicionar mais funcionalidades fica mais fácil.</p>
<h2>O cabeçalho do plugin</h2>
<p>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.<br />
Essas informações entram em um comentário logo no início do arquivo. No nosso caso, teremos o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/*
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/
*/</span></pre></div></div>

<p>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.</p>
<h2>Os hooks</h2>
<p>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).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Hooks</span>
register_activation_hook<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;viewcounter_activate&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
register_deactivation_hook<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;viewcounter_deactivate&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'save_post'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'viewcounter_insert'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O primeiro hook determina que a função <em>viewcounter_activate()</em> 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á <em>viewcounter_deactivate()</em>, 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.<br />
A ação é bem semelhante ao hook, e no caso, executará a função <em>viewcounter_insert()</em> 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.</p>
<h2>Nossa tabela</h2>
<p>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?).<br />
O comando para a criação da tabela:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> viewcounter <span style="color: #66cc66;">&#40;</span>
    post_ID <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
    views <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<h2>O hook de ativação</h2>
<p>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.<br />
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 <em>SHOW TABLES</em>.<br />
A função ficará assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> viewcounter_activate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">,</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SHOW TABLES LIKE '<span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span>'&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CREATE TABLE <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span> (post_ID INT NOT NULL PRIMARY KEY, views INT NOT NULL DEFAULT 0)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// viewcounter_activate</span></pre></div></div>

<p>Note que temos duas variáveis globais. A primeira, <em>$wpdb</em>, é 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.<br />
Assim, esta segunda variável global foi definida fora da função, da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$viewcounter_table</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$wpdb-&gt;prefix}</span>viewcounter&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Resumindo, se você definiu o prefixo para as tabelas do WordPress como <em>wp_</em>, então nossa tabela se chamará <em>wp_viewcounter</em>. Isso é especialmente importante caso seu plugin seja usado em um sistema multi-usuário, como o <a href="http://mu.wordpress.org/">WordPress MU</a>.</p>
<h2>A desativação</h2>
<p>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.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> viewcounter_deactivate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">,</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DROP TABLE <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// viewcounter_deactivate</span></pre></div></div>

<p>Simples assim. Desativou o plugin, destruiu a tabela.</p>
<h2>Quando salvamos o post</h2>
<p>Assim que um post é salvo, temos a função <em>viewcounter_insert()</em> 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.<br />
A função também fica bem simples:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> viewcounter_insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post_ID</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">,</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span> (post_ID, views) VALUES (<span style="color: #006699; font-weight: bold;">{$post_ID}</span>, 0)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// viewcounter_insert</span></pre></div></div>

<h2>A contagem propriamente dita</h2>
<p>E por último, temos a contagem das visualizações. Para tanto, teremos uma função chamada <em>viewcounter_update()</em>, 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.<br />
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.<br />
A função pode ficar assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> viewcounter_update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post_ID</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">,</span> <span style="color: #000088;">$viewcounter_table</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT views FROM <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span> WHERE post_ID = <span style="color: #006699; font-weight: bold;">{$post_ID}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
        viewcounter_insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post_ID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span> SET views = views + 1 WHERE post_ID = <span style="color: #006699; font-weight: bold;">{$post_ID}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT views FROM <span style="color: #006699; font-weight: bold;">{$viewcounter_table}</span> WHERE post_ID = <span style="color: #006699; font-weight: bold;">{$post_ID}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// viewcounter_update</span></pre></div></div>

<p>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 <em>update</em> incrementando em 1 o número de visualizações. E por último, retorna o número atual de visualizações do post.</p>
<h2>Atualizando</h2>
<p>Tudo que faltou agora, é indicar o ponto onde viewcounter_update() deve ser chamada. Na <a href="http://codex.wordpress.org/Template_Hierarchy">hierarquia dos templates</a>, o ponto ideal para colocarmos nossa chamada é no arquivo <em>single.php</em>.<br />
Bastaria uma simples chamada como:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$num</span> <span style="color: #339933;">=</span> viewcounter_update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>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.</p>
<h2>Conclusão</h2>
<p>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.<br />
Estou disponibilizando um <a href="http://www.ataraxia.com.br/wp-content/uploads/2009/09/viewcounter.zip">arquivo com este plugin</a>, para quem quiser baixar e experimentar.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

