<?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>Templates Wordpress e Tutoriais &#187; Tutorials Wordpress</title>
	<atom:link href="http://www.escolawp.com/category/tutorials-wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.escolawp.com</link>
	<description>Templates Wordpress e Tutoriais</description>
	<lastBuildDate>Mon, 06 Feb 2012 16:30:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Como criar templates diferentes para single posts e categorias do WordPress</title>
		<link>http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/</link>
		<comments>http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 16:30:42 +0000</pubDate>
		<dc:creator>Paulo Faustino</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[category templates]]></category>
		<category><![CDATA[como criar templates diferentes para categorias no wordpress]]></category>
		<category><![CDATA[como criar templates diferentes para single posts no wordpress]]></category>
		<category><![CDATA[criar templates diferentes no wordpress]]></category>
		<category><![CDATA[single post templates]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=4096</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/">Como criar templates diferentes para single posts e categorias do WordPress</a></p>
&#160;&#160; Como criar templates diferentes para single posts e categorias do WordPress O WordPress permite aos seus usuários criarem diferentes templates de páginas, mas infelizmente, não permite a criação de diferentes templates de posts, excepto através da criação de custom post types, que para a grande maioria dos usuários é um processo relativamente complexo de [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/">Como criar templates diferentes para single posts e categorias do WordPress</a></p>
<p style="text-align: justify;">O WordPress permite aos seus usuários criarem diferentes templates de páginas, mas infelizmente, não permite a criação de diferentes templates de posts, excepto através da <a title="criação de custom post types" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" target="_blank">criação de custom post types</a>, que para a grande maioria dos usuários é um processo relativamente complexo de criar diferentes tipos/estilos de postagens para os seus blogs. No entanto, através de Custom Fields (campos personalizados), é possível criar diferentes tipos de templates para páginas. Mais uma vez, <a title="criar custom fields" href="http://www.escolawp.com/2008/07/como-utilizar-os-campos-personalizados-no-wordpress-custom-fields/" target="_blank">criar custom fields</a> é algo que provavelmente a grande maioria dos usuários não-avançados terá dificuldade em reproduzir. Posto isto, restam-nos poucas soluções a ter em consideração, quando o objetivo é criar simples templates para single posts, tal como o fazemos para os templates de páginas.</p>
<p style="text-align: justify;">Se você tem um blog e gostaria de ter dois templates diferentes para postagens diferentes em seu blog, ou dois templates diferentes para duas categorias diferentes do seu blog, saiba que existem duas formas bem simples de resolver esse problema, as quais explicamos de seguida neste nosso tutorial.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;">CRIAR TEMPLATES DIFERENTES PARA SINGLE POSTS</span></h3>
<p style="text-align: justify;">Para criar dois templates diferentes para single posts do WordPress, sugerimos a você que use o plugin <a href="http://wordpress.org/extend/plugins/single-post-template/" rel="nofollow" target="_blank">Single Post Template</a>, que lhe permite de forma fácil e cómoda, criar diferentes custom fields com um menu dropdown para a utilização de diferentes tipos de postagens. O processo de utilização é bem simples, veja:</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-4097" title="single post templates" src="http://www.escolawp.com/wp-content/uploads/2012/02/singleposttemplates.jpg" alt="single post templates" width="630" height="250" /></p>
<p style="text-align: justify;">Comece por efetuar uma busca indo na seção &#8220;Plugins &gt; Adicionar Novo&#8221; do seu blog WordPress. Efetue uma busca por &#8220;Single Post Template&#8221;, e clique em &#8220;Instalar Agora&#8221; para instalar o plugin e ativá-lo em seu blog. Partiremos do princípio de que você ativa o seu plugin. Depois de ativado, avance para o próximo passo:</p>
<p style="text-align: justify;">Depois de ter o plugin instalado, aquilo que você deverá fazer é criar novos templates para os seus single-posts. Para o fazer, recomendamos que você copie o código do seu ficheiro single.php, para um novo ficheiro, e coloque no início desse código o seguinte cabeçalho:</p>
<pre class="brush:php">&lt;?php
/*
Single Post Template: [Nome do Template]
Description: A description e opcional. Escreva se quiser!
*/
?&gt;</pre>
<p style="text-align: justify;">Tenha em consideração que se você quiser que o seu single.php seja diferente do outro template que deseja criar, terá de editar o código desse template e atribuir-lhe um novo diferente como por exemplo single-tutoriais.php, que será o template a usar nos seus tutoriais. Carregue esses ficheiros para dentro da diretoria /wp-content/themes/nomedotheme/ para que os mesmos fiquem automaticamente ativos e funcionais:</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-4098" title="ficheiros single" src="http://www.escolawp.com/wp-content/uploads/2012/02/ficheirossingle.jpg" alt="ficheiros single" width="630" height="250" /></p>
<p style="text-align: justify;">Não se esqueça que esses novos ficheiros terão obrigatoriamente de ter o cabeçalho que falámos anteriormente, caso contrário o plugin Single Post Template não conseguirá interpretar quais os ficheiros que são templates de single posts.</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-4099" title="single templates" src="http://www.escolawp.com/wp-content/uploads/2012/02/singletemplates.jpg" alt="single templates" width="630" height="180" /></p>
<p style="text-align: justify;">Ao carregar os ficheiros, o plugin &#8220;Single Post Templates&#8221; irá automaticamente perceber quais os templates de single posts, e disponibilizar um menu dropdown de seleção dentro do editor de artigos do WordPress. Por baixo da caixa de escrita de um novo artigo, irá aparecer agora o Custom Field para &#8220;Single Post Template&#8221; que contém todos os templates de single posts que você criou.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;">CRIAR TEMPLATES DIFERENTES PARA CATEGORIAS</span></h3>
<p style="text-align: justify;">No caso de você desejar aplicar a mesma técnica mas às categorias do seu blog WordPress, teremos de usar um processo relativamente diferente. Não procurámos por plugins que façam esta tarefa de forma automatizada, até porque na verdade não existe necessidade disso. Siga os passos para criar os seus templates de categorias diferentes usando o WordPress:</p>
<p style="text-align: justify;">A hierarquia de templates do WordPress funciona seguindo uma lógica de análise. Ele irá procurar pelos templates seguindo uma determinada ordem, veja:</p>
<ul style="text-align: justify;">
<li>category-20.php</li>
<li>category.php</li>
<li>archive.php</li>
<li>index.php</li>
</ul>
<p style="text-align: justify;">Esta ordem significa que o WordPress irá primeiro procurar por um template category-6.php, depois pelo category.php, e assim sucessivamente até chegar ao index.php. Isto significa que criar diferentes tipos de templates no WordPress é na verdade um processo super simples e básico.</p>
<p style="text-align: justify;">Para criar um template de categoria diferente do category.php, copie o código que está dentro do seu ficheiro category.php e guarde o novo ficheiro com o nome category-ID.php, onde o ID significa o ID da categoria onde você deseja que esse template seja aplicável. Se você não tiver um ficheiro category.php, você pode copiar o ficheiro archive.php ou index.php.</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-4100" title="id categorias" src="http://www.escolawp.com/wp-content/uploads/2012/02/idcategorias.jpg" alt="id categorias" width="630" height="213" /></p>
<p style="text-align: justify;">Para encontrar o ID da categoria que você deseja, entre na seção &#8220;Categorias&#8221; do seu blog WordPress, coloque o mouse em cima do nome da categoria, e olhe para a barra de endereço que aparece no rodapé do seu browser. Esse endereço contém o ID=X, sendo o X o valor ID da sua categoria. Não tem nada que enganar.</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-4101" title="categorias" src="http://www.escolawp.com/wp-content/uploads/2012/02/categorias.jpg" alt="categorias" width="630" height="180" /></p>
<p style="text-align: justify;">Para que tudo fique funcionando corretamente, você deverá carregar para dentro do seu servidor, na localização /wp-content/themes/nomedotheme/ os seus ficheiros de categorias. No exemplo em cima, criámos dois templates diferentes para a categoria 1 e categoria 65, mas você poderá criar aqueles que bem desejar, bastando colocar o ID da categoria no nome do ficheiro, e a estilização que você desejar. O WordPress irá ler esses templates antes de ler o category.php, diferenciando todos eles uns dos outros.</p>
<p style="text-align: justify;">Até Já!</p>
<p><a rel="nofollow" href="http://www.escolawp.com/aff_elegantthemes" target="_blank"><img border="0" src="http://www.elegantthemes.com/affiliates/banners/570x100.jpg" width="570" height="100"></a></p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/" title="Como Criar Plugins para WordPress (Parte III)">Como Criar Plugins para WordPress (Parte III)</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/" title="Como Criar Plugins para WordPress (Parte II)">Como Criar Plugins para WordPress (Parte II)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/" title="Como Criar Plugins para WordPress (Parte I)">Como Criar Plugins para WordPress (Parte I)</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/" title="Guia definitivo para criar Custom Post Types (Parte 5)">Guia definitivo para criar Custom Post Types (Parte 5)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como Criar Plugins para WordPress (Parte IV)</title>
		<link>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/</link>
		<comments>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 16:01:26 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[aprender a criar plugins]]></category>
		<category><![CDATA[como criar plugins para wordpress]]></category>
		<category><![CDATA[criar plugins]]></category>
		<category><![CDATA[criar plugins no wordpress]]></category>
		<category><![CDATA[dicas para criar plugins]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>
		<category><![CDATA[tutorial passo a passo para aprender a criar plugins]]></category>
		<category><![CDATA[tutorial passo a passo para criar plugin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3980</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/">Como Criar Plugins para WordPress (Parte IV)</a></p>
&#160;&#160; Como Criar Plugins para WordPress (Parte IV) Este artigo é a quarta parte da série Como Criar Plugins para WordPress. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/">Como Criar Plugins para WordPress (Parte IV)</a></p>
<p style="text-align: justify;">Este artigo é a quarta parte da série <a title="Como Criar Plugins para WordPress (Parte I)" href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/">Como Criar Plugins para WordPress</a>. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a sua API simples de implementar. Recentemente um dos nossos leitores contatou-nos indicando que estava tendo dificuldades em encontrar <a title="tutoriais WordPress" href="http://www.escolawp.com/" target="_blank">tutoriais WordPress</a> sobre criar plugins, e sugeriu-nos então que publicássemos uma série de artigos sobre como criar plugins para WordPress, ideia essa que decidimos aceitar!</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>SUMÁRIO</strong></span></h3>
<ol style="text-align: justify;">
<li>Permissões dos Usuários</li>
<li>Secrets e Nonces para autorização</li>
<li>Validação e saneamento dos dados postados</li>
<li>Formatando elementos para uso de SQL</li>
<li>Hábitos aconselhados</li>
</ol>
<p style="text-align: justify;">Falar em &#8220;segurança&#8221; no mundo da informática leva-nos sempre à noção de perigo constante. Para aqueles que se confrontam com estes problemas todos os dias, a segurança no código, seja este para a web ou para desktop, é sempre a última tarefa mais importante.</p>
<p style="text-align: justify;">As ameaças são constantes: ataques de XSS, CSRF, injecções no SQL, ganho de permissões, vulnerabilidades e buracos de acesso.</p>
<p style="text-align: justify;">Estas ameaças existem e qualquer autor de plugins do WordPress deve estar consciente disso! Se você distribuir o seu plugin na comunidade, deve ter em consideração ainda mais o facto de manter uma responsabilidade para com os dados dos usuários que usam os seus plugins.</p>
<p style="text-align: justify;">Na escala dos principais problemas que os usuários toleram, o menor é a questão de segurança. Se for descoberto uma falha de segurança num plugin, os usuários acabam por deixar de usar os seus plugins e descredibilizam o autor.</p>
<p style="text-align: justify;">Por estas razões, nunca devemos deixar de lado ou para segundo plano a questão da segurança, pois pode comprometer todo o nosso trabalho e reputação.</p>
<h2 style="text-align: justify;"><strong>Segurança no WordPress</strong></h2>
<p style="text-align: justify;">O WordPress já implementa várias soluções que ajudam nesta tarefa. Não é dificil e o tempo consumido é pouco, por isso vale sempre a pena!</p>
<h3><span style="color: #ff0000;"><strong>PERMISSÕES DOS USUÁRIOS</strong></span></h3>
<p style="text-align: justify;">Este é um dos temas mais importantes no que toca a segurança, senão o mais importante. Um bom sistema de permissões no software permite que muitos dos problemas de segurança seguintes não comprometam o sistema, pois brechas, validações, etc, embora possam existir necessitam por parte do usuário de permissão de acesso.</p>
<p style="text-align: justify;">A API de Acessos do WordPress é versátil o suficiente para nos manter seguros dos perigos adjacentes. Nesta matéria existe uma função que nos faz todo o trabalho: c<em>urrent_user_can()</em></p>
<p style="text-align: justify;">Esta função aceita como argumento uma capacidade ou papel, e testa se o usuário atual tem ou não essa permissão, retornando valores boleanos (true ou false). Caso o usuário não esteja logado, a função irá retornar sempre false &#8211; é aqui que reside a segurança para o exterior.</p>
<h2><strong>Papeis e Capacidades</strong></h2>
<p style="text-align: justify;">As capacidades não são mais que uma tabela identificativa de determinadas ações que um usuário pode efetuar no WordPress. Para cada capacidade está associada uma ação. Sendo assim, um conjunto de capacidades, isto é, ações, formam um papel de usuário. Por exemplo: enquanto que com o papel de Administrador no WordPress, o usuário tem acesso a todas as ações existentes, ou seja, é-lhe atribuido todas as capacidades, um usuário com o papel de Subscritor, apenas tem a capacidade read, que lhe garante acesso apenas à Dashboard e ao perfil do usuário.</p>
<p style="text-align: justify;">O sistema de papeis e capacidades é fantástico, pois permite-nos adicionar ou remover capacidades através de plugins, como visto nos artigos anteriores de <a title="Guia definitivo para criar Custom Post Types (Parte 3)" href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">como criar custom post types</a>.</p>
<h2><strong>Função de avaliação de permissão de acesso</strong></h2>
<p style="text-align: justify;">A melhor forma de checar se um usuário tem permissões de acesso é usando a função <em>current_usar_can( $capacidade_ou_papel )</em>. Esta função aceita como argumento tanto uma capacidade como um conjunto de capacidades, ou seja, um papel:</p>
<pre class="brush:php">&lt;?php

// Vamos checar por uma capacidade
if ( !current_user_can( 'manage_options' ) )
  wp_die( 'Permissão de acesso insuficiente' );

// Vamos checar por um papel
if ( !current_user_can( 'editor' ) )
  wp_die( 'Permissões abaixo do Editor' );

// Fazer o resto do código...

?&gt;</pre>
<p style="text-align: justify;">Com este snippet dentro de qualquer função do nosso plugin, nós evitamos que usuários sem permissão de acesso às ações que implementamos as acessem.</p>
<h3><span style="color: #ff0000;"><strong>SECRETS E NONCES PARA OBTER AUTORIZAÇÃO </strong></span></h3>
<p style="text-align: justify;">Este é um caso de ataque comum nos emails de spam e salas de conversação IRC ou de Instant Messaging.</p>
<p style="text-align: justify;">Imagine que um usuário tem permissão para remover posts e encontra-se logado no sistema. No entanto, um outro usuário mal intensionado força o primeiro usuário a clicar num link encapsulado que mascara o link do site para deletar os posts. Como o usuário não sabe disto, ele acaba por remover os posts sem intensão. Acabámos de assistir a um ataque CSFR, ou seja, o usuário mal intensionado ganhou autorização.</p>
<p style="text-align: justify;"><strong>Porque é que isto aconteceu? A resposta é: Autorização mas não Intensão!</strong></p>
<p style="text-align: justify;">A análise da anatomia deste ataque ajuda-nos a explicar este fenómeno. O usuário mal intensionado forçou o usuário logado no WordPress e com autorização para remover posts a praticar essa ação:</p>
<ul style="text-align: justify;">
<li>Como o usuário está logado no sistema e tem permissão, a função <em>current_user_can()</em> retornou true.</li>
<li><strong>A permissão do usuário não checa se o usuário tem realmente a intensão de praticar aquela ação.</strong></li>
</ul>
<p style="text-align: justify;"><strong>Como resolver esta situação?</strong> Felizmente o WordPress detém de um sistema de proteção contra este tipo de ataques. A solução é chamada de <em>nonces</em>, que são simplesmente strings de letras e números aleatórios que são criados durante o carregamento de uma página e colocados no final do link.</p>
<p style="text-align: justify;">Este é um exemplo de um nonce colocado no link de remoção de um post para o lixo:</p>
<pre class="brush:xml">http://exemplo.com/wp-admin/post.php?post=54&amp;action=trash&amp;_wpnonce=89f5h3j54bc3</pre>
<p style="text-align: justify;">A string nonce encontra-se nesta parte _wpnonce=89f5h3j54bc3, em que a senha <strong>89f5h3j54bc3</strong> é gerada aleatoriamente segundo estas regras:</p>
<ul style="text-align: justify;">
<li>Uma senha só é gerada uma vez para um único usuário</li>
<li>A senha gerada só respeita uma ação (remover, editar, guardar, etc) para um objeto (post, página, link, etc)</li>
<li>Esta senha é um transient guardado por apenas 24h</li>
</ul>
<p style="text-align: justify;"><strong>Como criar uma senha nonce:</strong></p>
<p style="text-align: justify;">Existem dois métodos de gerar uma senha, sendo que um é mais habitual na geração de links e outro para formulários que usem o método POST.</p>
<pre class="brush:php">&lt;?php
// Criar uma senha nonce que será colocada no final
// do URL dado. O resultado da função wp_nonce_url()
// será o próprio URL com a senha no final.
$url = wp_nonce_url( admin_url( 'post.php?post=54&amp;action=trash' ) , 'ewp_post_trash_54' );

?&gt;</pre>
<p style="text-align: justify;">O URL retornado seria hipoteticamente o mostrado em cima. O segundo parâmetro da função wp_nonce_url() é um identificador que deve ser único: use o prefixo do seu plugin em conjunto com o objeto referido e a ação a que respeita.</p>
<p style="text-align: justify;">Outro método importante é a função wp_nonce_field():</p>
<pre class="brush:php">&lt;?php
// Gerar um input do tipo hidden que albergará a nossa
// senha nonce.
// Este trecho de código poderia hipoteticamente servir
// num plugin que renomeie posts
?&gt;
&lt;form action="" method="post"&gt;
  &lt;?php wp_nonce_field( 'ewp_post_rename_' . $post-&gt;ID ); ?&gt;
  &lt;input type="hidden" name="post_id" value="&lt;?php echo $post-&gt;ID; ?&gt;" /&gt;
  &lt;input type="hidden" name="action" value="rename" /&gt;
  &lt;input type="submit" value="Renomear" /&gt;
&lt;/form&gt;</pre>
<p style="text-align: justify;">Esta função, tal como a sua função irmã, recebe como parâmetro um identificado único que diz respeitante à ação do formulário.</p>
<p style="text-align: justify;"><strong>Verificar se um senha nonce está correcta:</strong></p>
<p style="text-align: justify;">Esta é a parte que realmente importa. Aqui iremos verificar através da função <em>check_admin_referer()</em> se a senha fornecida existe na base de dados de transients e se corrobora as obrigações descritas em cima.</p>
<p style="text-align: justify;">No código seguinte, vou mostrar qual deve ser a implementação de segurança para um formulário igual ao que foi mostrado em cima:</p>
<pre class="brush:php">&lt;?php
// Vamos testar se o usuário atual tem permissões
// de gestão das configurações da instalação do WP
if ( !current_user_can( 'manage_options' ) )
  wp_die( 'Privilégios insuficientes!' );

// Vamos testar se a ação é legítima, ou seja,
// seja proveniente do WordPress
$action = $_REQUEST['action'];
$id = $_REQUEST['post_id'];
check_admin_referer( 'ewp_post_'.$action.'_'.$id );
// Código do seu plugin

?&gt;</pre>
<p style="text-align: justify;">Basicamente, este código primeiramente testa se o usuário tem permissão de acesso a estas configurações através da função <em>current_user_can()</em>, e, caso não tenha é gerado um erro do WordPress, e todo o script pára de correr nesse momento. Isto é conseguido com a função <em>wp_die()</em>.</p>
<p style="text-align: justify;">Na segunda parte do código, avaliamos se a ação pedida é legítima, ou seja, é proveniente do próprio WordPress e não de um link externo de alguém mal intensionado. Desta maneira garantimos que a segurança necessária para o nosso plugin.</p>
<p style="text-align: justify;">Nós preparámos um documento PDF que contém as capacidades mais comuns associadas a um papel. Poderá fazer o download desse documento para sua referência</p>
<h2 style="text-align: center;"><span style="color: #ff0000;"><a href="http://www.escolawp.com/wp-content/uploads/2012/01/escola-wordpress-capacidades-e-papeis.pdf">Faça o Download do documento de Capacidades e Papeis para WordPress</a></span></h2>
<p>E aqui fica a versão em PNG:</p>
<p><a href="http://www.escolawp.com/wp-content/uploads/2012/01/escola-wordpress-capacidades-e-papeis.png"><img class="alignnone size-full wp-image-3997" title="escola-wordpress-capacidades-e-papeis" src="http://www.escolawp.com/wp-content/uploads/2012/01/escola-wordpress-capacidades-e-papeis.png" alt="" width="595" height="842" /></a></p>
<h3><span style="color: #ff0000;"><strong>VALIDAÇÃO E SANEAMENTO DOS DADOS POSTADOS</strong></span></h3>
<p style="text-align: justify;">Depois de vermos dois principais tipos de ataque mais comuns que as comunidades blogueiras temem, existe um outro, que entre todos, é aquele que provavelmente o aluno deve ter mais conhecimento: ataque de força bruta.</p>
<p style="text-align: justify;">Anteriormente vimos ataques de usuários mal intensionados, que tentam ganhar privilégios no sistema WordPress. Neste caso estamos a falar de um nível superior de ataque a que qualquer servidor está sujeito se não forem implementadas as medidas correctas.</p>
<p style="text-align: justify;">Na anatomia deste ataque podemos destacar o facto de um visitante qualquer usar os campos de formulários para tentar injetar código SQL ou base64, de maneira a apoderar-se do próprio sistema operativo ou furtar informação legítima e proprietária. O WordPress em si já detém de um sistema de proteção contra este tipo de ataques, pois como já vimos na série anterior, para aceder ao banco de dados MySQL este usa o wrapper wpdb, no entanto devemos estar sempre cientes que devemos proteger os nossos formulários contra ataques de força bruta.</p>
<p style="text-align: justify;"><strong>Exemplos de ataque de força bruta: </strong>No formulário de login, no campo password visitante digita um dos seguintes códigos:</p>
<ol style="text-align: justify;">
<li>qwerty123` OR 1 = 1</li>
<li>base64(&#8216;fe2fjweo923fijoe9vwev924gjljvw9s0ierf2jp4vlkw&#8230;..&#8217;);</li>
<li>qwerty&#8221; /&gt; Password: &lt;input name=&#8221;password&#8221; value=&#8221;12345&#8243;</li>
</ol>
<p style="text-align: justify;"><strong>O que acabou de acontecer aqui?</strong></p>
<p style="text-align: justify;">Se qualquer um destes códigos fosse colocado num formulário do seu blogue ou site, você teria sido vítima de um ataque de força bruta. No primeiro exemplo, o visitante tenta ganhar acesso ao formulário de login injetando código SQL. A ideia é muito simples: 1 = 1, logo será sempre verdade mesmo que o utilizador e a password não estejam corretos. O usuário teria ganho permissão para entrar no sistema. No segundo exemplo o usuário usou um código PHP codificado em base64, que poderia correr no ato de login. No terceiro caso o usuário usa HTML para tentar enganar o sistema, apresentando um novo input password.</p>
<p style="text-align: justify;">Qualquer uma destes ataques deve ser ponderado quando construimos um sistema que processa os nossos formulários.</p>
<p style="text-align: justify;">O seguinte código usa o switch como meio de prever estas situações. Assim caso o campo action não seja igual a uma dessas ações, então não faz nada:</p>
<pre class="brush:php">&lt;?php
// Usamos o switch como primeiro meio de proteção
// caso o input tenha de ser uma range de variáveis
switch( $_POST['action'] ) {

  case 'rename' :
    // corre o código para renomear o post
    break;

  case 'trash' :
    // corre o código para remover o post
    break;

  default :
    // Se isto acontece então a ação não corresponde
    // ao que está mapeado, o que pode constituir
    // um ataque de força bruta.
    wp_die( 'A ação não se encontra mapeada.' );
    break;

}
?&gt;</pre>
<p style="text-align: justify;">Esta é a primeira maneira de nos protegermos: se uma variável deverá ter apenas uma range de valores, então mapeamos os valores e forçamos que isso aconteça.</p>
<p style="text-align: justify;"><strong>Primeiro Validar no contexto:</strong></p>
<p style="text-align: justify;">Que é que isto quer dizer? Um input tem um contexto, ou seja, o tipo de valor que se está à espera nesse input. Então, vamos recebê-lo presumindo que o valor que o usuário lá colocou é desse tipo. Caso isso não aconteça será mais fácil descartar os valores. O WordPress e o PHP têm várias funções que nos fazem esse trabalho.</p>
<p style="text-align: justify;"><strong>Valores Inteiros:</strong></p>
<p style="text-align: justify;">Enquanto que a função <em>is_int()</em> avalia se o input é um número inteiro retornando true ou false, a função <em>intval()</em> retorna o valor desse input como um valor inteiro, caso seja convertível. A função <em>absint()</em> retorna o valor absoluto, ou seja, não recebe inteiros negativos.</p>
<pre class="brush:php">&lt;?php
// Vamos analisar o input em que o usuário deverá
// colocar a sua idade.
// Analisamos se o input é um inteiro
if ( !is_int( $_POST['idade'] )
  wp_die( 'Deverá colocar uma idade correta' );

// Como deve ser um inteiro
// positivo, usamos a função absint().
$idade = absint( $_POST['idade'] );

?&gt;</pre>
<p><strong>Textos arbitrários (strings):</strong></p>
<p style="text-align: justify;">No caso do valor esperado ser um texto arbitrário, como um nome, número de celular ou outro caso em que a complexidade do texto não nos permite avaliar mais especificamente que tipo de valor se trata, usamos a função <em>wp_strip_all_tags()</em>:</p>
<pre class="brush:php">&lt;?php
// Este valor é uma string
$nome = wp_strip_all_tags( $_POST['nome'] );</pre>
<p style="text-align: justify;">Esta função elimina qualquer tag HTML, CSS, XML do seu input. É a função ideal para sanear inputs. Formulários com este sistema de proteção não se têm de preocupar mais com ataques de força bruta.</p>
<p style="text-align: justify;">No entanto, há um tipo de ataque que merece uma firewall mais robusta: base64. Nós preparámos um plugin especial que atual como uma firewall para o seu sistema todo. Poderá fazer o download no link que se encontra no final do artigo.</p>
<p style="text-align: justify;"><strong>Validar HTML:</strong></p>
<p style="text-align: justify;">O WordPress tem uma função que faz o saneamento de um input com texto HTML, removendo qualquer código malicioso porém mantendo as tags HTML. A função usada é <em>wp_kses()</em>:</p>
<pre class="brush:php">&lt;?php
// Lista de tags HTML aceites e seus atributos
$tags_aceites = array(
  'p' =&gt; array(),
  'strong' =&gt; array(),
  'a' =&gt; array(
     'href' =&gt; array(),
     'title' =&gt; array(),
  )
);

// Vamos limpar o input HTML
$html = wp_kses( $_POST['html'], $tags_aceites );

?&gt;</pre>
<p style="text-align: justify;">Esta função aceita como parâmetros o HTML em causa e um array de tags e seus atributos que nós aceitamos neste HTML. Qualquer tag que não estejam dentro deste array será removida.</p>
<h3><span style="color: #ff0000;"><strong>FORMATANDO ELEMENTOS PARA USO DE SQL</strong></span></h3>
<p style="text-align: justify;">Vimos no artigo anterior quais os métodos para aceder ao banco de dados, através da classe WPDB. Vamos aprender mais um método, este protege o código SQL contra qualquer tipo de SQL num input.</p>
<pre class="brush:php">&lt;?php
// Função para remover o post
function remover_post() {
  global $wpdb;

  // Este SQL tem um placeholder que aceita um inteiro %d
  $sql = "DELETE FROM {$wpdb-&gt;prefix}_posts WHERE id = %d;";

  // Este é o ID do post que queremos remover
  $id = absint( $_POST['id'] );

  // O método prepare faz a limpeza do SQL.
  // Recebe o SQL com o placeholder e o $id que
  // substituirá o %d no código SQL.
  $sql = $wpdb-&gt;prepare( $sql, $id );

  // Vamos então correr o SQL seguro
  $wpdb-&gt;get_results( $sql );

}

?&gt;</pre>
<p style="text-align: justify;">O método prepare recebe o número de parâmetros iguais ao número de placeholders que existirem no código SQL. Com este sistema de proteção acabámos de excluir a última hipótese de ataque ao servidor: ataque por força bruta com SQL.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>HÁBITOS ACONSELHADOS</strong></span></h3>
<ol style="text-align: justify;">
<li>Sempre que criar um plugin, tente encontrar brechas de segurança. Pense em formas de como é que um usuário malicioso poderia atuar e experimente. Considere também colocar-se no papel de um usuário leigo em informática, e que tipos de uso errados poderia ele dar ao seu plugin.</li>
<li>Sempre que projetar um plugin tenha em consideração a segurança desde o inicio do projeto.</li>
<li>Mantenha sempre o seu plugin atualizado com as novas versões do WordPress.</li>
<li>Comente sempre o seu código. Assim sempre que tiver que o rever será mais fácil entender o que determinada função ou parte do código fará. Na documentação do código use sempre palavras chave como TODO ou TOFIX para indicar melhoramentos a serem feitos nas próximas versões.</li>
<li>Tente sempre ser paragmático quando escrever código e focar-se na lógica do problema.</li>
<li>Prefira decisões em vez de opções. Assim estará a diminuir o número de variáveis com que se tem que preocupar.</li>
<li>Divida o seu código em funções. Fica mais organizado e será mais fácil mantê-lo futuramente.</li>
</ol>
<h3 style="text-align: justify;"><span style="color: #ff0000;">PLUGIN FIREWALL PARA WORDPRESS</span></h3>
<p style="text-align: justify;">Falamos de todos os ataques possíveis e resolvemos todos menos um: ataque com código codificado em base64. Como este tipo de ataque é muito genérico e normalmente ocorre via HTTP ou GET, a solução passa por criar um plugin que atua como firewall.</p>
<p style="text-align: justify;">Nós, da Escola WordPress, criamos um plugin pequeno, muito simples mas bastante robusto que bloqueia qualquer pedido URL que tenha um comprimento exageradamente grande ou que contenha algumas palavras que indiciem que seja um ataque: base64, UNION, JOIN, etc.</p>
<h2 style="text-align: center;"><span style="color: #ff0000;"><a href="http://www.escolawp.com/wp-content/uploads/2012/01/ewp-firewall.zip">Faça Download do Plugin Firewall para WordPress</a></span></h2>
<p style="text-align: justify;"><strong>Instalação:</strong></p>
<ol style="text-align: justify;">
<li>Faça o upload ou instale a partir do menu &#8220;Adicionar Plugin&#8221;</li>
<li>Após a instalação, ative o plugin.</li>
</ol>
<div style="text-align: justify;">Não é necessário fazer mais nada, a partir de agora já se encontra protegido contra ataques via GET e HTTP.</div>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>NOTAS FINAIS</strong></span></h3>
<p style="text-align: justify;">Escrever código para WordPress não é dificil, e interligar código já feito muito menos. No entanto deverá ter sempre em mente que, como qualquer bom software, irá sempre encontrar vulnerabilidades no código. Assim, é sempre necessário estar atento a problemas que possam surgir.</p>
<p style="text-align: justify;">Espero que tenham gostado desta série e que vos tenha sido útil.</p>
<p style="text-align: justify;">Até breve,</p>
<p style="text-align: justify;">Vitor</p>
<p><a rel="nofollow" href="http://www.escolawp.com/aff_elegantthemes" target="_blank"><img border="0" src="http://www.elegantthemes.com/affiliates/banners/570x100.jpg" width="570" height="100"></a></p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/" title="Como Criar Plugins para WordPress (Parte II)">Como Criar Plugins para WordPress (Parte II)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/" title="Como Criar Plugins para WordPress (Parte III)">Como Criar Plugins para WordPress (Parte III)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/" title="Como Criar Plugins para WordPress (Parte I)">Como Criar Plugins para WordPress (Parte I)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/02/templates-wordpress-lancados-em-janeiro-2012/" title="44 Templates WordPress lançados em Janeiro 2012">44 Templates WordPress lançados em Janeiro 2012</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Como Criar Plugins para WordPress (Parte III)</title>
		<link>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/</link>
		<comments>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 18:16:30 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[como criar plugins para wordpress]]></category>
		<category><![CDATA[criar plugins wordpress]]></category>
		<category><![CDATA[dicas para criar plugins wordpress]]></category>
		<category><![CDATA[tutoriais para criar plugins em wordpress]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3956</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/">Como Criar Plugins para WordPress (Parte III)</a></p>
&#160;&#160; Como Criar Plugins para WordPress (Parte III) Este artigo é a terceira parte da série Como Criar Plugins para WordPress. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/">Como Criar Plugins para WordPress (Parte III)</a></p>
<p style="text-align: justify;">Este artigo é a terceira parte da série <a title="Como Criar Plugins para WordPress (Parte I)" href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/">Como Criar Plugins para WordPress</a>. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a sua API simples de implementar. Recentemente um dos nossos leitores contatou-nos indicando que estava tendo dificuldades em encontrar <a title="tutoriais WordPress" href="http://www.escolawp.com/" target="_blank">tutoriais WordPress</a> sobre criar plugins, e sugeriu-nos então que publicássemos uma série de artigos sobre como criar plugins para WordPress, ideia essa que decidimos aceitar!</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>PÁGINAS DE PLUGINS NA ADMINISTRAÇÃO</strong></span></h3>
<p style="text-align: justify;">Alguns plugins mais complexos exigem que o usuário, após a instalação, escolha algumas opções para ativar funcionalidades. É o caso de alguns plugins de cache, tais como o W3 Total Cache. Essa necessidade prende-se com o facto do criador do plugin querer, numa única instalação fornecer o máximo de funcionalidades dentro da área de atuação do mesmo.</p>
<p><img class="alignnone size-full wp-image-3965" title="Selecção_010" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selecção_010.png" alt="" width="156" height="227" /></p>
<p style="text-align: justify;">Já todos vimos plugins que criam subpáginas no menu da administração. A maior parte das abordagens estão corretas, porém, a meu ver, são vários os autores de plugins que pecam de duas maneiras:</p>
<ol style="text-align: justify;">
<li>Criar uma página nova para colocar apenas uma ou duas opções.</li>
<li>Fornecer opções a mais ao usuário.</li>
</ol>
<p style="text-align: justify;">A primeira parte prende-se com a economia de espaço. Se, por exemplo, um plugin for escrito para de alguma maneira alterar links internos do site e houver necessidade de apresentar uma ou duas opções, o ideal seria aproveitar a página de Links Permanentes na administração e colocar lá essas opções, em vez de se criar uma nova página.</p>
<p style="text-align: justify;">Fornecer muitas opções pode baralhar o usuário. A política do WordPress quanto a isto é bastante clara &#8211; fornecer o mínimo de opções e optar pela configuração que abranja mais usuários. Esta ideia traz organização e simplicidade ao WordPress.</p>
<p style="text-align: justify;">Na verdade você pode criar plugins de plugins, isto é, plugins que extendem as funcionalidades de outros plugins, e assim, abranger um nicho de usuários com necessiades específicas.</p>
<p style="text-align: justify;">Um dos casos mais extravagantes neste campo é o plugin para envio e gestão de newsletters <a href="http://wordpress.org/extend/plugins/meenews">MeeNews</a>. Quando este plugin apareceu ocorreu um boom de reviews em vários blogs da especialidade. Muitos afirmavam ser o melhor plugin para WordPress. Na verdade, ele funciona bastante bem, mas apenas quando configurado corretamente. Por ter demasiadas opções, torna o processo de configuração exageradamente complexo e, sendo assim, os usuários acabam por desistir da instalação. Os factos estão à vista: o ranking está bastante baixo e o forum tem muitos threads não respondidos.</p>
<p style="text-align: justify;">Estando aqui o aviso feito, passemos então ao estudo de como criar páginas de opções e agregar opções a páginas nativas do WordPress.</p>
<h3 style="text-align: justify;"><strong>Como criar uma página na administração do WordPress</strong></h3>
<p style="text-align: justify;">Vamos criar uma página de administração dentro do menu &#8220;Opções&#8221; (Settings em inglês). Para isso servimo-nos da nosssa tão bem conhecida add_action():</p>
<pre class="brush:php">&lt;?php
add_action( 'admin_menu', 'ewp_pagina_opcoes' );

function ewp_pagina_opcoes() {
  // criamos a pagina de opções com esta função
  add_options_page( 'As Minhas Opções', 'Minhas Opções', 'manage_options', 'minhas-opcoes', 'ewp_pagina_opcoes_content' );

}

// Interior da página de Opções.
// Esta função imprime o conteúdo da página no ecrã.
// O HTML necessário encontra-se já escrito.
function ewp_pagina_opcoes_content() {
?&gt;
&lt;div class="wrap"&gt;
  &lt;?php screen_icon(); ?&gt;
  &lt;h2&gt;As Minhas Opções&lt;/h2&gt;
  &lt;form action="options.php" method="post"&gt;
    // Todo o conteúdo tem de vir aqui dentro
  &lt;/form&gt;
&lt;/div&gt;
&lt;?php
}
?&gt;</pre>
<p style="text-align: justify;">Como explicado no trecho de código, este é o mínimo necessário para se criar uma página. A função screen_icon() imprime o icon correspondente na página. Todos os inputs têm que ser guardados pela página options.php.</p>
<h3 style="text-align: justify;"><strong>Registar opções de input para a página</strong></h3>
<p style="text-align: justify;">Usando a API de Opções nativa do WordPress é a melhor maneira de podermos garantir que os dados serão armazenados e geridos pelo WordPress, e que este aplica todas as medidas de segurança necessárias aos inputs.</p>
<p style="text-align: justify;">Para isso é necessário registar primeiro quais as novas opções que estamos a acrescentar e como é que as validamos:</p>
<pre class="brush:php">&lt;?php
// Vamos registar as nossas opções
add_action( 'admin_init', 'ewp_registar_opcoes' );

function ewp_registar_opcoes() {
  register_setting( 'ewp_as_minhas_opcoes', 'ewp_as_minhas_opcoes' );
  add_settings_section( 'ewp_opcoes_principais', 'Opções Gerais', 'ewp_opcoes_seccao', 'minhas-opcoes' );
  add_settings_field( 'ewp_opcao_1', 'Coloque o seu texto', 'ewp_opcao_1_input', 'minhas-opcoes', 'ewp_opcoes_principais' );

}

function ewp_opcoes_seccao() {
  echo '&lt;p&gt;Cabeçalho da página&lt;/p&gt;';
}

function ewp_opcao_1_input() {
  // Vamos primeiro buscar a opção registada em cima...
  $opcao = get_option( 'ewp_as_minhas_opcoes' );
  $opcao_1 = $opcao['opcao_1'];

  // ... e agora vamos imprimir o campo de input com a opção
  echo '&lt;input type="text" name="ewp_as_minhas_opcoes[opcao_1]" value="'.$opcao_1.'" /&gt;';

}
?&gt;</pre>
<p style="text-align: justify;">Esta parte pode ser um tanto complicada, mas iremos por partes.</p>
<p style="text-align: justify;">A primeira função<strong> register_setting()</strong> é responsável por dizer ao WP que vai ser criada uma nova opcção chamada <em>ewp_as_minhas_opcoes</em> sendo que esta deverá ser guardada na base de dados com o mesmo nome. Desta maneira o WordPress sempre que encontrar esta opção numa submissão de formulário na administração, saberá que deve atualizar a base de dados com o seu valor. De outro modo, se a opção não fosse registada, o WP apenas a ignorava.</p>
<p style="text-align: justify;">A função <strong>add_settings_section()</strong> vai criar uma nova secção com um cabeçalho. Esta é a forma indicada de agrupar as várias opções. existem plugins que implementam uma estrutura de abas nestas páginas, sendo assim é necessário seguir esta forma de organização para que funcione com os usuários que pretendem a navegação por abas. Esta função aceita quatro argumentos:</p>
<ol style="text-align: justify;">
<li>Um ID arbitrário para identificar a secção nos inputs.</li>
<li>O cabeçalho que será exibido. Pode-se usar o sistema de tradução universal incluído no WordPress __( &#8216;String para traduzir&#8217; ).</li>
<li>A função a chamar, para que possa ser colocado algum texto depois do cabeçalho e antes das opções.</li>
<li>A slug (link) da página onde se pretende que a secção apareça. Se colocar por exemplo <em>options-general.php</em> esta secção aparecerá na página de Opções Gerais.</li>
</ol>
<p style="text-align: justify;">A função <strong>add_settings_field()</strong> adiciona uma opção e imprime o HTML necessário. Aceita como argumentos:</p>
<ol style="text-align: justify;">
<li>Um identificador do campo / opção.</li>
<li>A label para esse campo.</li>
<li>A função que irá imprimir o HTML.</li>
<li>A slug da página onde quer que apareça.</li>
<li>A secção onde quer agrupar as opções.</li>
</ol>
<div style="text-align: justify;">Esta função pode ser usada para criar vários campos de opções. Por exemplo, se você quiser criar cinco campos individuais, terá que chamar cinco vezes esta função, cada uma chamando a sua função específica no código. Também poderá criar as secções que queira.</div>
<p style="text-align: justify;">A aqui uma screenshot do resultado final:</p>
<p><img class="alignnone size-full wp-image-3964" title="Selecção_011" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selecção_011.png" alt="" width="383" height="209" /></p>
<h3><strong><span style="color: #ff0000;">ADICIONAR CAMPOS NAS PÁGINAS DA ADMINISTRAÇÃO JÁ EXISTENTES</span></strong></h3>
<p style="text-align: justify;">Claro que é possível, como já foi dito em cima, criar campos de opções e associá-los a páginas já existentes em vez de se criar uma nova página.</p>
<p style="text-align: justify;">Para exemplificar isso, vamos criar um campo novo na página de Privacidade:</p>
<pre class="brush:php">&lt;?php
add_action( 'admin_init', 'ewp_opcoes_privacidade' );

function ewp_opcoes_privacidade() {
  // Vamos registar a opção com o WordPress
  register_setting( 'privacy', 'ewp_as_minhas_opcoes' );

  // Adicionar o campo na página de Privacidade
  add_settings_field( 'ewp_opcao_1', 'Um campo customizado', 'ewp_opcao_1_input', 'privacy', 'default' );

}
?&gt;</pre>
<p>E este é o resultado final:</p>
<p><img class="alignnone size-full wp-image-3966" title="Selecção_012" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selecção_012.png" alt="" width="563" height="241" /></p>
<h3><strong><span style="color: #ff0000;">ACESSO À BASE DE DADOS</span></strong></h3>
<p style="text-align: justify;">O WordPress usa pouco SQL para acessar a base de dados. Em vez disso, toda a conecção é efetuado através da class WPDB, baseado no código EzSQL. Esta classe gere todas as tabelas da base de dados e seus conteúdos. É responsável por toda a conexão do WordPress.</p>
<p style="text-align: justify;">É possível obviamente usarmos essa classe para criarmos a nossas próprias tabelas, ou simplesmente retirar ou guardar dados usando SQL. Embora os developers sugerem a utilização dos Custom Post Types e da tabela wp_posts para guardar dados, por vezes é necessário criar uma tabela específica pois a sua estrutura é muito diferente.</p>
<p style="text-align: justify;">Por vezes, como é o caso do nosso exemplo, criar uma nova tabela pode ser mais benéfico. Se você pretender guardar os IPs dos seus usuários que visitam o site, é preferível colocá-lo noutra tabela, pois devido à grande quantidade de dados envolvida, usar a wp_posts poderia causar lentidão do site.</p>
<h3 style="text-align: justify;"><strong>Criando uma nova tabela na base de dados</strong></h3>
<pre class="brush:php">&lt;?php

// Vamos criar uma tabela que irá guardar os IPs dos usuários que
// acessam o nosso website.
// ATENÇÃO: Este código é apenas didático. Se o usar para produção
// poderá vir a sofrer tempos de resposta maiores, pois irá guardar
// muitos dados na base de dados.

add_action( 'init', 'ewp_create_table' );

function ewp_create_table() {
  // Acesso ao objeto global de gestão de bases de dados
  global $wpdb;

  // Vamos checar se a nova tabela existe
  // A propriedade prefix é o prefixo de tabela escolhido na
  // instalação do WordPress
  $tablename = $wpdb-&gt;prefix . 'hits';

  // Se a tabela não existe vamos criá-la
  if ( $wpdb-&gt;get_var( "SHOW TABLES LIKE '$tablename'" ) != $tablename ) {

    $sql = "CREATE TABLE `$tablename` (
         `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
         `hit_ip` VARCHAR( 100 ) NOT NULL,
         `hit_date` DATETIME
    );";

    // Para usarmos a função dbDelta() é necessário carregar este ficheiro
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

    // Esta função cria a tabela na base de dados e executa as otimizações
    // necessárias.
    dbDelta( $sql );

  }

}
?&gt;</pre>
<p>Para completar o nosso código de registo dos IPs dos usuários, vamos criar criar o nosso procedimento para guardar os registos na tabela:</p>
<pre class="brush:php">&lt;?php

// Devido à quantidade de dados que esta função poderia gerar,
// vamos apenas atualizar a base de dados de 10 em 10 minutos.
// Desta forma, se um usuário permanecer no site por 30 minutos,
// será registado três vezes na tabela.

add_action( 'init', 'ewp_regist_ips' );

function ewp_regist_ips() {
  global $wpdb;

  // IP do usuário
  $ip = $_SERVER["REMOTE_ADDR"];

  // A Hora a que o usuário acessou
  $current_time = current_time( 'mysql' );

  // Vamos selecionar da base de dados os IPs registados à
  $id = $wpdb-&gt;get_var("SELECT id FROM ".$wpdb-&gt;prefix."hits WHERE hit_ip = '$ip' AND hit_date BETWEEN '.date("Y-m-d H:i:s", time() - 10 ).' AND '$current_time';");

  // Checamos se não existe nenhum registo procedemos
  if ( ! $id ) {
    // Registar os IPs na base de dados
    $novo_ip = array(
      'hit_ip' =&gt; $ip,
      'hit_date' =&gt; $current_time,
    );

    // Guardar os valores na tabela
    $wpdb-&gt;insert( $wpdb-&gt;prefix . "hits", $novo_ip );

  }

}
?&gt;</pre>
<p style="text-align: justify;">E aqui temos um plugin que poderá ser colocado no functions.php do seu tema.</p>
<p style="text-align: justify;">Poderá fazer o download deste plugin no rodapé deste artigo.</p>
<p style="text-align: justify;">Neste trecho de código nós vimos dois novos métodos do objeto $wpdb. O método insert() insere novos dados na base de dados usando apenas um array. O método get_var(), usando SQL, conseguimos buscar dados às tabelas da base de dados.</p>
<p style="text-align: justify;">Existem também outros métodos:</p>
<ul style="text-align: justify;">
<li>get_row( $sql ) : usando SQL, você poderá ir buscar qualquer linha na base de dados. O método retorna um array associativo.</li>
<li>get_results( $sql ) : caso pretenda buscar várias linhas no SQL, este método retorna-lhe um array de arrays, cada um deles associativo.</li>
<li>update( $nome_da_table, $data ) : este método é similar ao insert(), porém você deverá passar a chave primária (id) da linha que quer atualizar.</li>
</ul>
<div style="text-align: justify;">Para mais informações acerca desta classe, poderá ver <a href="http://codex.wordpress.org/Class_Reference/wpdb">aqui</a> no site do Codex.</div>
<h3><span style="color: #ff0000;"><strong>PLUGGABLE FUNCTIONS</strong></span></h3>
<p style="text-align: justify;">As funções plugáveis, são funções carregadas pelo WordPress após todos os plugins estarem carregados, permitindo aos autores reescreverem essas funções da maneira que quiserem.</p>
<p style="text-align: justify;">Todas as funções dentro do ficheiro wp-includes/pluggable.php podem ser rescritas. Basta o autor de plugin colocar no ficheiro principal uma função com o mesmo nome.</p>
<p style="text-align: justify;">É muito natural os autores reescreverem a função wp_mail() &#8211; que se encontra nesse ficheiro &#8211; para poderem enviar emails do WordPress através de um servidor SMTP.</p>
<p style="text-align: justify;">Não me vou alongar nesta matéria pois as possibilidades são inifinitas, ficando apenas a nota que você pode reescrever as funções que se encontram nesse ficheiro a seu gosto.</p>
<h3><span style="color: #ff0000;"><strong>DOWNLOAD DO CÓDIGO</strong></span></h3>
<p style="text-align: justify;">Este código serve apenas pra fins didáticos e não deve ser usado em sites de produção. Poderá fazer o download do código didático aqui.</p>
<h2 style="text-align: center;"><strong><a href="http://www.escolawp.com/wp-content/uploads/2012/01/criar-pagina-administracao.php_.zip">Download do Código do Artigo</a></strong></h2>
<h3><span style="color: #ff0000;"><strong>DOWNLOAD DO PLUGIN DE REGISTOS DOS IPS</strong></span></h3>
<p>Criámos um plugin especial para este artigo, baseado no código apresentado.</p>
<p><img class="alignnone size-full wp-image-3962" title="Selecção_008" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selecção_008.png" alt="" width="444" height="104" /></p>
<p style="text-align: justify;">Este plugin regista os IPs dos seus usuários numa tabela customizada para depois poder acessar através de uma página da administração, no menu Ferramentas.</p>
<p><img class="alignnone size-full wp-image-3963" title="Selecção_009" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selecção_009.png" alt="" width="585" height="319" /></p>
<h2 style="text-align: center;"><strong><a href="http://www.escolawp.com/wp-content/uploads/2012/01/ewp-regitar-ips.zip">Plugin Registo de IP</a></strong></h2>
<h3><strong><span style="color: #ff0000;">NOTAS FINAIS</span></strong></h3>
<p style="text-align: justify;">Ao criar o seu plugin tenha sempre em conta ser o mais responsável para com a instalação dos seus usuários. Se você tiver a necessidade de criar uma tabela na base de dados, por exemplo, faça-o apenas na ativação do plugin e não se esqueça de implementar uma função de remoção da tabela na desinstalação do plugin. O procedimento é o mesmo.</p>
<p style="text-align: justify;">No próximo artigo iremos falar apenas e exclusivamente sobre segurança nos plugins e no WordPress em geral, hábitos e padrões que devem ser seguidos, matéria que tenho andado a adiar nos últimos artigos.</p>
<p style="text-align: justify;">Espero que este artigo tenha sido útil, continuem a percorrer esta série. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Abraço,</p>
<p style="text-align: justify;">Vitor</p>
<p><a rel="nofollow" href="http://www.escolawp.com/aff_elegantthemes" target="_blank"><img border="0" src="http://www.elegantthemes.com/affiliates/banners/570x100.jpg" width="570" height="100"></a></p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/" title="Como Criar Plugins para WordPress (Parte I)">Como Criar Plugins para WordPress (Parte I)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/" title="Como Criar Plugins para WordPress (Parte II)">Como Criar Plugins para WordPress (Parte II)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/" title="Guia definitivo para criar Custom Post Types (Parte 5)">Guia definitivo para criar Custom Post Types (Parte 5)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Como colocar comentários do Facebook no WordPress sem precisar de plugins</title>
		<link>http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/</link>
		<comments>http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 17:05:53 +0000</pubDate>
		<dc:creator>Paulo Faustino</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[comentários do facebook no wordpress]]></category>
		<category><![CDATA[comentários do facebook no wordpress sem plugins]]></category>
		<category><![CDATA[comentários facebook sem precisar de plugins]]></category>
		<category><![CDATA[como colocar comentários do Facebook no WordPress]]></category>
		<category><![CDATA[dicas wordpress]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3939</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></p>
&#160;&#160; Como colocar comentários do Facebook no WordPress sem precisar de plugins Já aqui falámos na Escola WordPress sobre sobre como colocar comentários do Facebook no seu blog WordPress e também como usar o Facebook Insights no seu blog WordPress. No entanto, no guest-post de hoje, o Rodrigo pretende explicar-nos, passo-a-passo de forma prática, como colocar [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></p>
<p>Já aqui falámos na Escola WordPress sobre sobre como colocar <a title="comentários do Facebook no seu blog WordPress" href="http://www.escolawp.com/2011/02/comentarios-do-facebook-no-seu-blog-wordpress/" target="_blank">comentários do Facebook no seu blog WordPress</a> e também <a title="como usar o Facebook Insights no seu blog WordPress" href="http://www.escolawp.com/2011/07/como-usar-o-facebook-insights-para-o-seu-blog-wordpress/" target="_blank">como usar o Facebook Insights no seu blog WordPress</a>. No entanto, no guest-post de hoje, o Rodrigo pretende explicar-nos, passo-a-passo de forma prática, como colocar os comentários do Facebook no WordPress sem precisar de plugins. Tendo em consideração que o uso de plugins pode deixar o seu blog mais lento, pelos constantes pedidos ao banco de dados, esta solução do Rodrigo torna-se simplesmente fantástica para quem deseja tirar o máximo partido dos comentários do Facebook no seu blog em WordPress.</p>
<p><img class="alignnone size-full wp-image-3951" title="facebook-wordpress" src="http://www.escolawp.com/wp-content/uploads/2012/01/facebook-wordpress.png" alt="facebook-wordpress" width="550" height="230" /></p>
<h3><span style="color: #ff0000;">CRIANDO UMA NOVA APLICAÇÃO</span></h3>
<ul>
<li>Para iniciar nossos trabalhos, devemos criar uma aplicação no Facebook <a href="http://developers.facebook.com/" target="_blank">(Clique aqui para acessr a página)</a></li>
<li>Clique em &#8220;Aplicativos&#8221;:</li>
</ul>
<div><img class="alignnone size-full wp-image-3940" title="apps" src="http://www.escolawp.com/wp-content/uploads/2012/01/apps.png" alt="apps" width="520" height="32" /></div>
<ul>
<li>Depois em &#8220;+ Criar novo aplicativo:</li>
</ul>
<div><img class="alignnone size-full wp-image-3948" title="novo app" src="http://www.escolawp.com/wp-content/uploads/2012/01/novo-app.png" alt="novo app" width="153" height="49" /></div>
<ul>
<li>Após isto, aparecerá uma janela pop-up pedindo as informações do aplicativo, dê à ele um Nome (Lembrando que sua conta do facebook deve ser confirmada com cartão de crédito, ou celular).</li>
</ul>
<div><img class="alignnone size-full wp-image-3949" title="novoapp-popup" src="http://www.escolawp.com/wp-content/uploads/2012/01/novoapp-popup.png" alt="novoapp-popup" width="610" height="222" /></div>
<ul>
<li>Criado o aplicativo aparecerá esta janela, com as informações do aplicativo:</li>
</ul>
<div><img class="alignnone size-full wp-image-3947" title="janela" src="http://www.escolawp.com/wp-content/uploads/2012/01/janela.png" alt="janela" width="576" height="127" /></div>
<p>&nbsp;</p>
<p>Pode fechar a janela, agora vamos a segunda parte do nosso tutorial.</p>
<h3><span style="color: #ff0000;">CRIANDO O SISTEMA DE COMENTÁRIOS</span></h3>
<p>Esta parte é facil e não demora nem 5 minutinhos. Vamos começar?</p>
<ul>
<li>Primeiramente acesse a página de plugins do Facebook, <a href="http://facebook.com/plugins" target="_blank">clicando aqui.</a></li>
<li>Clique no link &#8220;Comments&#8221;, como veremos abaixo:</li>
</ul>
<div><img class="alignnone size-full wp-image-3944" title="comments" src="http://www.escolawp.com/wp-content/uploads/2012/01/comments.png" alt="comments" width="608" height="103" /></div>
<ul>
<li>Esta é a página de configuração dos comentarios, coloque a url do seu blog (No meu caso http://jegueass.org), o número de comentários que deseja exibir (No meu caso 15, para não sobrecarregar a página), a largura (no meu caso 710px) e o &#8220;Esquema de Cores&#8221; Dark ou Light (Como o tema do meu blog é escuro, escolhi o sistema &#8220;Dark&#8221; pois dará o contraste certo para meu blog).</li>
</ul>
<div><img class="alignnone size-full wp-image-3942" title="comments" src="http://www.escolawp.com/wp-content/uploads/2012/01/comments-2.png" alt="comments" width="620" height="438" /></div>
<ul>
<li>Agora é só clicar em &#8220;Get Code&#8221; escolher o aplicativo criado, o modo de implementação e depois copiar o código para o blog. (Eu Escolhi o modo HTML5, pois é mais simples a alteração do tema).</li>
</ul>
<div><img class="alignnone size-full wp-image-3943" title="comments" src="http://www.escolawp.com/wp-content/uploads/2012/01/comments-3.png" alt="comments" width="628" height="441" /></div>
<h3><span style="color: #ff0000;">IMPLEMENTANDO O CÓDIGO NO BLOG</span></h3>
<p>Agora é que vem a parte mais simples de todo o tutorial, a implementação do código.</p>
<ul>
<li>Acesse a página do editor de temas do wordpress, e abra o &#8220;footer.php&#8221; ou &#8220;header.php (No meu caso, implementei no &#8220;footer.php&#8221;), procure uma boa área e coloque o primeiro código sugerido pelo facebook.</li>
</ul>
<div><img class="alignnone size-full wp-image-3945" title="footer" src="http://www.escolawp.com/wp-content/uploads/2012/01/footer.png" alt="footer" width="569" height="145" /></div>
<ul>
<li>Feito isso acesse o &#8220;single.php&#8221;, ache a área que preferir para implementar o código e cole.</li>
</ul>
<div><img class="alignnone size-full wp-image-3941" title="single" src="http://www.escolawp.com/wp-content/uploads/2012/01/c¢digo-single.png" alt="single" width="640" height="96" /></div>
<p>Aqui está a mágica, lembra quando colocamos a URL de nosso blog lá na hora de configurar o plugin? Mudaremos ela agora, seu código ficará parecido com o meu acima, procure o trecho que diz:</p>
<pre class="brush:php">data-href="http://www.jegueass.org/</pre>
<p>Ao lado da sua URL, após a barra, coloque o seguinte código:</p>
<pre class="brush:php">?p=&lt;?php the_ID(); ?&gt;</pre>
<p>Este código irá puxar a ID do seu post automaticamente e incluirá após a sua URL, fazendo assim, os comentários do facebook mudarem a cada post.</p>
<p>Abraços</p>
<p><em>O artigo de hoje foi um guest post do Rodrigo, blogueiro que escreve no <a href="http://www.jegueass.org/" target="_blank">blog Jegueass</a>.</em></p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/" title="Guia definitivo para criar Custom Post Types (Parte 2)">Guia definitivo para criar Custom Post Types (Parte 2)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" title="Guia definitivo para criar Custom Post Types (Parte 1)">Guia definitivo para criar Custom Post Types (Parte 1)</a></li><li><a href="http://www.escolawp.com/2011/10/como-criar-custom-page-templates-no-wordpress/" title="Como criar Custom Page Templates no WordPress?">Como criar Custom Page Templates no WordPress?</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-carregar-imagens-no-wordpress-a-medida-que-se-faz-scroll-na-pagina/" title="Como carregar imagens no WordPress à medida que se faz scroll na página?">Como carregar imagens no WordPress à medida que se faz scroll na página?</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/feed/</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
		<item>
		<title>Como Criar Plugins para WordPress (Parte II)</title>
		<link>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/</link>
		<comments>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 17:26:44 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[aprender a criar plugins]]></category>
		<category><![CDATA[como criar plugins para wordpress]]></category>
		<category><![CDATA[como criar um plugin para wordpress]]></category>
		<category><![CDATA[criar plugins]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3899</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/">Como Criar Plugins para WordPress (Parte II)</a></p>
&#160;&#160; Como Criar Plugins para WordPress (Parte II) Este artigo é a segunda parte da série Como Criar Plugins para WordPress. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/">Como Criar Plugins para WordPress (Parte II)</a></p>
<p style="text-align: justify;">Este artigo é a segunda parte da série <a title="Como Criar Plugins para WordPress (Parte I)" href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/">Como Criar Plugins para WordPress</a>. O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a sua API simples de implementar. Recentemente um dos nossos leitores contatou-nos indicando que estava tendo dificuldades em encontrar <a title="tutoriais WordPress" href="../" target="_blank">tutoriais WordPress</a> sobre criar plugins, e sugeriu-nos então que publicássemos uma série de artigos sobre como criar plugins para WordPress, ideia essa que decidimos aceitar!</p>
<h3><span style="color: #ff0000;">COMO É QUE OS PLUGINS INTERAGEM COM O WORDPRESS?</span></h3>
<p style="text-align: justify;">Na primeira parte fizemos uma introdução ao desenvolvimento de plugins para WordPress. Falámos sobre os tipos de plugins que existem, convenções usadas e funções base para começarmos o nosso desenvolvimento. No entanto, uma secção ficou em aberto: como é que os plugins interagem com o WordPress.</p>
<p style="text-align: justify;">Como adiantado no artigo anterior, o WordPress apresenta várias APIs para que plugins e temas possam interagir facilmente e criar novas ou alterar funcionalidades:</p>
<ul style="text-align: justify;">
<li><strong>Plugin </strong>– Providencia as hooks – um conjunto de acções e filtros – para que os plugins possam interagir em várias partes do WordPress de maneira muito simples;</li>
<li><strong>Widgets</strong> – Permite colocar pedaços de código nas sidebars registadas do nosso tema, fazendo com que haja o display de várias informações na parte do site.</li>
<li><strong>Shortcode</strong> – Permite que um editor chame uma função PHP definida no plugin de maneira simples no editor de posts.</li>
<li><strong>HTTP</strong> – Esta API é um meio standard para fazer chamadas HTTP a servidores remotos sem que o autor do plugin se tenha que preocupar se existe cURL instalado. Basta chamar através desta API e ela preocupa-se em determinar qual o método de chamada mais apropriado para o servidor em que corre.</li>
<li><strong>Settings</strong> – Permite a inserção de campos de opções personalizados na administração do WordPress para que estes possam ser usados pelos plugins facilmente. Com esta API o autor não se tem que preocupar com segurança nos ataques CRSF e XSS – ela faz tudo por si.</li>
<li><strong>Dashboard Widgets</strong> – Permite criar e alterar widgets para a Dashboard da administração e com controlo de acessos.</li>
<li><strong>Rewrite</strong> – Possibilita a criação de rewrite rules personalizadas para vários pontos do código dos plugins.</li>
<li><strong>Transients</strong> – Sistema de cache básico persistente na base de dados com tempo de expiração. Pode ser usado para adicionar opções temporárias.</li>
<li><strong>Database</strong> – Acesso rápido à base de dados sem haver necessidade de conhecimento de SQL. Permite inserir, atualizar, remover e selecionar registos.</li>
<li><strong>Pluggable Functions</strong> – Funções providenciadas pelo WordPress que podem ser completamente redefinidas. É o caso da função wp_mail() que pode ser alterada para usar um servidor SMTP em vez do atual Sendmail.</li>
</ul>
<div style="text-align: justify;">Pelo facto destas APIs serem muito grandes iremos principalmente focar-nos em exemplos e dividir entre este e o próximo artigo as APIs.</div>
<h3><span style="color: #ff0000;">PLUGIN ACÇÕES E FILTROS</span></h3>
<p style="text-align: justify;">Ao contrário da maior parte dos CMSes e Frameworks em PHP, o WordPress é construído em cima de uma estrutura de  procedimento, usando classes apenas dentro da Core como forma de organização e não de estrutura. Ao invés de usar uma estrutura MVC com a herança de classes, o WordPress é &#8220;montado&#8221; através de Hooks &#8211; acções e filtros &#8211; que são &#8220;disparados&#8221; em momentos específicos, chamando funções registadas dentro de cada uma das acções ou filtros. Este é um dos grandes entraves para developers que migram de outras plataformas, no entanto, na minha opinião, a forma como o WordPress está construído trás muito mais vantagens. Posso enumerar algumas:</p>
<ol>
<li style="text-align: justify;">Classes em PHP são um meio dispendioso de recursos para estruturar códigos, pois de cada vez que se instância um novo objecto a carga de CPU é grande, além de que todos os métodos e propriedades de cada um dos objectos permanece na RAM até à sua remoção. Deve-se sempre avaliar se é realmente necessário criar uma classe ou usar apenas umas funções para fazer o nosso trabalho.</li>
<li style="text-align: justify;">Em quase todo o código do WordPress é possível filtrar dados e acionar acções, sem que haja um aumento do tempo de resposta e carregamento do WordPress.</li>
<li style="text-align: justify;">Ainda assim, é possível usar-se um modelo MVC nos seus plugins, basta que os métodos da classe pai (controller) implementem as acções e filtros apropriados ao nosso trabalho.</li>
</ol>
<h3><span style="color: #ff0000;"><strong>ACÇÕES E FILTROS</strong></span></h3>
<p style="text-align: justify;">A implementação de uma hook no WordPress é feita pela função do_action( $id, $args ) na parte do código onde se pretenda dar a possiblidade de inserir novas acções.</p>
<p style="text-align: justify;">A título de exemplo, no ficheiro wp-includes/general-template.php, linha 1580 (versão 3.3.1), é definida a função wp_footer(), normalmente incluída no template footer.php dos temas:</p>
<pre class="brush:php">/**
 * Fire the wp_footer action
 *
 * @since 1.5.1
 * @uses do_action() Calls 'wp_footer' hook.
 */
function wp_footer() {
    do_action('wp_footer');
}</pre>
<p>Esta função apenas apresenta no seu conteúdo <span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">do_action(&#8216;wp_footer&#8217;);</span> . Este é um bom exemplo do poder modular que as hooks têm no WordPress, pois qualquer função registada na hook wp_footer, pode ser removida.</p>
<p><strong>Registar Funções numa Hook</strong></p>
<p>A função add_action( $id, $nome-da-funcao, $prioridade, $numero-de-argumentos ); regista numa hook uma função qualquer comum para ser &#8220;disparada&#8221; nesse momento.</p>
<p>Por exemplo:</p>
<pre class="brush:php">add_action( 'wp_footer', 'funcao_copyright', 10, 0 );

function funcao_copyright() {
   echo 'Copyright (c) Escola WordPress';
}</pre>
<p style="text-align: justify;">Assim, quando for chamada a função wp_footer() no nosso template, a função que acabámos de registar também correrá mostrando o copyright da Escola WordPress.</p>
<p style="text-align: justify;"><strong>Remover Funções duma Hook</strong></p>
<p style="text-align: justify;">A função remove_action( $tag, $function_to_remove ); permite remover qualquer função registada para qualquer hook.</p>
<p style="text-align: justify;">Por exemplo, pegando no código anterior, iremos registar a função e voltar a removê-la da hook:</p>
<pre class="brush:php">add_action( 'wp_footer', 'funcao_copyright', 10, 0 );

function funcao_copyright() {
   echo 'Copyright (c) Escola WordPress';
}

remove_action( 'wp_footer', 'funcao_copyright' );</pre>
<p style="text-align: justify;">Se corresse este código, o copyright não iria aparecer pois, o que acabámos de fazer foi registar a função para em seguida removê-la.</p>
<p>Claro que este código não faz sentido, pois seria um gasto de processamento desnecessário, porém serve para demonstrar o poder das hooks. Desta forma, damos ao developer a possibilidade de remover seja o que quiser, mesmo uma função que esteja na core do WordPress e poder implementar a sua própria função customizada sem ter que alterar o código da core.</p>
<h2><strong>O que são os filtros?</strong></h2>
<p style="text-align: justify;">Ao contrário das acções, os filtros servem, nem mais nem menos, para filtrar informação passada pelo WordPress em determinados momentos. Funciona da mesma maneira que as acções, porém as funções registadas nessas hooks recebem como argumento um array de variáveis com informações para serem filtradas. Esse mesmo array, já com os filtros customizados serão retornados no final do procedimento da função.</p>
<h2><strong>Registar e Remover Funções de filtro</strong></h2>
<p style="text-align: justify;">As funções add_filter() e remove_filter() aceitam os mesmos argumentos e comportam-se da mesma maneira, excepto no argumento das funções registadas:</p>
<pre class="brush:php">// Acrescentar Bold nos títulos dos artigos via add_filter
add_filter( 'the_title', 'titulo_acrescenta_bold' );

function titulo_acrescenta_bold( $titulo ) {
   return '&lt;b&gt;'.$titulo.'&lt;/b&gt;';
}</pre>
<p style="text-align: justify;">Neste caso simples, recebemos uma variável que, depois de modificada deve retornar a função.</p>
<h2><strong>Acrescentar Hooks customizadas nos plugins</strong></h2>
<p style="text-align: justify;">Esta API pode ser (e deve ser) usada também nos plugins e temas para que outros developers possam também eles hackear os seus plugins sem ter que alterar o seu código.</p>
<p style="text-align: justify;">A função do_action( &#8216;nome_da_hook&#8217; ); pode ser colocado em qualquer lugar do código, basta ter em atenção para que o id da hook já não esteja registado algures no WordPress. Para isso, prefixe-o com as iniciais do seu plugin, por exemplo, por forma a evitar esse problema.</p>
<pre class="brush:php">...
// Código do seu plugin
do_action( 'escolawp_rodape' );
A função apply_filter faz o mesmo, mas para filtrar informação, por exemplo um array:

$elementos = apply_filters( 'escolawp_filtro_array', array( 'a' =&gt; 'b', 'c' =&gt; 'd' ) );
foreach( $elementos as $elemento )
// Código qualquer</pre>
<p style="text-align: justify;">Neste caso estamos a dar a possibilidade de developers manipularem o conteúdo do array.</p>
<h3><span style="color: #ff0000;"><strong>WIDGETS</strong></span></h3>
<p style="text-align: justify;">Esta API já foi muito falada aqui na escola, dexamos aqui o <a title="DOWNLOAD GRÁTIS: Plugin/Widget com contadores de RSS, Twitter, Facebook para WordPress" href="http://www.escolawp.com/2011/10/download-gratis-plugin-widget-com-contadores-de-rss-twitter-facebook-para-wordpress/" target="_blank">link</a> para um dos artigos que explica como criar widgets para WordPress. Essa implementação pode ser facilmente transportada para um plugin.</p>
<h3><span style="color: #ff0000;">SHORTCODES</span></h3>
<p style="text-align: justify;">Esta API é muito útil e fácil de implementar. Permite que qualquer utilizador possa correr código PHP dentro de um post ou página recorrendo apenas à inserção uma tag do tipo [tag argumento="valor"] no lugar onde pretende.</p>
<p style="text-align: justify;">Se registar a função add_shortcode( &#8216;tagqualquer&#8217;, &#8216;funcao_qualquer&#8217; ); permite que o utilizador insira a tag [tagqualquer] num post para que a funcao_qualquer possa ser chamada na posição onde o utilizador pretende.</p>
<pre class="brush:php">add_shortcode( 'cumprimentos', 'escolawp_cumprimentos' );

function escolawp_cumprimentos() {
  echo '&lt;p&gt;Com os melhores cumprimentos,&lt;br /&gt;Escola WordPress&lt;/p&gt;';
}</pre>
<p style="text-align: justify;">A implementação acima dá a possibilidade ao autor do post de incluir [cumprimentos] no final do post e que no site apareça a string HTML que se encontra na função.</p>
<p>Para mais ideias sobre shortcodes, leia <a title="15 shortcodes criativos para usar no seu WordPress" href="http://www.escolawp.com/2011/08/shortcodes-criativos-para-usar-no-seu-wordpress/" target="_blank">este artigo</a>.</p>
<h3><strong><span style="color: #ff0000;">HTTP</span></strong></h3>
<p style="text-align: justify;">Esta API pretende centralizar todas as chamadas HTTP via PHP a páginas externas sem que o developer se tenha que preocupar qual o método instalado no servidor.</p>
<p style="text-align: justify;">Nesta API existem 3 funções importantes:</p>
<pre class="brush:php">$url = 'http://www.escolawp.com';
$argumentos = array(
  'timeout' =&gt; 5, // Desiste da chamada após 5 segundos de inatividade
  'useragent' =&gt; 'Mozilla/5.0', // Permite alterar o "browser" de PHP para Firefox por exemplo
  'sslverify' =&gt; true // Verifica se os certificados SSL são válidos em ligações HTTPS
);

// Faz uma ligação à URL com uma chamada GET
$resultado_get = wp_remote_get( $url, $argumentos );

// Faz uma ligação à URL com uma chamada POST e acrescenta
// dados POST ao argumento em forma de array
$argumento['body'] = array( 'user' =&gt; 'Bob', 'pass' =&gt; 'qwerty' );
$resultado_post = wp_remote_post( $url, $argumentos );

// Para ligações onde é apenas necessário o cabeçalho,
// como por exemplo, se se pretende saber apenas se determinado
// URL encontra-se online, usa-se o método HEAD
$resultado_head = wp_remote_head( $url, $argumentos );</pre>
<p style="text-align: justify;">Qualquer uma desta funções irá retornar um array de arrays com o cabeçalho, o corpo e a resposta. A título de exemplo, aqui fica um retorno genérico de uma chamada por uma destas funções:</p>
<pre class="brush:php">Array
(
    [headers] =&gt; Array
        (
            [date] =&gt; Thu, 30 Sep 2010 15:16:36 GMT
            [server] =&gt; Apache
            [x-powered-by] =&gt; PHP/5.3.3
            [x-server] =&gt; 10.90.6.243
            [expires] =&gt; Thu, 30 Sep 2010 03:16:36 GMT
            [cache-control] =&gt; Array
                (
                    [0] =&gt; no-store, no-cache, must-revalidate
                    [1] =&gt; post-check=0, pre-check=0
                )

            [vary] =&gt; Accept-Encoding
            [content-length] =&gt; 1641
            [connection] =&gt; close
            [content-type] =&gt; application/php
        )
    [body] =&gt; &lt;html&gt;Isto é um site!&lt;/html&gt;
    [response] =&gt; Array
        (
            [code] =&gt; 200
            [message] =&gt; OK
        )

    [cookies] =&gt; Array
        (
        )

)</pre>
<p style="text-align: justify;">Estas funções são portanto muito úteis para developers de WordPress e devem ser usadas em vez do uso de métodos nativos como o cURL ou a função PHP get_file_contents() que sofrem do problema de poderem ou não existir em diversas instalações PHP.</p>
<h3><span style="color: #ff0000;">OPÇÕES</span></h3>
<p style="text-align: justify;">O WordPress implementa a tabela wp_options com uma estrutura que permite salvar qualquer valor na forma de par chave =&gt; valor, sendo que o valor pode ser qualquer tipo nativo do PHP, seja este uma string, array, objecto ou uma instância.</p>
<p style="text-align: justify;">Para isso existem quatro funções que podem ser usadas em qualquer altura para acicionar, receber, remover ou atualizar valores dessa tabela.</p>
<pre class="brush:php">$url = 'http://escolawp.com';

// Adicionamos um valor à tabela wp_options
add_option( 'escolawp_url', $url );

// Recebemos esse valor para uma variável
$url_get = get_option( 'escolawp_url' );

// Atualizamos o valor com novos dados
update_option( 'escolawp_url', $url . '/pagina-link' );

// e por fim removemos o valor da tabela
delete_option( 'escolawp_url' );</pre>
<p style="text-align: justify;">Estas funções são muito simples, fáceis de usar e essenciais para qualquer developer WordPress. Elas permitem de uma forma rápida guardar permanentemente e obter valores da base de dados para uso nos plugins.</p>
<p>O exemplo seguinte guarda um array na tabela:</p>
<pre class="brush:php">add_option( 'escolawp_url', array(
  'url' =&gt; $url,
  'name' =&gt; 'Escola WordPress',
  )
);</pre>
<p style="text-align: justify;">Desta forma, se obtiver este valor através da função get_option( 'escolawp_url' ) irá também  retornar-lhe o array tal e qual como quando o guardou. Fantástico não é?</p>
<p style="text-align: justify;">Acontece que estes registos são permanentes, ou seja, não podem ser usados como meio de guardar sessões, por exemplo, pois necessitaria de um tempo de expiração a partir do qual os valores seriam apagados da base de dados. Foi a pensar nisto que foi criado os transients.</p>
<h3><span style="color: #ff0000;"><strong>TRANSIENTS</strong></span></h3>
<p style="text-align: justify;">Tal como o próprio nome indica, são "coisas" que transitam de um estado para o outro. Um transiente não é mais que um valor que permanece guardado na base de dados por um certo período de tempo, sendo eliminado após ter expirado.</p>
<p style="text-align: justify;">Esta API é muito útil para guardar, por exemplo, sessões em base de dados, em vez de nos cookies do browser.</p>
<p style="text-align: justify;">Para se criar um transient na base de dados usamos a função set_tansient(). As funções get_transient() e delete_transient() recolhem e removem respetivamente os valores da base de dados:</p>
<pre class="brush:php">// Guardar o valor MD5 do login do utilizador por 1 hora
set_transient( 'ewp_user_login_'.get_current_user_id(), md5( get_current_user_id() ), 3600 );</pre>
<p style="text-align: justify;">A função aceita 3 argumentos: um nome para o valor, o valor em si e o tempo em segundos até expirar.</p>
<pre class="brush:php">// Verificar se o Utilizador atual ainda tem um login feito à menos de uma hora
$login = get_transient( 'ewp_user_login_'.get_current_user_id() );
if ( $login )
 // o utilizador tem login efetuado à menos de uma hora
else
 // considera-se que o utilizador não tem login efetuado</pre>
<p style="text-align: justify;">Se chamar a função <span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">delete_transient( 'ewp_user_login'</span><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">.get_current_user_id() </span><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">);</span> ela irá remover qualquer vestígio deste valor da base de dados independentemente se ainda não estiver expirada.</p>
<p>O uso de transients pode ser por vezes abusivo. Ao criar o seu plugin, tenha em atenção em reduzir o número de chamadas à base de dados pois poderá aumentar o tempo de resposta do seu site caso o número de chamadas à base de dados seja grande.</p>
<h3><span style="color: #ff0000;"><strong>NOTAS FINAIS</strong></span></h3>
<p style="text-align: justify;">No desenvolvimento de plugins é necessário ter em atenção a questão da economia de recursos. Para isso deixo umas breves notas finais:</p>
<p style="text-align: justify;">Nas APIs de base de dados, é natural os developers "abusarem" no número de chamadas, ora dividindo várias opções separadamente, chamando sucessivas vezes o get_option(), ora usando muitos transients. A solução na maior parte das vezes está em agrupar dados.</p>
<ol style="text-align: justify;">
<li>Opte por guardar todos os dados numa única chamada add_option() ou set_transient()</li>
<li>Ao chamar get_option() faça-o apenas uma vez, guardando o seu valor numa variável que pode ser reutilizada</li>
<li>Não guarde conteúdo gerado, como HTML de uma página inteira na base de dados. Ao contrário daquilo que seria suposto, estas funções comportam-se muito mal com uma grande quantidade de dados. Opte por guardar um array de dados e gerar o HTML on-the-fly. Use apenas cache para guardar páginas de HTML inteiras e nunca a base de dados.</li>
</ol>
<div style="text-align: justify;">Espero que tenha gostado deste artigo. Espero ve-lo para a próxima semana na terceira parte que falará sobre as restantes APIs e segurança ao nível de plugins. Ah, e não se esqueça de comentar. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<p>Abraço,</p>
<p>Vitor</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/" title="Como Criar Plugins para WordPress (Parte III)">Como Criar Plugins para WordPress (Parte III)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/" title="Como Criar Plugins para WordPress (Parte I)">Como Criar Plugins para WordPress (Parte I)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/02/templates-wordpress-lancados-em-janeiro-2012/" title="44 Templates WordPress lançados em Janeiro 2012">44 Templates WordPress lançados em Janeiro 2012</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Como Criar Plugins para WordPress (Parte I)</title>
		<link>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/</link>
		<comments>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 17:00:20 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[como criar plugins]]></category>
		<category><![CDATA[como criar plugins para wordpress]]></category>
		<category><![CDATA[criar plugins para wordpress]]></category>
		<category><![CDATA[criar plugins wordpress]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>
		<category><![CDATA[tutorial para criar plugins wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3865</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/">Como Criar Plugins para WordPress (Parte I)</a></p>
&#160;&#160; Como Criar Plugins para WordPress (Parte I) O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a sua API simples de implementar. Recentemente um dos nossos leitores contatou-nos [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/">Como Criar Plugins para WordPress (Parte I)</a></p>
<p style="text-align: justify;">O WordPress é uma das ferramentas para gestão de sites que tem vindo a crescer mais rapidamente nos últimos anos. Uma das razões provém da sua arquitetura altamente extensível através de plugins a par com a sua API simples de implementar. Recentemente um dos nossos leitores contatou-nos indicando que estava tendo dificuldades em encontrar <a title="tutoriais WordPress" href="http://www.escolawp.com" target="_blank">tutoriais WordPress</a> sobre criar plugins, e sugeriu-nos então que publicássemos uma série de artigos sobre como criar plugins para WordPress, ideia essa que decidimos aceitar!</p>
<h3 style="text-align: justify;"><strong><span style="color: #ff0000;">O QUE SÃO OS PLUGINS NO WORDPRESS?</span><br />
</strong></h3>
<p style="text-align: justify;">Um plugin no WordPress é uma porção de código escrito em PHP que é incluído na pasta wp-content/plugins e que aumenta as funcionalidades do WordPress através da implementação de Hooks – acções e filtros – em várias partes do código do WordPress.</p>
<p style="text-align: justify;">Após a activação de um plugin, o WordPress encarrega-se de registá-lo sempre que há uma chamada ao site, analisando que acções e filtros é que ele implementa.</p>
<p style="text-align: justify;">Desta maneira a extensabilidade torna-se algo muito simples de conquistar e de aprender. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>COMO É QUE OS PLUGINS INTERAGEM COM O WORDPRESS</strong></span></h3>
<p style="text-align: justify;">Existem várias APIs que o WordPress fornece para que os plugins possam trabalhar funcionalidades usando-as. Cada API, ou application programming interface (interface de programação da aplicação), ajuda a interagir de diferentes maneiras.</p>
<ul style="text-align: justify;">
<li><strong>Plugin </strong>– Providencia as hooks – um conjunto de acções e filtros – para que os plugins possam interagir em várias partes do WordPress de maneira muito simples;</li>
<li><strong>Widgets</strong> – Permite colocar pedaços de código nas sidebars registadas do nosso tema, fazendo com que haja o display de várias informações na parte do site.</li>
<li><strong>Shortcode</strong> – Permite que um editor chame uma função PHP definida no plugin de maneira simples no editor de posts.</li>
<li><strong>HTTP</strong> – Esta API é um meio standard para fazer chamadas HTTP a servidores remotos sem que o autor do plugin se tenha que preocupar se existe cURL instalado. Basta chamar através desta API e ela preocupa-se em determinar qual o método de chamada mais apropriado para o servidor em que corre.</li>
<li><strong>Settings</strong> – Permite a inserção de campos de opções personalizados na administração do WordPress para que estes possam ser usados pelos plugins facilmente. Com esta API o autor não se tem que preocupar com segurança nos ataques CRSF e XSS – ela faz tudo por si.</li>
<li><strong>Dashboard Widgets</strong> – Permite criar e alterar widgets para a Dashboard da administração e com controlo de acessos.</li>
<li><strong>Rewrite</strong> – Possibilita a criação de rewrite rules personalizadas para vários pontos do código dos plugins.</li>
<li><strong>Transients</strong> – Sistema de cache básico persistente na base de dados com tempo de expiração. Pode ser usado para adicionar opções temporárias.</li>
<li><strong>Database</strong> – Acesso rápido à base de dados sem haver necessidade de conhecimento de SQL. Permite inserir, atualizar, remover e selecionar registos.</li>
<li><strong>Pluggable Functions</strong> – Funções providenciadas pelo WordPress que podem ser completamente redefinidas. É o caso da função wp_mail() que pode ser alterada para usar um servidor SMTP em vez do atual Sendmail.</li>
</ul>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>VANTAGENS DE SE CRIAR UM PLUGIN</strong></span></h3>
<p style="text-align: justify;">Uma das principais vantagens é a de não se ser obrigado a alterar o código fonte do WordPress! Com isto podemos estar seguros que uma atualização da versão do WordPress não irá “destruir” as alterações que fizémos.</p>
<p style="text-align: justify;">Outra vantagem é o que a comunidade chama de <em>plugin sandbox</em>: quando se ativa um plugin o WordPress “testa” o plugin por forma a que este não quebre a nossa instalação se gerar um erro fatal. Esta forma de procedimento salvaguarda todo o trabalho que tivemos anteriormente em contruir e manter o nosso site. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>TIPOS DE PLUGINS</strong></span></h3>
<p style="text-align: justify;">O que muita gente não sabe é que no WordPress existem três tipos de plugins. São estes:</p>
<ul style="text-align: justify;">
<li>“Regulares” &#8211; que podem ser ativados e desativados a qualquer mamento a partir da página de plugins;</li>
<li>“Must-Use” &#8211; ou simplesmente <em>MUPlugins</em> (não confundir com Multisite, não é a mesma coisa) que são ficheiros de plugins, normalmente constituidos por apenas um ficheiro PHP e que não necessitam de registar CSS nem JS. Esses pequenos plugins encontram-se na pasta /wp-content/mu-plugins/ e são ativados automaticamente pelo WordPress. A única forma de os desativar é removendo-os dessa diretoria. São os primeiros plugins a ser ativados e portanto servem principalmente para alterar funcionalidades da core e não para extender funcionalidades como faz a maior parte dos plugins regulares;</li>
<li>“Drop-ins” &#8211; Algumas funcionalidades específicas do WordPress podem ser alteradas através de ficheiros com nomes específicos colocados na pasta /wp-content. Se os seguintes ficheiros forem encontrados, serão automaticamente carregados em momentos específicos:
<ul>
<li>advanced-cache.php – Para uso de cache avançada, como por exemplo, cache persistente. É normalmente usado para plugins de cache como o <a title="WP Super Cache" href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a> e o <a title="W3 Total Cache" href="http://www.escolawp.com/2011/01/como-instalar-e-configurar-o-plugin-w3-total-cache-no-wordpress/" target="_blank">W3 Total Cache</a>.</li>
<li>db.php – Implementa uma nova classe PHP para gestão da base de dados. A classe irá sobrepor-se à classe nativa wpdb. Uma boa maneira de ver uma implementação disto é usando o plugin da Automattic <a title="Hyper DB" href="http://codex.wordpress.org/HyperDB" target="_blank">Hyper DB</a> que implementa uma classe PHP que faz a gestão de multiplas bases de dados MySQL.</li>
<li>db-error.php – Implementa uma mensagem de erro de acesso ao MySQL customizada</li>
<li>install.php – Possibilita a implementação de um script de instalação customizado.</li>
<li>maintenance.php – Mensagem customizada de site em manutenção.</li>
<li>object-cache.php – O WordPresstem uma cache não-ersistente no entanto é possível implementar uma classe de cache alternativa que use, por exemplo, o <a title="WordPress Memcached Object Cache" href="http://wordpress.org/extend/plugins/memcached/" target="_blank">memcached</a> ou o sistema <a title="WordPress APC Object Cache Backend " href="http://wordpress.org/extend/plugins/apc/" target="_blank">PHP-APC</a>.</li>
<li>sunrise.php – Permite implementar um sistema de mapeamento de domínios. Usado pelo plugin <a title="WordPress MU Domain Mapping" href="http://wordpress.org/extend/plugins/wordpress-mu-domain-mapping/" target="_blank">WordPress MU Domain Mapping</a>.</li>
<li>blog-deleted.php – Mensagem de blog apagado customizada</li>
<li>blog-inative.php – Mensagem de blog inativo customizada</li>
<li>blog-suspended.php – Mensagem de blog suspenso customizada</li>
</ul>
</li>
</ul>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>TESTANDO FUNCIONALIDADES COMO SE FOSSEM PLUGINS</strong></span></h3>
<p style="text-align: justify;">Este método serve como uma sandbox para testar ou implementar scripts feitos especialmente só em PHP. É óptimo para fazer o display de variáveis e uma óptima forma de implementar standalone scripts já criados.</p>
<pre class="brush:php">&lt;?php

// Se quisermos ativar o modo de depuração de erros
// definimos com o valor true a seguinte constante
define( 'WP_DEBUG', true );

// Vamos carregar o ambiente do WordPress a partir
//de um único local, o wp-load.php
require( './wp-load.php' );

// Ja temos o WordPress carregado, já é possível usar
// as suas potencialidades e testar os nossos códigos
// ou apenas incluir um script standalone.

?&gt;

&lt;?php include( 'script-standalone.php' ); ?&gt;</pre>
<p style="text-align: justify;">Como visto, basta carregar o ficheiro wp-load.php para o nosso ficheiro de script para iniciar o ambiente do WordPress.</p>
<p style="text-align: justify;">Embora isto não seja propriamente um plugin, não deixa de ser uma funcionalidade bastante interessante e que trás muitas vantagens.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>CONVENÇÕES</strong></span></h3>
<p style="text-align: justify;">Para que o seu plugin possa coexistir num ambiente em que outros plugins residem, algumas convenções devem ser seguidas:</p>
<ul style="text-align: justify;">
<li>Mantenha sempre o seu plugin dentro de uma diretoria com o nome do seu plugin, permitindo assim uma organização dos ficheiros mais equilibrada.</li>
<li>Se o seu plugin for criado para ser distribuido, não use as tags à lá ASP &lt;? ?&gt;, use por as tags &lt;?php ?&gt;. Inclua também comentários das suas funções ao estilo PHPDoc ou comumente conhecido, <a title="PHPDoc" href="http://codex.wordpress.org/Inline_Documentation" target="_blank">HereDoc</a>.</li>
<li>Prefixe sempre as suas funções com um nome comum, pode ser por exemplo, o nome do seu plugin.</li>
<li>Use técnicas de código PHP compatíveis com o PHP versão 5.2. Evite técnicas superiores a essa versão.</li>
</ul>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>O CABEÇALHO DO PLUGIN</strong></span></h3>
<p style="text-align: justify;">O cabeçalho do plugin é um pequeno snippet de comentários em PHP que mantém a informação necessária para que o WordPress reconheça o plugin e mostre algumas informações relativas ao plugin.</p>
<p style="text-align: justify;">Esse cabeçalho deve-se encontrar nos primeiros 8kB do ficheiro principal do plugin. Para evitar problemas, os developers colocam-no sempre no início.</p>
<p style="text-align: justify;">Para o seu primeiro plugin, cria a diretoria <em>o-meu-plugin</em> dentro do <em>wp-content</em>. Dentro dessa diretoria vamos criar um ficheiro PHP chamado <em>o-meu-plugin.php</em>.</p>
<p><img class="alignnone size-full wp-image-3869" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selec%C3%A7%C3%A3o_003.png" alt="" width="133" height="79" /></p>
<p>O cabeçalho que deve ser introduzido nesse ficheiro é o seguinte:</p>
<pre class="brush:php">&lt;?php
/*
Plugin Name: O meu Plugin
Plugin URI: http://exemplo.org/o-meu-plugin
Description: Um plugin de teste didático
Version: 1.0
Author: Aluno da Escola WordPress
Author URI: http://exemplo.org
License: GPLv2
*/
?&gt;</pre>
<p style="text-align: justify;">Este cabeçalho é muito direto e as informações que contém devem ser adaptadas com o seu nome, endereço de email e URL.</p>
<p style="text-align: justify;">Algo muito importante a ter em conta é o copyright do plugin. Existe muita discussão pela internet sobre se os plugins WordPress podem ter ou não licensas proprietárias, isto é, não compatível com as licensas OpenSource, nomeadamente a licensa GPL que é a que a core do WordPress usa. Este é um assunto sério e que deve ser respeitado, pois a legislação de direitos de autor existe! A verdade é a seguinte: a licensa GPL diz que qualquer trabalho derivativo de um trabalho licensiado em GPL deve ter a mesma licensa ou pelo menos uma licensa compatível com GPL. Os plugins, como usam código proveniente da core do WordPress são considerados trabalhos derivativos, sendo assim devem seguir o mesmo trâmito de licensa.</p>
<p>Deverá colocar isto logo a seguir ao cabeçalho do plugin:</p>
<pre class="brush:php">/*
 *      Copyright 2012 Aluno da Escola WordPress &lt;email@exemplo.org&gt;
 *
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 3 of the License, or
 *      (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */</pre>
<p style="text-align: justify;">Este comentário mostra é uma informação para mostrar a licensa do plugin protegendo-o para que terceiros não &#8220;abusem&#8221; das suas criações.</p>
<p style="text-align: justify;">Gostaria de dar ainda algumas notas acerca da licensa GPL:</p>
<ol>
<li style="text-align: justify;">Ela permite a livre redistribuição do código, caso o autor o libere, mas não força o autor a redistribui-la se não for essa a intensão &#8211; o autor é que decide se quer manter só para si ou liberá-la à comunidade.</li>
<li style="text-align: justify;">O código em GPL alterado deve manter os créditos ao(s) autor(es) origina(l/is).</li>
<li style="text-align: justify;">Você pode pedir um valor monetário aos seus clientes pelo código GPL, porém não pode impossibilitar terceiros a redistribui-lo gratuitamente.</li>
</ol>
<h3><span style="color: #ff0000;"><strong>FUNÇÕES PARA DETERMINAR CAMINHOS E URLS</strong></span></h3>
<p style="text-align: justify;">A partir deste ponto, você já tem um plugin que pode ser ativado a partir da administração! Todo o código seguinte irá ser incluido nesse ficheiro ou em ficheiros que ele inclua com as diretivas <em>include</em> ou <em>require</em>.</p>
<p><img class="alignnone size-full wp-image-3867" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selec%C3%A7%C3%A3o_001.png" alt="" width="584" height="73" /></p>
<p style="text-align: justify;">Determinar os caminhos para incluir ficheiros e os links para imprimir imagens, CSS e scripts pode ser uma tarefa muito complicada. Felizmente o WordPress graciona-nos com várias funções muito importantes:</p>
<ul style="text-align: justify;">
<li><strong>plugin_dir_path( $file )</strong> &#8211; esta função aceita como argumento um nome do ficheiro retornando o caminho absoluto para a diretoria em que o ficheiro está incluído. Usando em combinação com a constante __FILE__, esta função é muito valiosa pois retornando a diretoria do plugin em questão, todos os caminhos a incluir passam a ser relativos, auxiliando assim a programação.<br />
Uso comum: &lt;?php include( plugin_dir_path( __FILE__ ) . &#8216;ficheiro/a/incluir.php&#8217; ); ?&gt;<br />
Exemplo: /www/wp-content/o-meu-plugin/ficheiro/a/incluir.php</li>
<li><strong>plugins_url( $path, $file )</strong> &#8211; esta função aceita como argumentos o caminho URL para uma imagem, CSS ou script relativo à diretoria onde o ficheiro passado no segundo no segundo argumento está incluído.<br />
Uso comum: &lt;?php echo plugins_url( &#8216;images/imagem.png&#8217;, __FILE__ ); ?&gt;<br />
Exemplo: http://exemplo.org/wp-content/plugins/o-meu-plugin/images/imagem.png</li>
<li><strong>includes_url()</strong> &#8211; retorna a URL para a diretoria wp-includes<br />
Exemplo: http://exemplo.org/wp-includes</li>
<li><strong>content_url()</strong> &#8211; retorna a URL para a diretoria wp-content<br />
Exemplo: http://exemplo.org/wp-content</li>
<li><strong>admin_url()</strong> &#8211; retorna o link para a área de administração<br />
Exemplo: http://exemplo.org/wp-admin</li>
<li><strong>home_url()</strong> &#8211; retorna o link para a homepage do site<br />
Exemplo: http://exemplo.org</li>
</ul>
<p style="text-align: justify;">É muito importante usar-se exclusivamente estas funções para determinar os caminhos. Algumas das vantagens são:</p>
<ol>
<li style="text-align: justify;">Elas suportam SSL, caso o site esteja a ser visualizado em https</li>
<li style="text-align: justify;">Elas suportam as contantes e opções do multisite, retornando os valores atuais para o domínio do blog em questão. Assim, caso haja mapeamento de domínios, elas retornam o valor para esse domínio, em vez do subdomínio nativo.</li>
</ol>
<p>Exemplos de uso:</p>
<pre class="brush:php">&lt;?php

// Incluir um ficheiro que se encontre na mesma
// diretoria do plugin.

include( plugin_dir_path( __FILE__ ) . 'ficheiro-a-incluir.php' );
// Fazer o display de uma imagem localizada
// na diretoria do plugin.

$imagem = '&lt;img src="'.plugins_url( 'imagem.png', __FILE__ ).'" alt="" /&gt;';

// Criar um link para a homepage
$link = '&lt;a href="'.home_url().'" title="Home"&gt;Homepage&lt;/a&gt;';</pre>
<p style="text-align: justify;">Não se esqueça que este plugin é apenas um exemplo de implementação.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>FUNÇÕES DE ATIVAÇÃO, DESATIVAÇÃO E DESINSTALAÇÃO</strong></span></h3>
<p style="text-align: justify;">Quando um usuário ativa, desativa ou desistala um plugin, alguns métodos devem ser chamados por forma a permitir o plugin tomar certas decisões nessas alturas.</p>
<p style="text-align: justify;">Porquê? Imagine por exemplo um plugin que necessita de criar opções iniciais para funcionar, usando uma função customizada, é possível criar essas opções durante a instalação.</p>
<p style="text-align: justify;"><strong>Registar uma função de instalação</strong></p>
<p style="text-align: justify;">A função <strong>register_activation_hook( $file, $function )</strong> regista uma função customizada para ser executada apenas na ativação do plugin. Esta função aceita como parâmetros essa função customizada e o ficheiro em que a função está localizada.</p>
<p style="text-align: justify;">Exemplo de uso:</p>
<pre class="brush:php">&lt;?php

// Registamos a função para correr na ativação do plugin
register_activation_hook( __FILE__, 'ewp_install_hook' );

function ewp_install_hook() {
  // Vamos testar a versão do PHP e do WordPress
  // caso as versões sejam antigas, desativamos
  // o nosso plugin.
  if ( version_compare( PHP_VERSION, '5.2.1', '&lt;' )
    or version_compare( get_bloginfo( 'version' ), '3.3', '&lt;' ) ) {
      deactivate_plugins( basename( __FILE__ ) );
  }

  // Vamos criar um opção para ser guardada na base-de-dados
  // e incluir um valor por defeito.
  add_option( 'ewp_opcao', 'valor_por_defeito' );

}</pre>
<p style="text-align: justify;"><strong>Registar uma função de desinstalação</strong></p>
<p style="text-align: justify;">A função<strong> register_deactivation_hook( $file, $function )</strong> tem o mesmo comportamento que a anterior porem apenas é corrida na desativação do plugin. Sendo assim, qualquer função de desativação customizada deve ser registada com isto.</p>
<p style="text-align: justify;"><strong>Ficheiro de desinstalação uninstall.php</strong></p>
<p style="text-align: justify;">Todos os plugins devem ter este ficheiro na sua diretoria. Este ficheiro é chamado pelo WordPress quando um usuário remove o plugin em causa. É aqui que iremos remover quaisquer vestígios do plugin da base de dados do WordPress.</p>
<p style="text-align: justify;">Por exemplo, aqui devemos remover as opções criadas durante a instalação.</p>
<p><img class="alignnone size-full wp-image-3870" src="http://www.escolawp.com/wp-content/uploads/2012/01/Selec%C3%A7%C3%A3o_004.png" alt="" width="106" height="87" /></p>
<p>Exemplo de ficheiro uninstall.php:</p>
<pre class="brush:php">&lt;?php

// Vamos garantir que é o WordPress que chama este ficheiro
// e que realmente está a desistalar o plugin.
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) )
  die();

// Vamos remover as opções que criámos na instalação
delete_option( 'ewp_opcao' );

?&gt;</pre>
<h3><span style="color: #ff0000;"><strong>HOOKS DE ACÇÃO E DE FILTRO – O CORE DOS PLUGINS</strong></span></h3>
<p style="text-align: justify;">Nesta secção iremos falar das hooks, o core dos plugins do WordPress. É com as hooks que os plugins conseguem interagir com o WordPress em determinadas situações definidas por essas hooks.</p>
<p style="text-align: justify;">Existem dois tipos de hooks:</p>
<ul style="text-align: justify;">
<li>Acções: permitem aos developers “colocar” pedaços de códigos em pontos específicos na execução do WordPress.</li>
<li>Filtros: permite filtrar informações (principalmente variáveis) e manipular o output do código. Ao contrário das acções, estas hooks permitem “reescrever” código em determinados pontos.</li>
</ul>
<p style="text-align: justify;">As funções <strong>add_action()</strong> e <strong>add_filter()</strong> possibilitam essa interação. Essas duas funções aceitam como argumentos o nome da hook que queremos alterar e a assinatura da função que providencia o código customizado.</p>
<p style="text-align: justify;">O seguinte código é executado no início do WordPress, durante a hook <em>init</em>:</p>
<pre class="brush:php">&lt;?php

add_action( 'init', 'ewp_funcao_a_chamar' );

function ewp_funcao_a_chamar() {
  // Corre um código qualquer em PHP no init
}

?&gt;</pre>
<p style="text-align: justify;"><strong>Lista de Acções mais usadas</strong></p>
<ul style="text-align: justify;">
<li><em>plugins_loaded</em> – é usado pelos plugins. Nenhum código do seu plugin deve ser executado antes desta acção, assim, todo o código inicial deve ser colocado dentro desta acção.</li>
<li><em>init</em> – nesta hook já todo o código core do WordPress foi carregado, o que nos garante que podemos usar qualquer função e ler qualquer variável global do WordPress pois essas já estão carregadas.</li>
<li><em>admin_init</em> – é igual à init, só que é carregado após todo o interface da administração estar concluído.</li>
<li><em>wp_head</em> – esta hook possibilita a impressão de código no cabeçalho &lt;head&gt; da página. Ideal para colocar metatags e códigos script e style.</li>
<li><em>admin_head</em> – igual à anterior porem só funciona na administração.</li>
<li><em>admin_menu</em> – serve para adicionar páginas ao menu da administração.</li>
<li><em>wp_footer</em> <em>-</em> imprime ou executa código no rodapé da página.</li>
</ul>
<p style="text-align: justify;">Iremos falar mais sobre esta API na segunda parte desta série.</p>
<h2 style="text-align: center;"><strong><a href="http://www.escolawp.com/wp-content/uploads/2012/01/o-meu-plugin.zip">Download do código O Meu Plugin</a></strong></h2>
<p style="text-align: justify;"><strong>Nota:</strong> peço especial atenção para não usar este código como plugin, pois, além de não implementar nenhum funcionalidade, pode comprometer a sua instalação. Serve apenas para fins didáticos.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>LEITURA RECOMENDADA</strong></span></h3>
<p style="text-align: justify;">Sugestões de leitura adicional prendem-se com o seu interesse em aprender mais acerca da criação de plugins para o WordPress. Se souber Inglês e for o seu caso, então sugiro:</p>
<ol style="text-align: justify;">
<li>Use o <a title="Codex WordPress" href="http://codex.wordpress.org/" target="_blank">Codex</a> do WordPress para procurar funções, aprender a API e conhecer novas técnicas de código. Como esta está em formato de wiki comunitária, ou seja, qualquer um pode editar, aproveite e colabore criando e atualizando novos conteúdos do Codex.</li>
<li>Inscreva-se na <a title="WordPress Hackers List" href="http://codex.wordpress.org/Mailing_Lists" target="_blank">WordPress Hackers List</a> e faça perguntas diretamente aos developers do WordPress.</li>
<li>Frequente e faça perguntas em sites da especialidade. Comente aqui no <a title="Escola WordPress" href="http://www.escolawp.com/" target="_blank">Escola WordPress</a> os posts colocando novos códigos e tirando dúvidas; participe nas discussões do <a title="WP Tavern" href="http://www.wptavern.com/" target="_blank">WP Tavern</a>.</li>
<li>Adquira um bom livro que será como um bíblia para si. O <a title="Professional WordPress Plugin Development" href="http://www.amazon.com/gp/product/0470916222/" target="_blank">Professional WordPress Plugin Development</a>, criado por três developers do core do WordPress (Brad Williams, Ozh Richard, Justin Tadlock), profissionais com dezenas de plugins criados, é um bom começo para aprender novas técnicas, reunindo o essencial para a criação ótimos plugins.</li>
</ol>
<p style="text-align: justify;">E é tudo! Espero que este artigo lhe tenha trazido novas luzes para o desenvolvimento do seu plugin. Não se esqueça de comentar e aguarde pelo segundo artigo desta série que falará sobre a API do WordPress, algumas classes e segurança.</p>
<p>Até breve e um abraço,</p>
<p>Vitor</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/" title="Como Criar Plugins para WordPress (Parte III)">Como Criar Plugins para WordPress (Parte III)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/" title="Como Criar Plugins para WordPress (Parte II)">Como Criar Plugins para WordPress (Parte II)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/" title="Guia definitivo para criar Custom Post Types (Parte 5)">Guia definitivo para criar Custom Post Types (Parte 5)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/feed/</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
		<item>
		<title>Guia definitivo para criar Custom Post Types (Parte 5)</title>
		<link>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/</link>
		<comments>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 16:57:19 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[como criar custom post types]]></category>
		<category><![CDATA[como criar diferentes tipos de posts]]></category>
		<category><![CDATA[criar custom post types]]></category>
		<category><![CDATA[guia definitivo]]></category>
		<category><![CDATA[guia definitivo para criar custom post types]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3843</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/">Guia definitivo para criar Custom Post Types (Parte 5)</a></p>
&#160;&#160; Guia definitivo para criar Custom Post Types (Parte 5) Esta série de Tutoriais WordPress pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro, segundo e terceiro artigos desta série: Guia definitivo para criar Custom Post Types [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/">Guia definitivo para criar Custom Post Types (Parte 5)</a></p>
<p style="text-align: justify">Esta série de <a title="Tutoriais WordPress" href="http://www.escolawp.com" target="_blank">Tutoriais WordPress</a> pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro, segundo e terceiro artigos desta série: <a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/">Guia definitivo para criar Custom Post Types (Parte 1)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/">Guia definitivo para criar Custom Post Types (Parte 2)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 3)" href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">Guia definitivo para criar Custom Post Types (Parte 3)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 4)" href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/">Guia definitivo para criar Custom Post Types (Parte 4)</a>. Tenha em atenção que todos os códigos desta série, servem apenas como exemplo. Você pode e DEVE fazer as suas experiências o modificar o código a seu gosto e necessidades.</p>
<p style="text-align: justify">Este será o último artigo desta série de como criar custom post types. Será aqui que tudo o que você aprendeu irá culminar.</p>
<p style="text-align: justify">Iremos tratar de extender os links permanentes de forma a adicionar e modificar <em>endpoints</em> e <em>rewrite rules</em> para os seus tipos de post. Desta forma poderá ter posts organizados de maneira diferente sem ser o que normalmente está consagrado por defeito no WordPress. Vamos adicionar novos papeis e atribuir a papeis existentes capacidades para o nosso tipo de post Filmes e vamos falar de segurança no código e como combater ataques XSS e CSRF (os mais comuns).</p>
<h3 style="text-align: justify"><strong>SUMÁRIO</strong></h3>
<ul>
<li>Adicionar um novo papel de utilizador e novas meta capacidades ao tipo de post</li>
<li>Validar e segurar os inputs dos seus usuários</li>
<li><strong>Bónus:</strong> Extender as URLs permanentes através da Rewrite API</li>
</ul>
<p><img src="http://www.escolawp.com/wp-content/uploads/2011/11/cpt.png" alt="" width="550" height="257" /></p>
<p style="text-align: justify">Até aqui aprendemos a criar e a extender tipos de post e taxonomias existentes de forma a encaixar plenamente às nossas necessidades. No entanto, por motivos didáticos, não falámos sobre segurança tanto no código, como em inputs dos usuários e até em ACL (lista de controlos de acesso). É sobre este tema que iremos falar. Como bónus, falaremos também sobre a poderosa ferramenta embutida no WordPress que possibilita criar seus próprios links / URLs personalizados.</p>
<h3 style="text-align: justify"><span style="color: #ff0000">PAPÉIS DE USUÁRIOS E CAPACIDADES (ACL)</span></h3>
<p style="text-align: justify">Por defeito o WordPress vem com cinco grandes grupos de acesso que se podem atribuir aos usuários, esses grupos são chamados de papeis (roles, em inglês) e que controlam que partes da Administração do WordPress os usuários podem ver ou alterar. Por exemplo, um usuário cujo papel atribuído é o de administrador terá acesso a tudo, enquanto que um usuário com o papel de autor apenas poderá escrever os seus posts e terá acesso limitado à interface.</p>
<p style="text-align: justify">Embora possa parecer simples, este processo é mais complexo do que parece. O sistema do WordPress inicial (versões anteriores à 2.1) centrava o controlo dos acessos no grupo, porém este método não era flexível e não possibilitava a sua modificação. Com as novas versões o processo foi-se modificando. Foram criadas as <em>capacidades</em> e os grupos passaram a ser papeis que agregam capacidades que os usuários podem deter, sendo que uma capacidade é uma função em determinado sitio da administração como por exemplo a capacidade de publicar ou remover um post, ou a capacidade de alterar as opções do tema ativo.</p>
<p style="text-align: justify">Com este método conseguimos criar novos papeis agregando apenas as capacidades necessárias para essa função.</p>
<p style="text-align: justify">Como exemplo, vamos criar o papel de <em>Revisor de Filmes</em> e assim os usuários que tiverem este papel atribuído terão apenas acesso a criar, editar, remover e publicar filmes. Todos as outras áreas da administração serão barradas a estes usuários.</p>
<p style="text-align: justify">Para tal colocamos este código no functions.php:</p>
<pre class="brush:php">&lt;?php
add_action( 'admin_init', 'add_role_film' );
function add_role_film() {
  add_role( 'films_reviewer', 'Revisor de Filmes', array(
    'edit_film', 'delete_film', 'read_film'
    )
  );
}
?&gt;</pre>
<p style="text-align: justify">Esta função <em>add_role()</em> cria um novo papel que poderá ser usado em usuários. Aceita como argumentos um ID único do role, uma string de apresentação do papel e um array com as capacidades incluídas nesse papel. No nosso caso adicionamos apenas as capacidades que necessitamos.</p>
<p style="text-align: justify">Neste momento as capacidades usadas na função em cima ainda não existem, não estão definidas. Para isso vamos ter que modificar a nossa função <em>register_post_type() </em>anteriormente registada na <a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/">parte 1</a> desta série, acrescentando uma capacidade personalizada mudando o valor de <em>capability_type</em> para <em>film</em>:</p>
<pre class="brush:php">add_action( 'init', 'create_post_type_film' );
function create_post_type_film() {
  register_post_type( 'film', array(
    [...]
    'capability_type' =&gt; 'film', // Mudamos de post para film
    [...]
    )
  );
}</pre>
<p style="text-align: justify">Agora já temos ativadas as capacidades personalizadas para o tipo de post film e os usuários com o papel de Revisor de Filmes vão poder criar, editar, remover e publicar filmes.</p>
<p style="text-align: justify">Caso queiramos acrescentar estas novas capacidades a papeis já existentes como o de Editor, basta adicionar como seguinte código:</p>
<pre class="brush:php">&lt;?php
add_action( 'admin_init', 'add_capability_film' );
function add_capability_film() {
  $role = get_role( 'editor' );
  $role-&gt;add_cap( 'edit_film' );
  $role-&gt;add_cap( 'read_film' );
}
?&gt;</pre>
<p style="text-align: justify">Estas são as funções básicas para adicionar capacidades e papeis aos tipos de post. Mais funções podem ser usadas, este é apenas o básico. Para mais informações sugiro dar uma olhada <a href="http://codex.wordpress.org/Roles_and_Capabilities">aqui no codex</a>.</p>
<h3><span style="color: #ff0000"><strong>VALIDAÇÃO E SEGURANÇA DOS INPUTS</strong></span></h3>
<p style="text-align: justify">Todos nós sabemos que segurança é um questão muito importante quando criamos código de qualidade para qualquer software. A necessidade de preocupação com essa questão aumenta na elaboração de websites e webapplications.</p>
<p style="text-align: justify">Conhecemos e ouvimos ou lemos (quase) todos os dias sites que são atacados ou informação confidencial que é extraída ilegalmente, normalmente isso acontece por falta de mecanismos de segurança ao nível da configuração dos servidores, mas o crescente número de exploits (pedaços de código expostos a ataques) ao nível de scripts na Web é uma preocupação que todos temos que ter em mente quando elaboramos código.</p>
<p style="text-align: justify">Há dois tipos de ataque muito comuns, e normalmente são os único que nos deve preocupar em sites de pequena e média dimensão, chamam-se XSS (cross-site scripting) e CSRF (Cross-site request forgery). O primeiro existe quando o usuário clica num link mal-intensionado que cria danos à sua própria instalação de WordPress e o segundo é o chamado tipo de ataque de força bruta, em que um usuário mal intencionado usa, por exemplo, formulários para tentar ganhar permissões ou criar exploits em instalações de WordPress alheias.</p>
<p style="text-align: justify">Felizmente o WordPress e o PHP vêm com proteções nativas contra este tipo de ataques, porém, em muitos casos podem não ser suficientes. Nesta secção iremos tratar de combater com funções e métodos muito simples este tipo de ataques usando validações de input e de links.</p>
<p style="text-align: justify"><strong>Limpar as informações de um formulário submetido:</strong></p>
<p style="text-align: justify">É muito simples<strong></strong> usando a função nativa do PHP <em>strip_tags()</em> limpando todos os caracteres que não sejam alfanuméricos. Isto consiste num ótimo meio de proteção primordial.</p>
<p style="text-align: justify">Assim, no caso de validação dos inputs em hora de guardar os campos personalizados, vamos usar esta função primeiro, antes de passar os seus conteúdos à função <em>update_post_meta()</em>. Vamos então alterar o código criado na <a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/">parte 2</a>:</p>
<pre class="brush:php">&lt;?php
add_action( 'save_post', 'ewp_film_save_post', 10, 2 );
function ewp_film_save_post( $film_id, $film ) {
   if ( ! $_POST['ano_film'] ) return;

   // Fazer a saneação dos inputs com a função strip_tags() e guardá-los
   update_post_meta( $film_id, '_ano_film', strip_tags( $_POST['ano_film'] ) );
   update_post_meta( $film_id, '_realizador_film', strip_tags( $_POST['realizador_film'] ) );
   update_post_meta( $film_id, '_produtor_film', strip_tags( $_POST['produtos_film'] ) );

   return true;

}
?&gt;</pre>
<p style="text-align: justify">Esta é a função mais usada no saneamento de inputs e aquela que deve ser sempre colocada antes de salvar algum registo para a base de dados.</p>
<p style="text-align: justify"><strong>Checar as permissões do usuário:</strong></p>
<p style="text-align: justify"><strong></strong>O WordPress vem com a função nativa <em>current_user_can( $capability )</em> que, dada uma capacidade, retorna true ou false se o usuário corrente tiver ou não a permissão que estamos testar, respetivamente. Este é o segundo patamar da nossa protecção  contra ataques de força bruta.</p>
<p style="text-align: justify">No nosso caso vamos voltar a alterar o nosso código anterior para acrescentar esta função. Desta forma estamos a avaliar se o o usuário que está a tentar guardar um registo é um usuário com permissões para isso:</p>
<pre class="brush:php">[...]
function ewp_film_save_post( $film_id, $film ) {
   if ( ! $_POST['ano_film'] ) return;

   // Caso o usuário não tenha permissões de edição de filmes, não faz nada
   if ( ! current_user_can( 'edit_film' ) ) return;
[...]</pre>
<p style="text-align: justify">Garantimos assim que os registos para os campos customizados são legítimos e que, pelo menos, o usuário que está a tentar guardar tem permissões para isso. Esta é a segunda defesa contra ataques, porém, garantir que o usuário tem permissões para editar filmes não chega. Falámos à pouco de ataques XSS e ainda precisamos de garantir que o pedido para guardar estes dados provém da própria administração. Para isso vamos validar os links com <em>nonces</em>.</p>
<p style="text-align: justify"><strong>Validar o referer dos links com a técnica de nonces</strong>:</p>
<p style="text-align: justify">A técnica de <em>nonces</em> é muito simples e prática. A ideia é gerar uma senha aleatória que será guardada na base de dados temporariamente  e colocada na query do pedido através de um hidden input. Assim de toda a vez que o usuário acessar essa página uma nova senha será gerada com a função <em>wp_nonce_field()</em> e, em tempo de salvar os dados, iremos checar se essa senha existe na base de dados e corresponde com a acção que queremos realizar com a função <em>check_admin_referer()</em>. Vamos alterar dois códigos, o da metabox, adicionando a função criadora do nonce e novamente a função para guardar os campos personalizados:</p>
<pre class="brush:php">[...]
function film_inner_meta_box( $film ) {
  wp_nonce_field( 'edit_film', __FILE__ );
?&gt;
&lt;p&gt;
  &lt;label for="realizador"&gt;Ano:&lt;/label&gt;
[...]</pre>
<p style="text-align: justify">e alteramos o código para guardar:</p>
<pre class="brush:php">[...]
function ewp_film_save_post( $film_id, $film ) {
   if ( ! $_POST['ano_film'] ) return;

   // Caso o usuário não tenha permissões de edição de filmes, não faz nada
   if ( ! current_user_can( 'edit_film' ) ) return;

   // Verfificamos se este pedido é legítimo, ou seja, se provém da administração
   check_admin_referer( 'edit_film', __FILE__ );

[...]</pre>
<p style="text-align: justify">Usando estas três técnicas protegemos os nossos websites WordPress contra os dois tipos de ataques mais comuns.</p>
<h3><strong><span style="color: #ff0000">EXTENDER AS URLS USANDO A API REWRITE</span></strong></h3>
<p style="text-align: justify">A API de Rewrites do WordPress não tem propriamente a ver com custom post types, no entanto, achámos por bem falar um pouco nela uma vez que pode ser útil na organização de alguns tipos de post mais complicados.</p>
<p style="text-align: justify">Esta API cria <em>endpoints</em> de URLs, ou seja, estruturas permanentes de URL customizadas. No caso do nosso tipo de post Filme, podemos querer apresentar os filmes por vários tipos de organização estrutural na URL, seja por Realizador ou Produtos ou por Ano do filme.</p>
<p style="text-align: justify">Peguemos no exemplo do caso mais lógico e vamos criar uma estrutura de URLs que apresente os filmes organizados por ano de lançamento. Basta passar a função <em>add_rewrite_rule()</em>. O código seguinte viabiliza o que queremos alcançar:</p>
<pre class="brush:php">&lt;?php
add_action( 'init', 'add_film_rewrite' );
function add_film_rewrite() {
  add_rewrite_rule( 'filmes/ano/?(^[^/]*)', 'index.php?post_type=film&amp;meta_key=_ano_film&amp;meta_value=$matches[1]', 'top' );
}
?&gt;</pre>
<p style="text-align: justify">Colocando este código no functions.php estamos a permitir que o nosso tipo de post filme seja navegável também por ano de lançamento. Se um usuário entrar na URL <em>filmes/ano/2011</em>/ irá obter uma lista de todos os filmes realizados no ano de 2011 em género de blogue.</p>
<p style="text-align: justify">Mas <span style="text-decoration: underline">antes disso acontecer</span> terá que regenerar as rewrite rules. A melhor maneira é, depois de colocar os códigos, ir à secção de Ligações permanentes nas Opções da administração. Apenas visitando essa página de opções regenera as rewrite rules.</p>
<p style="text-align: justify">Esta é uma poderosa ferramenta que você pode usar para criar outras estruturas de URL para os seus tipos de post.</p>
<h3><strong><span style="color: #ff0000">DOWNLOAD DO CÓDIGO COMPLETO</span></strong></h3>
<p style="text-align: justify">Este é o último artigo para finalizar esta série de custom post types e como prometido nos artigos anteriores, disponibilizamos os códigos de todos os artigos desta série num único download. Segue o ficheiro que poderá descarregar.</p>
<h2 style="text-align: center"><a href="http://www.escolawp.com/wp-content/uploads/2011/12/cpt-film.zip">Faça o Download do Código!</a></h2>
<p style="text-align: justify">Tenha em atenção ao usar este código: <span style="text-decoration: underline">evite o copy e paste</span> e leia com atenção cada um dos pedaços de código que disponibilizamos assim como os comentários ao código e, necessariamente, os artigos correspondentes.</p>
<p style="text-align: justify"><strong>Uma palavra final&#8230;</strong></p>
<p style="text-align: justify">Espero que esta série tenha sido do vosso agrado e que tenha valorizado a sua aprendizagem no desenvolvimento para WordPress. Este guia definitivo tentou dar as luzes iniciais para as matérias mais importantes dentro do mundo dos custom post types. No entanto, vale sempre a pena referir que o conhecimento vai muito mais além que ler, é necessário pôr em prática e aprender cada vez mais. Se souber Inglês, sugiro sempre o uso da wiki oficial do WordPress, o <a href="http://codex.wordpress.org/">CODEX</a>.</p>
<p style="text-align: justify">Partilhe os seus códigos através dos comentários e participe nesta comunidade colocando questões e tirando dúvidas aos colegas!</p>
<p style="text-align: justify">Um forte abraço e até breve,</p>
<p style="text-align: justify">Vitor</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/" title="Guia definitivo para criar Custom Post Types (Parte 4)">Guia definitivo para criar Custom Post Types (Parte 4)</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/" title="Guia definitivo para criar Custom Post Types (Parte 3)">Guia definitivo para criar Custom Post Types (Parte 3)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/" title="Guia definitivo para criar Custom Post Types (Parte 2)">Guia definitivo para criar Custom Post Types (Parte 2)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" title="Guia definitivo para criar Custom Post Types (Parte 1)">Guia definitivo para criar Custom Post Types (Parte 1)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guia definitivo para criar Custom Post Types (Parte 4)</title>
		<link>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/</link>
		<comments>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 15:17:09 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[como criar custom post types]]></category>
		<category><![CDATA[como criar diferentes tipos de posts no wordpress]]></category>
		<category><![CDATA[criando custom post types no wordpress]]></category>
		<category><![CDATA[custom post types]]></category>
		<category><![CDATA[guia definitivo]]></category>
		<category><![CDATA[guia definitivo para criar custom post types]]></category>
		<category><![CDATA[post types do wordpress]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3769</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/">Guia definitivo para criar Custom Post Types (Parte 4)</a></p>
&#160;&#160; Guia definitivo para criar Custom Post Types (Parte 4) Esta série de Tutoriais WordPress pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro, segundo e terceiro artigos desta série: Guia definitivo para criar Custom Post Types [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/">Guia definitivo para criar Custom Post Types (Parte 4)</a></p>
<p style="text-align: justify;">Esta série de <a title="Tutoriais WordPress" href="http://www.escolawp.com" target="_blank">Tutoriais WordPress</a> pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro, segundo e terceiro artigos desta série: <a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/">Guia definitivo para criar Custom Post Types (Parte 1)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/">Guia definitivo para criar Custom Post Types (Parte 2)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 3)" href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">Guia definitivo para criar Custom Post Types (Parte 3)</a>. Tenha em atenção que todos os códigos desta série, servem apenas como exemplo. Você pode e DEVE fazer as suas experiências o modificar o código a seu gosto e necessidades.</p>
<p style="text-align: justify;">Neste artigo da série iremos tratar de extender e usar de uma forma mais customizada as taxonomias nos nossos tipos de post.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>SUMÁRIO</strong></span></h3>
<ul>
<li style="text-align: justify;">Extender, acrescentando novos campos as taxonomias</li>
<li style="text-align: justify;">Apresentar as taxonomias customizadas no website</li>
<li style="text-align: justify;">Criar um filtro a partir da taxonomia na página de listagem de tipos de post</li>
</ul>
<p><img class="alignnone size-full wp-image-3664" src="http://www.escolawp.com/wp-content/uploads/2011/11/cpt.png" alt="" width="550" height="257" /></p>
<p style="text-align: justify;">As taxonomias customizadas foram iniciadas no ciclo da versão 2.8 do WordPress tendo a API sido acabada na versão 2.9, antes do lançamento dos Custom Post Types. Com esta nova funcionalidade, os developers tiveram a possibilidade de criar novos tipos de categorias para os posts e páginas, extendendo dessa forma o tipo de categorização disponível. Com isto iniciou-se um novo ciclo para o WordPress: de gestor de blog para um verdadeiro CMS personalizável.</p>
<p style="text-align: justify;">É possível criar taxonomias para categorizar não só posts e páginas mas também os nossos tipos de post.</p>
<p style="text-align: justify;">Pegando no nosso tipo de post Filme, e na categoria customizada que criámos no primeiro artigo, vamos extendê-la de modo a termos mais campos para além dos habituais.</p>
<h3><strong><span style="color: #ff0000;">EXTENDER, ACRESCENTANDO NOVOS CAMPOS ÀS TAXONOMIAS</span></strong></h3>
<p><img class="alignnone size-full wp-image-3778" src="http://www.escolawp.com/wp-content/uploads/2011/12/category-custom-field.png" alt="" width="332" height="354" /></p>
<p style="text-align: justify;">Por defeito, as taxonomias apresentam apenas três campos – Título, Slug e Descrição – e sem a possibilidade de acrescentar ou retirar campos.</p>
<p style="text-align: justify;">No entanto, com um plugin que cria a funcionalidade de metadata nas taxonomias, conseguimos atingir da mesma forma o pretendido.</p>
<p style="text-align: justify;">No nosso caso nós iremos criar um campo muito simples, uma caixa de input onde poderemos colocar a URL de uma imagem que será usada como imagem de destaque da categoria de filmes. Que tal? Vamos então!</p>
<p style="text-align: justify;">Para começar, colocamos o código que está na <a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/">parte 1</a> desta série para criar a nossa taxonomia. Agora que temos a nossa taxonomia instalada, vamos extendê-la.</p>
<p style="text-align: justify;">Seguidamente fazemos o download do plugin e instalamo-lo da mesma forma como outro plugin qualquer &#8211; <a href="http://wordpress.org/extend/plugins/taxonomy-metadata/">aqui fica o local para download do nosso plugin</a>.</p>
<p style="text-align: justify;">Existem vários plugins para criar esta funcionalidade, no entanto este é aquele com que prefiro trabalhar e que recomendo.</p>
<p style="text-align: justify;">Depois de instalado e configurado, já temos a estrutura necessária para trabalhar com estes campos das taxonomias customizadas. Desta forma basta-nos mapear quatro acções para realizarem a tarefa de nos criar a interface visual entre os campos e o WordPress:</p>
<pre class="brush:php">add_action( 'film_category_add_form_fields', 'film_category_add', 10, 2);
add_action( 'film_category_edit_form_fields', 'film_category_edit', 10, 2);
add_action( 'edited_film_category', 'film_category_save', 10, 2);
add_action( 'save_film_category', 'film_category_save', 10, 2);</pre>
<p style="text-align: justify;">Estas quatro acções irão, conjuntamente com as funções que chamam, criar os campos na página de adição de termos  &#8211; <em>&lt;taxonomia&gt;_add_form_fields</em> e <em>save_&lt;taxonomia&gt;</em> &#8211; e os campos na página de edição dos termos da taxonomia &#8211; <em>&lt;taxonomia&gt;_edit_form_fields</em> e <em>save_&lt;taxonomia&gt;</em>. Estes dois conjuntos existem pois as páginas de criação e de edição dos termos das categorias é diferente.</p>
<p style="text-align: justify;">Agora que temos as acções mapeadas, vamos acrescentar as funções que são necessárias:</p>
<pre class="brush:php">function film_category_add( $tag ) {
?&gt;
&lt;div class="form-field"&gt;
   &lt;p style="color:#222;font-style:normal;"&gt;Imagem:&lt;/p&gt;
   &lt;input type="text" name="image" id="image" value="" /&gt;
   &lt;p&gt;Adicionar uma imagem de destaque para esta categoria.&lt;/p&gt;
&lt;/div&gt;
&lt;?php
}

function film_category_edit( $tag, $taxonomy ) {
   $image = get_term_meta( $tag-&gt;term_id, '_category_image', true );
?&gt;
&lt;tr class="form-field"&gt;
   &lt;th scope="row" valign="top"&gt;
      &lt;p style="color:#222;font-style:normal;"&gt;Imagem:&lt;/p&gt;
   &lt;/th&gt;
   &lt;td&gt;
      &lt;input name="image" id="image" type="text" value="&lt;?php echo $image; ?&gt;" /&gt;
      &lt;p&gt;Adicionar uma imagem de destaque para esta categoria.&lt;/p&gt;
   &lt;/td&gt;
&lt;/tr&gt;
&lt;?php
}</pre>
<p style="text-align: justify;">Estas funções são muito simples. A primeira apenas apresenta um HTML que desenha o campo de input para se colocar o URL da imagem.</p>
<p style="text-align: justify;">A segunda função é mais complexa, pois é a função que é usada na edição dos termos das taxonomias. Primeiro, através da função <em>get_term_meta()</em> &#8211; uma das funções adicionadas pelo plugin que instalámos à pouco &#8211; retornamos para a variável <em>$image</em> o URL definido pelo usuário, apresentando-o em seguida no campo de input.</p>
<p style="text-align: justify;">Neste momento os campos são apresentados na interface do WordPress, porém nenhum valor é guardado quando se salva um termo dessa taxonomia. Precisamos ainda de definir a função que guarda os valores:</p>
<pre class="brush:php">function film_category_save( $term_id ) {
  // Se foi inserido algum valor no campo...
  if ( isset( $_POST['image'] ) )
    // ...guarda esse valor
    update_term_meta( $term_id, '_film_category_image', strip_tags( $_POST['image'] ) );

  // senão...
  else
    // Remove esse valor
    delete_term_meta( $term_id, '_film_category_image' );

  return $term_id;

}</pre>
<p style="text-align: justify;">Esta função é muito simples: caso o valor &#8216;image&#8217; exista (ou seja, caso o utilizador preencha o campo de imagem) ela guarda esse valor, senão ela remove o valor anterior, pois, caso esteja o campo em branco é provável que o usuário tenha querido remover essa imagem do termo da taxonomia.</p>
<p style="text-align: justify;">E estamos prontos! O nosso campo customizado irá aparecer em beleza na interface.</p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>APRESENTAR AS TAXONOMIAS CUSTOMIZADAS NO WEBSITE</strong></span></h3>
<p style="text-align: justify;">Como foi visto na <a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/">parte 2</a> desta série, a hierarquia de <a title="templates WordPress" href="http://www.escolawp.com" target="_blank">templates WordPress</a> é bastante complexa, dando a possibilidade de se construir o que se quiser. No caso da apresentação de posts em taxonomias, só necessitamos de um template: <em>taxonomy-&lt;taxonomia&gt;.php</em></p>
<p><img class="alignnone size-full wp-image-3779" src="http://www.escolawp.com/wp-content/uploads/2011/12/category-film-file.png" alt="" width="145" height="110" /></p>
<p style="text-align: justify;">No nosso caso vamos primeiro criar um ficheiro no nosso tema com o nome <em>taxonomy-film_category.php</em> para receber toda a lógica programática de apresentação dos nossos filmes:</p>
<pre class="brush:php">&lt;h1 class="entry-title"&gt;
  &lt;?php single_tag_title(); ?&gt;
&lt;/h1&gt;

&lt;div class="entry-thumbnail"&gt;
  &lt;img src="&lt;?php echo get_term_meta( $tag-&gt;term_id, '_category_image', true ); ?&gt;" /&gt;
&lt;/div&gt; 

&lt;?php if ( have_posts() ) : while( have_posts() ) : the_post(); ?&gt;

&lt;div class="entry-title"&gt;&lt;?php the_title(); ?&gt;&lt;/div&gt;
&lt;div class="entry-content"&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;

&lt;?php endwhile; endif; ?&gt;</pre>
<p style="text-align: justify;">Este é o código que é responsável pela apresentação dos filmes dentro de cada termo da taxonomia. A diferença para com o código do artigo anterior prende-se com o uso de uma tag H1 e da função <em>single_tag_title()</em>. Esta é reponsável por apresentar o título da taxonomia que estamos a navegar &#8211; por exemplo, se estivermos a ver a categoria Drama, esta função imprime <em>Drama</em> no ecrã.</p>
<p style="text-align: justify;">Novamente usamos a função <em>get_term_meta()</em> para retornar deste modo o URL da imagem que se definiu na administração para cada categoria de filmes.</p>
<p style="text-align: justify;">Com alguns ajustes de HTML e CSS conseguimos atingir algo como isto, em que a imagem da esquerda é a que usámos colocando o seu URL na caixa de input:</p>
<p><img class="alignnone size-full wp-image-3780" src="http://www.escolawp.com/wp-content/uploads/2011/12/category-film-presentation.png" alt="" width="342" height="125" /></p>
<p style="text-align: justify;">É possível criar e extender muito este exemplo, que deve ser trabalhado e usado para os seus próprios fins. Basta dar uso à criatividade. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 style="text-align: justify;"><span style="color: #ff0000;"><strong>CRIAR UM FILTRO POR TAXONOMIA NA PÁGINA DE LISTAGEM DE TIPO DE POSTS</strong></span></h3>
<p style="text-align: justify;">Se você visualizar a página de listagem dos <em>Posts</em> na sua administração, verá que no topo existem uma série de filtros, sendo que um deles é filtrar os posts por categoria. É essa funcionalidade que iremos apresentar nesta secção, filtrando os filmes por categoria.</p>
<p><img class="alignnone size-full wp-image-3781" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selec%C3%A7%C3%A3o_001.png" alt="" width="424" height="89" /></p>
<p style="text-align: justify;">Com uma simples acção é possível colocar uma caixa dropdown com as categorias da taxonomia <em>film_category</em>. Desta forma atingimos algo parecido, apresentando no campo da filtragem a seguinte caixa:</p>
<p><img src="http://www.escolawp.com/wp-content/uploads/2011/12/dropdown.png" alt="" width="299" height="141" /></p>
<p>Este é o código necessário:</p>
<pre class="brush:php">add_action( 'restrict_manage_posts', 'film_retrict_categories' );

function film_retrict_categories() {
  // Acesso às variáveis do tipo de post atual e o array do pedido
  global $typenow, $wp_query;

  // Se o tipo de post for diferente de film não faz nada
  if ( $typenow != 'film' )
   return false;

  // Imprime uma select box com todos os termos da taxonomia film_category
  wp_dropdown_categories(array(
   'show_option_all' =&gt;  'Mostrar tudo',
   'taxonomy'        =&gt;  'film_category',
   'name'            =&gt;  'film_category',
   'orderby'         =&gt;  'name',
   'selected'        =&gt;  $wp_query-&gt;query['term'],
   'hierarchical'    =&gt;  true,
   'depth'           =&gt;  3,
   'show_count'      =&gt;  true,
   'hide_empty'      =&gt;  true,
   )
  );
}</pre>
<p>Ao chamarmos a acção <em style="text-align: justify;">restrict_manage_posts</em> com a nossa função, temos a possibilidade de acrescentar HTML na zona de filtragem, no cabeçalho da tabela de listagem.</p>
<p style="text-align: justify;">Primeiro, caso o tipo de post não seja <em>film</em> a função retorna sem continuar a sua atividade, assim apenas aplicamos este filtro nas páginas de listagem dos filmes.</p>
<p style="text-align: justify;">A função <a href="http://codex.wordpress.org/Function_Reference/wp_dropdown_categories">wp_dropdown_categories</a> é responsável pela impressão da dropdown das categorias da taxonomia passada como argumento, no nosso caso <em>film_category</em>. Não me vou alongar mais sobre os argumentos desta função, pois davam um artigo inteiro, porém deixo o link para estudo mais profundo.</p>
<p style="text-align: justify;">Espero que este artigo lhe tenha sido útil para criar o seu plugin que tanto deseja <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Não esqueça de ler os outros artigos desta série:</p>
<ul style="text-align: justify;">
<li><a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/">Guia definitivo para criar Custom Post Types (Parte 1)</a></li>
<li><a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/">Guia definitivo para criar Custom Post Types (Parte 2)</a></li>
<li><a title="Guia definitivo para criar Custom Post Types (Parte 3)" href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">Guia definitivo para criar Custom Post Types (Parte 3)</a></li>
</ul>
<p style="text-align: justify;">Bons estudos!</p>
<p style="text-align: justify;">Vitor</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/" title="Guia definitivo para criar Custom Post Types (Parte 5)">Guia definitivo para criar Custom Post Types (Parte 5)</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/" title="Guia definitivo para criar Custom Post Types (Parte 3)">Guia definitivo para criar Custom Post Types (Parte 3)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/" title="Guia definitivo para criar Custom Post Types (Parte 2)">Guia definitivo para criar Custom Post Types (Parte 2)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" title="Guia definitivo para criar Custom Post Types (Parte 1)">Guia definitivo para criar Custom Post Types (Parte 1)</a></li><li><a href="http://www.escolawp.com/2010/07/como-criar-custom-post-types-wordpress/" title="Como criar Custom Post Types no Wordpress 3.0?">Como criar Custom Post Types no Wordpress 3.0?</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Como carregar Gravatars em tempo real no seu blog WordPress</title>
		<link>http://www.escolawp.com/2011/12/como-carregar-gravatars-em-tempo-real-no-seu-blog-wordpress/</link>
		<comments>http://www.escolawp.com/2011/12/como-carregar-gravatars-em-tempo-real-no-seu-blog-wordpress/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 18:30:55 +0000</pubDate>
		<dc:creator>Paulo Faustino</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[carregar gravatars em tempo real no wordpress]]></category>
		<category><![CDATA[carregar gravatars enquanto o usuário escreve o email]]></category>
		<category><![CDATA[como carregar gravatars em tempo real no seu blog wordpress]]></category>
		<category><![CDATA[gravatars]]></category>
		<category><![CDATA[gravatars on the fly]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3764</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/como-carregar-gravatars-em-tempo-real-no-seu-blog-wordpress/">Como carregar Gravatars em tempo real no seu blog WordPress</a></p>
&#160;&#160; Como carregar Gravatars em tempo real no seu blog WordPress Recentemente escrevemos um artigo sobre Como adicionar mais campos no perfil de usuários do WordPress, através de funcionalidades que implementámos no nosso Diretório de Blogs há pouco tempo. E para continuarmos a oferecer soluções de qualidade aos nossos leitores, hoje decidimos que seria interessante [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/como-carregar-gravatars-em-tempo-real-no-seu-blog-wordpress/">Como carregar Gravatars em tempo real no seu blog WordPress</a></p>
<p style="text-align: justify;">Recentemente escrevemos um artigo sobre <a title="Como adicionar mais campos no perfil de usuários do WordPress" href="http://www.escolawp.com/2011/12/como-adicionar-mais-campos-no-perfil-de-usuarios-do-wordpress/" target="_blank">Como adicionar mais campos no perfil de usuários do WordPress</a>, através de funcionalidades que implementámos no nosso <a title="Diretório de Blogs" href="http://www.galeriadeblogs.com" target="_blank">Diretório de Blogs</a> há pouco tempo. E para continuarmos a oferecer soluções de qualidade aos nossos leitores, hoje decidimos que seria interessante partilharmos mais algumas funcionalidades que implementámos recentemente em alguns dos nossos blogs. A ideia do artigo de hoje, é explicar-lhe <strong>como carregar gravatars em tempo real no seu blog WordPress</strong>. Esta ideia implementámos recentemente no nosso blog sobre <a title="como ganhar dinheiro" href="http://www.escoladinheiro.com" target="_blank">como ganhar dinheiro</a>, mais concretamente na seção de comentários do blog, e muitos leitores têm-nos pedido para explicarmos como o fizemos.</p>
<p style="text-align: justify;">Para conseguirmos atingir este resultado final, necessitamos de um algoritmo de encriptação MD5, uma vez que a API do Gravatar necessita dessa encriptação para manter seus endereços de email seguros. Existe um <a href="http://stephenmcintyre.net/examples/gravatar/webtoolkit-md5.js" target="_blank">webtoolkit MD5</a> que faz este trabalho de forma simples e eficaz. Basicamente o que terá de fazer é copiar este código para dentro de uma nova página em branco, e gravá-lo como um ficheiro .js (javascript).</p>
<p style="text-align: justify;"><img class="alignnone size-full wp-image-3765" title="gravatar tempo real" src="http://www.escolawp.com/wp-content/uploads/2011/12/gravatartemporeal.jpg" alt="gravatar tempo real" width="630" height="209" /></p>
<pre class="brush:js">/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

var MD5 = function (string) {

	function RotateLeft(lValue, iShiftBits) {
		return (lValue&lt;&lt;iShiftBits) | (lValue&gt;&gt;&gt;(32-iShiftBits));
	}

	function AddUnsigned(lX,lY) {
		var lX4,lY4,lX8,lY8,lResult;
		lX8 = (lX &amp; 0x80000000);
		lY8 = (lY &amp; 0x80000000);
		lX4 = (lX &amp; 0x40000000);
		lY4 = (lY &amp; 0x40000000);
		lResult = (lX &amp; 0x3FFFFFFF)+(lY &amp; 0x3FFFFFFF);
		if (lX4 &amp; lY4) {
			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
		}
		if (lX4 | lY4) {
			if (lResult &amp; 0x40000000) {
				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
			} else {
				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
			}
		} else {
			return (lResult ^ lX8 ^ lY8);
		}
 	}

 	function F(x,y,z) { return (x &amp; y) | ((~x) &amp; z); }
 	function G(x,y,z) { return (x &amp; z) | (y &amp; (~z)); }
 	function H(x,y,z) { return (x ^ y ^ z); }
	function I(x,y,z) { return (y ^ (x | (~z))); }

	function FF(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function GG(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function HH(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function II(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function ConvertToWordArray(string) {
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=Array(lNumberOfWords-1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while ( lByteCount &lt; lMessageLength ) {
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)&lt;&lt;lBytePosition));
			lByteCount++;
		}
		lWordCount = (lByteCount-(lByteCount % 4))/4;
		lBytePosition = (lByteCount % 4)*8;
		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80&lt;&lt;lBytePosition);
		lWordArray[lNumberOfWords-2] = lMessageLength&lt;&lt;3;
		lWordArray[lNumberOfWords-1] = lMessageLength&gt;&gt;&gt;29;
		return lWordArray;
	};

	function WordToHex(lValue) {
		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
		for (lCount = 0;lCount&lt;=3;lCount++) {
			lByte = (lValue&gt;&gt;&gt;(lCount*8)) &amp; 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
		}
		return WordToHexValue;
	};

	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n &lt; string.length; n++) {

			var c = string.charCodeAt(n);

			if (c &lt; 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c &gt; 127) &amp;&amp; (c &lt; 2048)) {
				utftext += String.fromCharCode((c &gt;&gt; 6) | 192);
				utftext += String.fromCharCode((c &amp; 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c &gt;&gt; 12) | 224);
				utftext += String.fromCharCode(((c &gt;&gt; 6) &amp; 63) | 128);
				utftext += String.fromCharCode((c &amp; 63) | 128);
			}

		}

		return utftext;
	};

	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;

	string = Utf8Encode(string);

	x = ConvertToWordArray(string);

	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

	for (k=0;k&lt;x.length;k+=16) {
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
		a=AddUnsigned(a,AA);
		b=AddUnsigned(b,BB);
		c=AddUnsigned(c,CC);
		d=AddUnsigned(d,DD);
	}

	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

	return temp.toLowerCase();
}</pre>
<p style="text-align: justify;">De seguida, é necessário configurar corretamente o funcionamento do nosso Gravatar. Copie e cole o seguinte código para o local onde deseja que o campo de preenchimento do email correspondente ao Gravatar apareça:</p>
<pre class="brush:php">&lt;img id="gravatar" src="" width="80" height="80" alt="Gravatar" /&gt;

&lt;input id="email" type="text" /&gt;

&lt;script type="text/javascript" src="webtoolkit-md5.js"&gt;&lt;/script&gt;</pre>
<p style="text-align: justify;">Neste código temos a dimensão do gravatar definida para 80&#215;80 pixeis, mas poderá alterar essa dimensão para outro valor que desejar. Temos campo o campo definido para o Id=&#8221;email&#8221; com um type=&#8221;text&#8221;, que específica que o tempo é de texto e para o endereço de email. Por fim temos uma chamada do nosso código de encriptação MD5 em Javascript, que faz a encriptação dos emails e os mantém seguros do ponto de vista da API do Gravatar. Ao digitar o endereço de email, ele altera o Gravatar em tempo real.</p>
<p style="text-align: justify;">Para conseguirmos que o Gravatar seja puxado em tempo real e com isso atingirmos o resultado desejado, é recomendável utilizarmos mais um código Javascript que basicamente trabalha os campos de texto/email e o Gravatar em si. Veja:</p>
<pre class="brush:js">&lt;script type="text/javascript"&gt;

var gravatar = document.getElementById('gravatar');

var email = document.getElementById('email');

email.onkeyup = function(e){
    var key = MD5(email.value);
    gravatar.src = 'http://www.seu-site.com/seu-gravatar/'+key+'?s=80';
};

&lt;/script&gt;</pre>
<p style="text-align: justify;">Este código tem algumas particularidades interessantes. O &#8220;var gravatar&#8221; e o &#8220;var email&#8221; controlam os campos de email e gravatar com o JavaScript, enquanto que o campo &#8220;email.onkeyup&#8221; é uma função que faz com que o Gravatar se altere há medida que o usuário começa a escrever o seu endereço de email, usando o nosso ficheiro de encriptação MD5. O &#8220;gravatar.src&#8221; significa que você pode colocar o endereço de uma imagem com 80&#215;80 pixeis para servir como o seu gravatar padrão, caso o usuário não tenha um registrado, tal como fizemos no nosso blog sobre <a title="como ganhar dinheiro" href="http://www.escoladinheiro.com" target="_blank">como ganhar dinheiro</a>. Se desejar, pode passar por lá para ver o Gravatar em tempo real funcionando corretamente.</p>
<p style="text-align: justify;">Até Já!</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iii/" title="Como Criar Plugins para WordPress (Parte III)">Como Criar Plugins para WordPress (Parte III)</a></li><li><a href="http://www.escolawp.com/2012/01/como-colocar-comentarios-do-facebook-no-wordpress-sem-precisar-de-plugins/" title="Como colocar comentários do Facebook no WordPress sem precisar de plugins">Como colocar comentários do Facebook no WordPress sem precisar de plugins</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-ii/" title="Como Criar Plugins para WordPress (Parte II)">Como Criar Plugins para WordPress (Parte II)</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-i/" title="Como Criar Plugins para WordPress (Parte I)">Como Criar Plugins para WordPress (Parte I)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2011/12/como-carregar-gravatars-em-tempo-real-no-seu-blog-wordpress/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Guia definitivo para criar Custom Post Types (Parte 3)</title>
		<link>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/</link>
		<comments>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 16:18:03 +0000</pubDate>
		<dc:creator>Vitor Carvalho</dc:creator>
				<category><![CDATA[Tutorials Wordpress]]></category>
		<category><![CDATA[como criar custom post types]]></category>
		<category><![CDATA[criando custom post types]]></category>
		<category><![CDATA[criar tipos de posts diferentes no wordpress]]></category>
		<category><![CDATA[guia definitivo]]></category>
		<category><![CDATA[guia definitivo para criar custom post types]]></category>
		<category><![CDATA[tutoriais wordpress]]></category>
		<category><![CDATA[tutorial sobre custom post types]]></category>

		<guid isPermaLink="false">http://www.escolawp.com/?p=3751</guid>
		<description><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">Guia definitivo para criar Custom Post Types (Parte 3)</a></p>
&#160;&#160; Guia definitivo para criar Custom Post Types (Parte 3) Esta série de Tutoriais WordPress pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro e segundo artigos desta série: Guia definitivo para criar Custom Post Types (Parte [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://appthemes.com/cp/go.php?r=1404&i=b8" target="_blank"><img src="http://appthemes.com/ads/cp-250x250a.gif" border=0 alt="ClassiPress - Premium Classified Ads Theme" /></a>&nbsp;<a rel="nofollow" href="http://themeforest.net/?ref=fxdiamond" target="_blank"><img src="http://www.escolawp.com/images/TF_250x250.jpg" border="0" /></a>&nbsp;<a rel="nofollow" href="http://www.woothemes.com/amember/go.php?r=7816&i=b35" target="_blank"><img src="http://woothemes.com/ads/250x250a.jpg" border=0 alt="WooThemes - WordPress themes for everyone" /></a>
<br />
<a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/">Guia definitivo para criar Custom Post Types (Parte 3)</a></p>
<p style="text-align: justify">Esta série de <a title="Tutoriais WordPress" href="http://www.escolawp.com" target="_blank">Tutoriais WordPress</a> pretende ser um complemento de estudo tanto para iniciantes como para profissionais de como programar tipos de post customizados no WordPress. Não esqueça de ler o primeiro e segundo artigos desta série: <a title="Guia definitivo para criar Custom Post Types (Parte 1)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" target="_blank">Guia definitivo para criar Custom Post Types (Parte 1)</a> + <a title="Guia definitivo para criar Custom Post Types (Parte 2)" href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/" target="_blank">Guia definitivo para criar Custom Post Types (Parte 2)</a>. Tenha em atenção que todos os códigos desta série, servem apenas como exemplo. Você pode e DEVE fazer as suas experiências o modificar o código a seu gosto e necessidades.</p>
<p style="text-align: justify">Neste artigo da série iremos extender as capacidades do tipo de posts de maneira a customizar ainda mais a sua apresentação e melhorar a organização dos elementos.</p>
<h3 style="text-align: justify"><span style="color: #ff0000">SUMÁRIO</span></h3>
<ul style="text-align: justify">
<li>Definir mensagens de actualização customizadas na administração</li>
<li><span style="color: #333333">Criar texto de ajuda contextualizada para o tipo de post</span></li>
<li><span style="color: #333333">Modificar e acrescentar colunas na página de listagem do tipo de post</span></li>
<li><span style="color: #333333">Editar e acrescentar “Ações em Massa”</span></li>
</ul>
<p style="text-align: justify"><img class="alignnone size-full wp-image-3712" src="http://www.escolawp.com/wp-content/uploads/2011/11/cpt1.png" alt="custom post types" width="550" height="257" /></p>
<p style="text-align: justify">Customizar a administração por vezes requer algum trabalho, e entrando agora nesta parte o trabalho já não vai ser mais direto como foi nos últimos artigos &#8211; estamos neste momento a &#8220;escavar&#8221; fundo no WordPress.</p>
<p style="text-align: justify">Porém, o nosso objectivo é apenas proporcionar as ferramentas para você poder trabalhar e fazer dos tipos de post o que você quiser, inventando, experienciando e até descobrindo novas funcionalidades, assim sendo nós aqui vamos continuar a seguir uma linha condutora muito directa. O &#8220;grau da sua experiência&#8221; é você que define depois de ler e aprender. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3><span style="color: #ff0000">MENSAGENS DE ESTADO E ATUALIZAÇÃO</span></h3>
<p style="text-align: justify">As mensagens de estado e atualização são aquelas mensagens de noticia ou de erro (amarelas e vermelhas, respectivamente) que aparecem no cabeçalho das páginas da administração indicando que houve acções de criação, edição, eliminação outras acções ou estados que foram concluídos com êxito ou não.</p>
<p style="text-align: justify"><img class="alignnone size-full wp-image-3755" src="http://www.escolawp.com/wp-content/uploads/2011/12/admin_notices-590x334.png" alt="" width="580" height="38" /></p>
<p style="text-align: justify">Nesta parte iremos tratar de como implementar as nossas próprias mensagens de erro ou de estado quando o nosso tipo de post é atualizado, apagado, publicado, removido, etc, mapeando todas as acções possíveis.</p>
<p style="text-align: justify">Para isso chamamos o filtro <em>post_updated_messages</em> que contém um array com todas as strings de estado para todos os tipos de post registados. O código abaixo é a representação de como é possível modificar essas strings facilmente para o nosso tipo de post <em>film</em>:</p>
<pre class="brush:php">add_filter( 'post_updated_messages', 'film_updated_messages' );
function film_updated_messages( $messages ) {
  global $post, $post_ID;

  $messages['film'] = array(
    1 =&gt; sprintf( 'O filme foi atualizado. &lt;a href="%s"&gt;Ver Filme&lt;/a&gt;', esc_url( get_permalink($post_ID) ) ),
    2 =&gt; 'Campo customizado atualizado',
    3 =&gt; 'Campo customizado apagado',
    4 =&gt; 'Filme atualizado',
    5 =&gt; isset( $_GET['revision'] ) ? sprintf( 'Filme atualizado para a revisão %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
    6 =&gt; sprintf( 'Filme publicado. &lt;a href="%s"&gt;Ver Filme&lt;/a&gt;', esc_url( get_permalink($post_ID) ) ),
    7 =&gt; 'Filme guardado.',
    8 =&gt; sprintf( 'Filme guardado. &lt;a target="_blank" href="%s"&gt;Prever Filme&lt;/a&gt;', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
    9 =&gt; sprintf( 'Filme agendado para: &lt;strong&gt;%1$s&lt;/strong&gt;. &lt;a target="_blank" href="%2$s"&gt;Prever Filme&lt;/a&gt;' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post-&gt;post_date ) ), esc_url( get_permalink($post_ID) ) ),
    10 =&gt; sprintf( 'Rascunho de Filme guardado. &lt;a target="_blank" href="%s"&gt;Prever Filme&lt;/a&gt;', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
  );

  return $messages;
}</pre>
<p style="text-align: justify">A função que faz a gestão das mensagens primeiro chama as variáveis globais <em>$post</em> e <em>$post_ID</em> de modo a serem acessíveis a partir da função. Seguidamente, modificamos o array que representa este tipo de post, passando novas strings para serem usadas no lugar das strings por defeito. A função nativa do PHP <em>sprintf()</em> é muito usada aqui, uma vez que ela ajuda na insersão de variáveis importantes para que as mensagens não fiquem descontextualizadas.</p>
<p style="text-align: justify">Você deve seguir uma linha igual à apresentada no código acima, modificando apenas as strings e fazendo o mínimo de mudanças possíveis à posição das variáveis para que a experiência do usuário seja uniforme em toda a administração.</p>
<h3 style="text-align: justify"><span style="color: #ff0000">AJUDA CONTEXTUALIZADA</span></h3>
<p style="text-align: justify">A administração do WordPress tem uma funcionalidade que quase toda a gente desconhece ou simplesmente não liga, mas que deveria ser o primeiro recurso de procura de informação em caso de dúvida.</p>
<p><img class="alignnone size-full wp-image-3756" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selecção_024.png" alt="" width="256" height="56" /></p>
<p style="text-align: justify">Estou a falar daquela aba que fica no cabeçalho de quase todas as páginas da Administração que apresenta o texto “Ajuda”. Se clicar nessa aba, abre-se um painel que apresenta uma ajuda dedicada apenas à página que estamos a observar – é por isso que se chama “Ajuda Contextualizada”, pois encontra-se no contexto da página em que estamos.</p>
<p style="text-align: justify">Por defeito, quando criamos um novo tipo de post a ajuda contextualizada para esse tipo apresenta apenas dois links que ajudam muito pouco quem vai à procura de mais informação, na verdade nós podemos (e devemos) modificar esse painel de maneira a apresentar um texto de ajuda contextualizado tanto na página de edição de posts como no de listagem.</p>
<p style="text-align: justify">Para isso  procedemos como anteriormente, chamando agora a acção <em>contextual_help</em> e passando-lhe uma função que retorna o texto HTML que queremos para ajuda. O código é o seguinte:</p>
<pre class="brush:php">add_action( 'contextual_help', 'film_help_text', 10, 3 );

function film_help_text( $contextual_help, $screen_id, $screen ) {
  if ( 'film' == $screen-&gt;id ) {
    $contextual_help =
     '&lt;p&gt;Este é um texto de ajuda ao nosso tipo de post Filme que aparece na página de edição.&lt;/p&gt;' .
     '&lt;p&gt;Você pode criar o texto que quiser aqui&lt;/p&gt;';
  } elseif ( 'edit-film' == $screen-&gt;id ) {
    $contextual_help =
     '&lt;p&gt;Este texto aparece na ajuda da página de listgem de filmes.&lt;/p&gt;';
  }
  return $contextual_help;
}</pre>
<p style="text-align: justify">Esta acção procura se a tela atual é a página de edição ou a página de listagem de filmes através da variável <em>id</em> do objecto <em>$screen</em>, retornando para cada um dos casos uma ajuda contextual que vai aparecer na aba de Ajuda.</p>
<p style="text-align: justify">Você pode colocar o quiser, seja HTML ou código script ou PHP (sendo que este será escapado e não irá correr, apenas será apresentaod como referência), no entanto à medida que for escrevendo será cada vez mais complicado fazer a gestão destas strings &#8211; escrever HTML dentro de aspas não é a melhor coisa para organização.</p>
<p style="text-align: justify">É por isso que normalmente uso outra abordagem: em vez de colocar as strings aqui, crio um ficheiro HTML para cada uma das ajudas contextuais, e leio o ficheiro para a variável em tempo de execução com ajuda da função nativa do PHP <em>file_get_contents()</em>. Desta forma salvaguardo a organização do espaço nesta função e ao mesmo tempo possibilita-me a modificação do HTML sempre que necessário.</p>
<p style="text-align: justify">Desta maneira a abordagem ficaria o seguinte:</p>
<h3><strong>Ficheiro <em>film_help_text.html</em>:</strong></h3>
<pre class="brush:xml">&lt;p&gt;Este é um texto de ajuda ao nosso tipo de post Filme que aparece na página de edição.&lt;/p&gt;
&lt;p&gt;Você pode criar o texto que quiser aqui&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Aqui sou livre de criar o HTML que quiser.&lt;/li&gt;
&lt;/ul&gt;</pre>
<h3><strong>Modificação do código acima:</strong></h3>
<pre class="brush:php">add_action( 'contextual_help', 'film_help_text', 10, 3 );

function codex_add_help_text( $contextual_help, $screen_id, $screen ) {
  if ( 'film' == $screen-&gt;id ) {
    $contextual_help = file_get_contents( 'film_help_text.html' );
  } elseif ( 'edit-film' == $screen-&gt;id ) {
    $contextual_help = file_get_contents( 'edit-film_help_text.html' );
  }
  return $contextual_help;
}</pre>
<h3 style="text-align: justify"><span class="Apple-style-span" style="font-size: 13px;font-weight: normal">Para isto funcionar, não se esqueça de colocar os ficheiros html no seu <a title="Tema WordPress" href="http://www.escolawp.com" target="_blank">Tema WordPress</a>, na mesma directoria que o ficheiro </span><em>functions.php</em><span class="Apple-style-span" style="font-size: 13px;font-weight: normal">. Lembre-se também de criar o html para o ficheiro </span><em>edit-film_help_text.html</em><span class="Apple-style-span" style="font-size: 13px;font-weight: normal"> que será apresentado na página de listagem.</span></h3>
<h3><span style="color: #ff0000">MODIFICAR COLUNAS NA LISTAGEM DE POSTS</span></h3>
<p style="text-align: justify">A página de listagem apresenta por defeito apenas duas colunas: o título do post e a data de criação ou publicação. Porém, como seria óbvio, nós vamos agora modificar essa tabela de modo a podermos usar mais colunas de maneira customizada, apresentando apenas os dados que queremos e como queremos.</p>
<p style="text-align: justify">Para modificarmos as colunas teremos que chamar quatro acções e filtros, de modo a termos as funcionalidades necessárias. Isto requer algum treino e experiência pois não é muito intuitivo. Penso que a API aqui poderia ser melhorada, e provavelmente será um dia.</p>
<p style="text-align: justify">Para facilitar esta terefa vamos dividir isto em duas partes: a primeira diz respeito à apresentação das colunas em si e a segunda à possibilidade de dar a capacidade de sortear os resultados por coluna.</p>
<h3 style="text-align: justify"><strong>Primeira parte:</strong></h3>
<p style="text-align: justify">Através do filtro <em>manage_edit-&lt;tipo-de-post&gt;_columns</em> criamos o cabeçalho das colunas que queremos que apareçam. Lembra-se daqueles campos customizados (ano, realizador e produtor) que criámos na parte dois da série? Pois bem, vamos usá-los aqui apresentando um por cada coluna:</p>
<pre class="brush:php">add_filter( 'manage_edit-film_columns', 'film_manage_edit_columns' );
function film_manage_edit_columns( $columns ) {

  $film_columns = array(
    "cb" =&gt; $columns["cb"],
    "title" =&gt; $columns["title"],
    "film_ano" =&gt; 'Ano',
    "film_realizador" =&gt; 'Realizador',
    "film_produtor" =&gt; 'Produtor',
    "date" =&gt; $columns["date"],
  );
  return $film_columns;

}</pre>
<p style="text-align: justify">Neste momento temos as colunas já mapeadas, o WordPress sabe que colunas deve apresentar na página de listagem. Nesta função fizémos passar uma nova organização de colunas, mantendo as colunas com a Checkbox, Título e Data, e criando novas colunas que farão a apresentação dos campos customizados.</p>
<p><img class="alignnone size-full wp-image-3757" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selecção_025.png" alt="" width="578" height="76" /></p>
<p style="text-align: justify">Seguidamente iremos chamar a acção que irá fazer o display efetivo do conteúdo de cada post dentro da tabela de listagem. Para isso usamos <em>manage_posts_custom_column</em> :</p>
<pre class="brush:php">add_action( "manage_posts_custom_column", 'film_manage_columns', 10, 2);
function film_manage_columns( $column ) {
  global $post;
  switch ($column) {
    case "film_ano":
      echo get_post_meta( $post-&gt;ID, '_ano_film', true );
      break;

    case "film_realizador":
      echo get_post_meta( $post-&gt;ID, '_realizador_film', true );
      break;

    case "film_produtor":
      echo get_post_meta( $post-&gt;ID, '_produtor_film', true );
      break;

  }
}</pre>
<p style="text-align: justify">Nesta função procuramos pelo nome da coluna pela condição <em>switch</em>, e caso seja igual a uma daquelas corre o código correspondente. Neste caso fazemos o print dos próprios campos customizados.</p>
<h3 style="text-align: justify"><strong>Segunda Parte:</strong></h3>
<p style="text-align: justify">As colunas já aparecem na página de listagem, porém, as únicas colunas que são sorteáveis são o título e a data. Caso queiramos sortear os filmes por ano ou realizador teremos que completar esta segunda parte.</p>
<p style="text-align: justify">Usando mais dois filtros, conseguimos fazer com que essas colunas sejam sorteáveis:</p>
<pre class="brush:php">// Definindo que colunas devem ter a capacidade de sortear
add_filter( 'manage_edit-film_sortable_columns', 'manage_film_sortable_columns' );
function manage_film_sortable_columns( $columns ) {
  $columns['film_ano'] = 'ano';
  $columns['film_realizador'] = 'realizador';
  return $columns;
}

// Aqui lemos as variáveis que estão no URL e fazemos buscas como quisermos
add_filter( 'request', 'film_request' );
function film_request( $vars ) {
  // Procuramos saber se o URL pede para sortear uma das colunas
  if ( isset( $vars['orderby'] ) ) {

    // Sorteamos por coluna
    switch ( $vars['orderby'] ) {

      case 'ano' :
         $vars = array_merge( $vars, array(
           'meta_key' =&gt; '_ano_film',
           'orderby' =&gt; 'meta_value'
         ) );
         break;

      case 'realizador' :
         $vars = array_merge( $vars, array(
           'meta_key' =&gt; '_realizador_film',
           'orderby' =&gt; 'meta_value'
         ) );
         break;
    }
  }
  return $vars;
}</pre>
<p style="text-align: justify">Este código é bem maior, mas é muito direto e de fácil compreensão. No primeiro filtro nós juntamos às colunas já sorteáveis por defeito (Título e Data) as colunas Ano e Realizador. Decidi não colocar a coluna Produtor como sorteável apenas por questões didáticas.</p>
<p style="text-align: justify">O segundo filtro define, para cada uma das colunas, caso seja pedido o seu sorteio, o que deve o WordPress fazer. Neste caso, o WordPress vai fazer o pedido à base de dados de sortear ascendentemente pelo campos customizado. Na verdade, este filtro serve muito mais do que sortear colunas&#8230; você pode criar variáveis no URL que irão fazer novos pedidos à base de dados e apresentar novos posts, mas isso está fora do escopo deste artigo. Fica só a ideia. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3><span style="color: #ff0000">EDITAR E ACRESENTAR ACÇÕES EM MASSA</span></h3>
<p style="text-align: justify">Este truque é por enquanto um pouco tricky, pois a API do WordPress aqui nunca ficou concluída, e possívelmente ainda vai levar algum tempo até ficar concluída. No entanto é possível dar a volta à situação.</p>
<p style="text-align: justify">Vamos dividir esta parte em duas uma dedicando-se ao dropdown de acções em massa e outra aos links de estado listados por cima do cabeçalho da tabela.</p>
<h3><strong>Dropdown de Acções em Massa:</strong></h3>
<p><img class="alignnone size-full wp-image-3758" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selecção_026.png" alt="" width="206" height="38" /></p>
<p style="text-align: justify">Este dropdown é um dos exemplos de uma API inacabada. Neste momento <span style="text-decoration: underline">você só poderá eliminar opções</span> da dropdown, não podendo acrescentar mais. Existe forma de o fazer, nomeadamente usando jQuery, porém este é assunto um tanto complexo, pois será necessário trigar a acção que criamos, e por isso ficará para outra altura.</p>
<p style="text-align: justify">No entanto fica aqui como exemplo o código de como remover a acção de editar em massa. Você poderá retirar todas as acções que estiverem pelo dropdown, basta simplesmente procurar a chave do array correspondente à acção:</p>
<pre class="brush:php">add_filter( 'bulk_actions-edit-film', 'film_bulk_actions', 10, 1 );
function film_bulk_actions( $actions ){
  unset( $actions['edit'] );
  return $actions;
}</pre>
<p>O filtro <em>bulk_actions-edit-&lt;tipo-de-post&gt;</em> recebe um array com as acções disponíveis, bastando ao programador retirar as que quiser.</p>
<h3><strong>Links de Estados:</strong></h3>
<p><img class="alignnone size-full wp-image-3759" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selecção_027.png" alt="" width="176" height="27" /></p>
<p style="text-align: justify">Normalmente uso este espaço para apresentar links para posts customizados que sejam complexos. Deixo como exemplo daquilo que é possível atingir um printscreen destes links dum plugin de encomendas que criei para um cliente:</p>
<p><img class="alignnone size-full wp-image-3753" src="http://www.escolawp.com/wp-content/uploads/2011/12/Selecção_023.png" alt="" width="456" height="110" /></p>
<p style="text-align: justify">É fantático não é? <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Então vamos a isso. O código é simples e muito direto irei apenas dar os componentes necessários para você criar as suas próprias estruturas:</p>
<pre class="brush:php">add_filter( 'views_edit-film', 'film_views', 10, 1 );
function film_views( $views ){
  // Aqui vão as views customizadas
}</pre>
<p style="text-align: justify">Este é o filtro que pode usar para criar os links de estado customizados. Imagine que gostava de criar novos estados para os filmes, por exemplo: &#8220;Pré-lançamento&#8221; e &#8220;Estreias&#8221;.</p>
<p style="text-align: justify"><strong>Primeiro Passo:</strong> vamos criar um campo customizado chamado &#8216;_estado_film&#8217; da maneira descrita no artigos anteriores.</p>
<p style="text-align: justify"><strong>Segundo Passo:</strong> criamos os links que vão aparecer no espaço das views (dentro da função <em>film_views</em>):</p>
<p style="text-align: justify">Primeiro vamos pesquisar se não estamos a aceder a um destes estados e seguidamente criamos os links, isto para cada um deles:</p>
<pre class="brush:php">// Pré-lançamento
$class = ( isset( $_REQUEST['meta_value'] ) &amp;&amp; $_REQUEST['meta_value'] == 'pre' ) ? 'current' : '';
$views['pre'] = '&lt;a class="'.$class.'" href="'.admin_url().'edit.php?post_type=film&amp;meta_key=_estado_film&amp;meta_value=pre"&gt;Pré-lançamento&lt;/a&gt;';

// Estreias
$class = ( isset( $_REQUEST['meta_value'] ) &amp;&amp; $_REQUEST['meta_value'] == 'estreias' ) ? 'current' : '';
$views['estreias'] = '&lt;a class="'.$class.'" href="'.admin_url().'edit.php?post_type=film&amp;meta_key=_estado_film&amp;meta_value=estreias"&gt;Estreias&lt;/a&gt;';

return $views;</pre>
<p style="text-align: justify">Neste código nós criamos mais dois estados que irão aparecer como links. Em cada um, procuramos se a URL contém a variável <em>meta_value</em> e se o seu valor é um dos dois estados definidos anteriores, para se poder aplicar a class <em>current.</em> Em seguida criamos os links para cada view.</p>
<h3><span style="color: #ff0000">NOTA BREVE SOBRE WORDPRESS E PHP</span></h3>
<p style="text-align: justify">O WordPress é uma fantástica plataforma como framework de criação de novas funcionalidades e bastante bem desenhada e fácil de compreender, pois apresenta uma variedade enorme de filtros e acções para utilizar, isto além de racionar bastante o uso de classes, fazendo-o onde é apenas necessário.</p>
<p style="text-align: justify">Pessoalmente, não sou muito fã do sistema de classes em PHP, primeiro porque instanciar objectos em scripts torna-se lento, e segundo porque o sistema de classes no PHP5 está, no meu entender, &#8220;mal&#8221; acabado &#8211; são muitas as questões que não estão bem explicadas e não se sabe bem para que servem, e portanto na prática estas não têm muita utilizade.</p>
<p style="text-align: justify">Porém, assim que você começar a ser um bom programador de tipos de posts vai perceber que são muitas as APIs que necessitam de ser corrigidas ou acabadas, mas há sempre uma forma de se dar a volta. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">Sempre que você encontrar alguma lacuna, pode sempre criar um patch e submetê-lo no trac do WordPress em <a href="http://core.trac.wordpress.org/">http://core.trac.wordpress.org/</a></p>
<p style="text-align: justify">Espero que este artigo tenha aumentado a sua visão em relação aos tipos de post. E lembre-se, a curva de aprendizagem existe sempre, mas com gosto e persistência acabamos sempre por conseguir vencer os obstáculos.</p>
<p style="text-align: justify">Lembre-se de comentar este artigo, e se tiver novos codigos compartilhe. <img src='http://www.escolawp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">Bons estudos e até para a semana.</p>
<h2  class="related_post_title">Artigos Recomendados</h2><ul class="related_post"><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-5/" title="Guia definitivo para criar Custom Post Types (Parte 5)">Guia definitivo para criar Custom Post Types (Parte 5)</a></li><li><a href="http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-4/" title="Guia definitivo para criar Custom Post Types (Parte 4)">Guia definitivo para criar Custom Post Types (Parte 4)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-2/" title="Guia definitivo para criar Custom Post Types (Parte 2)">Guia definitivo para criar Custom Post Types (Parte 2)</a></li><li><a href="http://www.escolawp.com/2011/11/guia-definitivo-para-criar-custom-post-types-parte-1/" title="Guia definitivo para criar Custom Post Types (Parte 1)">Guia definitivo para criar Custom Post Types (Parte 1)</a></li><li><a href="http://www.escolawp.com/2012/02/como-criar-templates-diferentes-para-single-posts-e-categorias-do-wordpress/" title="Como criar templates diferentes para single posts e categorias do WordPress">Como criar templates diferentes para single posts e categorias do WordPress</a></li><li><a href="http://www.escolawp.com/2012/01/como-criar-plugins-para-wordpress-parte-iv/" title="Como Criar Plugins para WordPress (Parte IV)">Como Criar Plugins para WordPress (Parte IV)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.escolawp.com/2011/12/guia-definitivo-para-criar-custom-post-types-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.escolawp.com @ 2012-02-07 05:45:44 -->
