<?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>Marcelo Mesquita</title>
	<atom:link href="http://www.marcelomesquita.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcelomesquita.com</link>
	<description>Just Another WordPress Developer</description>
	<lastBuildDate>Tue, 21 Aug 2012 19:26:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Qual o nível de segurança do seu sistema?</title>
		<link>http://www.marcelomesquita.com/qual-o-nivel-de-seguranca-do-seu-sistema/</link>
		<comments>http://www.marcelomesquita.com/qual-o-nivel-de-seguranca-do-seu-sistema/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 03:56:18 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>

		<guid isPermaLink="false">http://marcelomesquita.com/?p=299</guid>
		<description><![CDATA[Constantemente me deparo com esse questionamento por algum cliente e, confesso, ainda hesito um pouco na hora de responder. A primeira coisa que me vem à cabeça é: &#8221;O sistema possui um Sistema de Segurança Sayajin Nível 3&#8220;. Acredito que a maioria &#8230; <a href="http://www.marcelomesquita.com/qual-o-nivel-de-seguranca-do-seu-sistema/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Constantemente me deparo com esse questionamento por algum cliente e, confesso, ainda hesito um pouco na hora de responder. A primeira coisa que me vem à cabeça é: &#8221;O sistema possui um <a href="http://divasca.blogspot.com/2011/08/sem-paulo-jose.html" target="_blank">Sistema de Segurança Sayajin Nível 3</a>&#8220;. Acredito que a maioria dos cliente se dariam por satisfeitos. Além disso de que adiantaria ficar cuspindo várias siglas e jargões como: XSS, Força Bruta, SQL Injection, etc.</p>
<p>Quanto mais demoro para responder, mais desconfiados ficam os clientes e isso gera ainda mais dúvidas.</p>
<p>Software Livre é outro termo que levanta muitas suspeitas. Muita gente acha que se o código está aberto fica mais fácil para pessoas mal intencionadas descobrirem falhas mas não entendem que o inverso também se aplica. E o fato de o código estar aberto para todos incrementarem amplia o número de revisores e, consequentemente, da qualidade do software.</p>
<h2>Escala de Segurança</h2>
<p>O problema é que não existe uma escala de segurança para sistemas web. Sei que seria complicado pois deveria levar em conta: servidor, sistema operacional e o fator humano entre outros; mas acredito que essa escala se faça necessária para facilitar o diálogo com clientes leigos e até conduzir o desenvolvimento de novos sistemas.</p>
<p>No que tange os sistemas web, talvez um primeiro passo seja pensar em divisões de nível baseado nas falhas que esse sistema trata, como sanitizar as consultas antes de processá-las no banco. Em seguida, avaliar boas práticas de programação empregadas, por exemplo: não usar variáveis globais.</p>
<p>Cada nível possuiria uma lista de critérios a serem atendidos que ficariam cada vez mais complexos à medida que fosse subindo de nível. Dessa forma teríamos um valor concreto da categoria em que o sistema se encontra.</p>
<h2>O Custo da Segurança</h2>
<p>Certa vez um cliente disse que queria um site 100% seguro. Pensei em dizer que ninguém se daria ao trabalho de hackear seu site mas acho que isso iria atingir em cheio o seu ego. Ao invés disso, me limitei a chutar um valor e prazo para implementação da solução de acordo com o que ele queria, que ultrapassavam sua estimativa de orçamento e cronograma. Isso foi o suficiente para fazê-lo mudar de idéia.</p>
<p>Um site deve ser tão seguro quanto precisa ser. Esse é outra forma de enxergar uma escala de segurança, entendendo que a implementação de cada nível requer um investimento maior, não só para o desenvolvimento mas para compra de certificados, alocação de recurso e por aí vai.</p>
<h2>Nada é Completamente Seguro</h2>
<p>Não existe segurança absoluta, mas dizer isso a seu cliente pode significar a perda de um contrato para uma empresa que diz ter um sistema impenetrável.</p>
<p>Mais uma vez uma escala de segurança mostra sua importância. Deixaria claro para usuários inexperientes o nível de segurança de um sistema e nos permitira fazer comparações com os seus concorrentes.</p>
<p>No mais, quer segurança? Coloque seu site em um pendrive criptografado, com senha, dentro de um cofre, debaixo da sua cama&#8230; bem longe da internet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/qual-o-nivel-de-seguranca-do-seu-sistema/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin: MM Chat</title>
		<link>http://www.marcelomesquita.com/plugin-mm-chat/</link>
		<comments>http://www.marcelomesquita.com/plugin-mm-chat/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 14:09:27 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[bate-papo]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[talk]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=277</guid>
		<description><![CDATA[A algum tempo atrás trabalhei num plugin para chat que acabou nem sendo colocado em funcionamento. Para não haver desperdício, resolvi disponibilizá-lo para download, caso exista algum interessado. Instalação Faça o upload do plugin &#8216;mm-chat&#8217; para o diretório &#8216;/wp-content/plugins/&#8217; do &#8230; <a href="http://www.marcelomesquita.com/plugin-mm-chat/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A algum tempo atrás trabalhei num plugin para chat que acabou nem sendo colocado em funcionamento. Para não haver desperdício, resolvi disponibilizá-lo para download, caso exista algum interessado.</p>
<h3>Instalação</h3>
<ol>
<li>Faça o upload do plugin &#8216;mm-chat&#8217; para o diretório &#8216;/wp-content/plugins/&#8217; do WordPress;</li>
<li>Ative o plugin;</li>
<li>Arraste o widget &#8216;Chat&#8217; para qualquer sidebar</li>
</ol>
<h3>Configuração</h3>
<p><a href="http://www.marcelomesquita.com/wp-content/uploads/2011/10/chat-setup1.png"><img class="alignright size-medium wp-image-279" title="chat-setup" src="http://www.marcelomesquita.com/wp-content/uploads/2011/10/chat-setup1-300x187.png" alt="" width="300" height="187" /></a>Um novo menu aparecerá em &#8216;Configurações &gt; Chat&#8217;, onde será possível configurar o limite e caracteres de cada mensagem e intervalo das atualizações de: mensagens e usuários.</p>
<h3>Utilização</h3>
<p><a href="http://www.marcelomesquita.com/wp-content/uploads/2011/10/chat-dialog1.png"><img class="alignright size-medium wp-image-278" title="chat-dialog" src="http://www.marcelomesquita.com/wp-content/uploads/2011/10/chat-dialog-300x187.png" alt="" width="300" height="187" /></a>Para iniciar uma conversa, faça o login no site, vá para a página onde o widget está, clique no nome da pessoa com quem você quer conversar. Cada usuário tem uma janela própria que pode ser movida para qualquer canto da tela (<a title="jQuery UI - Dialog" href="http://jqueryui.com/demos/dialog/" target="_blank">jQuery UI &#8211; Dialog</a>).</p>
<p>Caso alguém te mande uma mensagem, a janela de dialogo abrirá automáticamente, além de manter um breve histórico das conversas anteriores.</p>
<p>Caso você não queira mais receber mensagens de um determinado usuário, basta clicar no cadeado ao lado do nome do mesmo.</p>
<h3>Download</h3>
<p><a title="MM Chat" href="http://downloads.wordpress.org/plugin/mm-chat.zip" target="_blank">MM Chat</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/plugin-mm-chat/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Template para subcategorias</title>
		<link>http://www.marcelomesquita.com/template-para-subcategorias/</link>
		<comments>http://www.marcelomesquita.com/template-para-subcategorias/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 20:32:55 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Funções]]></category>
		<category><![CDATA[categoria]]></category>
		<category><![CDATA[category]]></category>
		<category><![CDATA[get_term_children]]></category>
		<category><![CDATA[hierarchy]]></category>
		<category><![CDATA[hierarquia]]></category>
		<category><![CDATA[is_category]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://marcelomesquita.com/?p=268</guid>
		<description><![CDATA[As últimas versões do WordPress melhoraram muito a hierarquia de templates, possibilitando criar modelos usando slug de tags ou categorias (category-noticias.php), nome dos autores (author-marcelo.php), tipos de arquivos (image.php) e até criar templates para tipos de posts (single-evento.php archive-evento.php). Uma &#8230; <a href="http://www.marcelomesquita.com/template-para-subcategorias/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>As últimas versões do WordPress melhoraram muito a <a href="http://codex.wordpress.org/Template_Hierarchy" target="_blank">hierarquia de templates</a>, possibilitando criar modelos usando slug de tags ou categorias (category-noticias.php), nome dos autores (author-marcelo.php), tipos de arquivos (image.php) e até criar templates para tipos de posts (single-evento.php archive-evento.php).</p>
<p>Uma coisa da qual sinto falta no WordPress é a possibilidade de criar um template para subcategorias. Dessa forma podemos dividir o site em áreas com cores específicas ou com sidebares diferenciados, por exemplo.</p>
<p>Para resolver esse problema, existe uma função do que recupera as subcategorias de uma dada categoria (<a href="http://codex.wordpress.org/Function_Reference/get_term_children" target="_blank">get_term_children</a>) e as retorna em um array. Com isso podemos usar a template tag <a href="http://codex.wordpress.org/Function_Reference/is_category">is_category</a> passando esse array como parâmetro.</p>
<p>Por fim basta condicionar o carregamento dos templates no arquivo category.php:</p>
<pre>if( is_category( 1 ) or is_category( get_term_children( 1, 'category' ) ) )
  include( 'category-noticias.php' );
elseif( is_category( 2 ) or is_category( get_term_children( 2, 'category' ) ) )
  include( 'category-eventos.php' );
else
  include( 'category-default.php' ); </pre>
<p>Assim para a categoria 1 e suas respectivas filhas, será usado o template category-noticias.php, para a categoria 2 e suas respectivas filhas será usado o template category-eventos.php e para as demais categorias, será usado o template category-default.php.</p>
<p>Para manter o código limpo, é recomendável que o template category.php tenha apenas as condições e os includes dos arquivos corretos, se você pretende manter o código padrão do template da categoria nesse arquivo, lembre-se de deixá-lo dentro da condição else.</p>
<h3>Download</h3>
<p><a href='http://marcelomesquita.com/wp-content/uploads/2011/02/category.php.zip' target="_blank">category</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/template-para-subcategorias/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Plugin: Widget Custom Loop</title>
		<link>http://www.marcelomesquita.com/plugin-widget-custom-loop/</link>
		<comments>http://www.marcelomesquita.com/plugin-widget-custom-loop/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 19:23:01 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[custom loop]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://marcelomesquita.com/?p=251</guid>
		<description><![CDATA[Existe uma rotina na montagem dos conteúdos dos tema para WordPress já que é sempre um loop que carrega o conteúdo dos posts e páginas. Quando trabalhamos com sites grandes com várias colunas de informação a variação nesse loop se &#8230; <a href="http://www.marcelomesquita.com/plugin-widget-custom-loop/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Existe uma rotina na montagem dos conteúdos dos tema para WordPress já que é sempre um loop que carrega o conteúdo dos posts e páginas. Quando trabalhamos com sites grandes com várias colunas de informação a variação nesse loop se dá quase sempre por categorias &#8211; uma coluna mostra os posts da categoria x enquanto outra coluna mostra os posts da categoria y. A maioria das alterações era na estrutura html desses loops, então porque não automatizar esse processo?</p>
<p><a href="http://marcelomesquita.com/wp-content/uploads/2010/04/custom-loop.png"><img class="alignright size-medium wp-image-253" title="custom-loop" src="http://marcelomesquita.com/wp-content/uploads/2010/04/custom-loop-236x300.png" alt="custom-loop" width="236" height="300" /></a>Tentando facilitar as coisas eu criei o plugin Widget Custom Loop, que se trata de um widget que permite a definição do loop e personalização de sua estrutura.</p>
<h3>Instalação</h3>
<ol>
<li>Faça o upload do plugin ‘widget-custom-loop’ para o diretório ‘wp-content/plugins/’ do WordPress;</li>
<li>Ative o plugin.</li>
</ol>
<h3>Utilização</h3>
<p>Na páginda de widgets deverá aparecer o widget &#8216;Custom Loop&#8217;. Arraste o widget para o sidebar desejado e configure de acordo com suas necessidades.</p>
<p>Por padrão, caso o campo &#8216;Loop&#8217; seja deixado em branco o plugin monta um loop automático. Esse modelo de loop automático é definido através da opção &#8216;loop_model&#8217;, caso o tema queira definir um modelo de loop, basta salvar esse modelo na opção &#8216;loop_model&#8217;, por exemplo:</p>
<p>update_option( &#8216;loop_model&#8217;, &#8216;&lt;h3&gt;{title}&lt;/h3&gt;{excerpt}&#8217; );</p>
<p>Dessa forma, sempre que o &#8216;Custom Loop&#8217; for adicionado em algum sidebar, ele seguirá esse modelo por padrão.</p>
<h3>Download</h3>
<p><a href="http://downloads.wordpress.org/plugin/widget-custom-loop.zip" target="_blank">Widget Custom Loop</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/plugin-widget-custom-loop/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>WordPress é CMS</title>
		<link>http://www.marcelomesquita.com/wordpress-e-cms/</link>
		<comments>http://www.marcelomesquita.com/wordpress-e-cms/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 00:36:09 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[info]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Temas]]></category>

		<guid isPermaLink="false">http://marcelomesquita.com/?p=245</guid>
		<description><![CDATA[Esse post era pra ser uma resposta a um comentário que recebi no post &#8216;Migrando Conteúdo do Drupal para WordPress&#8216; que escrevi, mas acabou ficando muito grande e se tornou um post. Minha intensão intenção não é denegrir a imagem &#8230; <a href="http://www.marcelomesquita.com/wordpress-e-cms/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Esse post era pra ser uma resposta a um comentário que recebi no post &#8216;<a href="http://marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/">Migrando Conteúdo do Drupal para WordPress</a>&#8216; que escrevi, mas acabou ficando muito grande e se tornou um post. Minha <span style="text-decoration: line-through;">intensão</span> intenção não é denegrir a imagem do Drupal, só quero derrubar alguns mitos que existem em relação ao WordPress quando comparado a outros CMS&#8217;s &#8211; nesse caso o Drupal.</p>
<p>Já trabalhei desenvolvendo temas e plugins para os dois CMS&#8217;s e minha experiência com o WordPress foi muito mais simples e satisfatória.</p>
<h3><span style="text-decoration: line-through;">WordPress é para Blog</span></h3>
<p>O argumento de WordPress ser para blogs já não cola mais, no <a href="http://wordpress.org/showcase/">Showcase</a> do WordPress, vocês encontram vários exemplos de portais, vitrines e sites que não tem nenhum traço de blog (não que isso seja algo ruim) em seu visual. O fato é: você faz o que quer com o WordPress.</p>
<p>É verdade que existem milhões de blogs no ar que utilizam o WordPress, mas isso não significa que o WordPress só sirva para blogs. A explicação mais adequada para sua popularização se deve a sua simplicidade, facilidade de uso, facilidade de personalização, facilidade de ampliação e integração com outros sistemas. O WordPress diminui a dependencia que os usuários finais têm com os técnicos de informática pois ele é intuitivo, muitos usuários sequer precisam de treinamento para começar a publicar conteúdo.</p>
<p>Também vejo milhares de temas de blogs desenvolvidos para WordPress mas em muitos casos esses temas sequer foram desenvolvidos por programadores, foram designers que se aventuraram no mundo dos códigos e tiveram êxito, o que também é algo positivo pois prova como é tranquilo desenvolver um tema para o WordPress.</p>
<h3><span style="text-decoration: line-through;">WordPress não é &#8216;completo&#8217;</span></h3>
<p>Outra comparação errônea é pensar que determinado CMS é mais completo que outro. O termo &#8216;completo&#8217; é muito relativo, de que adianta um CMS oferecer trinta recursos se você utiliza apenas quatro ou cinco. Os vinte e cinco recursos restantes acabam por complicar o uso da ferramenta e piorar a sua performance. O WordPress oferece um sistema mais enxuto com possibilidades de expansão (plugins), assim você consegue manter apenas o que é necessário para você.</p>
<p>Quanto ao uso de plugins, a instalação básica do Drupal já ativa por padrão vários plugins para as tarefas mais básicas que um CMS poderia oferecer, como: upload de imagens, comentários e taxonomia. Esses recursos são integrados ao WordPress o que fornece mais segurança e facilita a manutenção da plataforma.</p>
<p>Quem ainda tiver dúvidas da qualidade do WordPress como CMS, talvez não saiba que o WordPress foi eleito o <a href="http://info.abril.com.br/premioinfo/2009/lista3.shl" target="_blank">CMS do ano em 2009</a> pela Info.</p>
<h3>Conclusão</h3>
<p>Enfim, eu penso que não há nada que outros CMS&#8217;s façam que o WordPress não possa fazer mas, com certeza, não é qualquer um que pode fazer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/wordpress-e-cms/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Migrando conteúdo do Drupal para o WordPress</title>
		<link>http://www.marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/</link>
		<comments>http://www.marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 14:12:53 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://marcelomesquita.com/?p=237</guid>
		<description><![CDATA[Da necessidade de migrar o conteúdo do Drupal para o WordPress, surgiu o plugin para o Drupal chamado &#8216;Drupal to WordPress&#8217;. Durante o desenvolvimento desse plugin tive a oportunidade de conhecer um pouco mais sobre o Drupal e ficarei grato &#8230; <a href="http://www.marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Da necessidade de migrar o conteúdo do Drupal para o WordPress, surgiu o plugin para o Drupal chamado &#8216;Drupal to WordPress&#8217;. Durante o desenvolvimento desse plugin tive a oportunidade de conhecer um pouco mais sobre o Drupal e ficarei grato se nunca mais precisar trabalhar com ele.</p>
<p>A instalação básica do Drupal gera 47 tabelas e isso dificulta muito o trabalho de migração dos conteúdos. Entendo que isso torne o sistema mais &#8216;completo&#8217;, mas fico pensando em quantas instalações do Drupal realmente utilizam todas essas tabelas. Acredito ser muito mais interessante um sistema enxuto com possibilidades de expansão e é por isso que gosto tanto do WordPress.</p>
<p>Portanto, aos usuário de Drupal que quiserem experimentar algo novo, heis a chance!</p>
<h3>Descrição</h3>
<p>Esse plugin recupera o conteúdo dos nodes, comentários e anexos do Drupal, qualquer outro conteúdo inserido através de plugin não é recuperado. Ele separa os tipos de nodes em categorias no WordPress já que as categorias no Drupal não são obrigatórias.</p>
<h3>Instalação</h3>
<ol>
<li>baixe o plugin;</li>
<li>descompacte-o no diretório &#8216;sites/all/modules/&#8217; ou &#8216;sites/nome-do-seu-site/modules/&#8217;;</li>
<li>vá para &#8216;Administer › Site building › Modules&#8217;;</li>
<li>marque o módulo &#8216;Drupal to WordPress&#8217;;</li>
<li>salve as configurações.</li>
</ol>
<h3>Modo de usar</h3>
<h4>Backup</h4>
<p>Após a instalação deverá aparecer um novo item no menu chamado &#8216;Drupal to WordPress&#8217;, basta clicar nele para baixar o arquivo de migração. Caso o item do menu não apareça, você pode digitar o endereço do seu site em Drupal seguido de &#8216;drupal_to_wordpress&#8217;, por exemplo: http://www.meusite.com/drupal_to_wordpress</p>
<h4>Restauração</h4>
<ol>
<li>faça o login no WordPress;</li>
<li>vá para &#8216;Ferramentas › Importar&#8217;;</li>
<li>selecione o item &#8216;WordPress&#8217;;</li>
<li>faça o upload do arquivo de backup;</li>
<li>informe o nome dos autores;</li>
<li>marque a opção &#8216;baixar e importar arquivos anexos&#8217; para copiar os arquivos do Drupal;</li>
<li>clique em enviar.</li>
</ol>
<h3><a href="http://marcelomesquita.com/wp-content/uploads/2009/12/drupal_to_wordpress.zip" target="_blank">Download</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Criando Meta Boxes</title>
		<link>http://www.marcelomesquita.com/criando-meta-boxes/</link>
		<comments>http://www.marcelomesquita.com/criando-meta-boxes/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 18:30:41 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[add_meta_box]]></category>
		<category><![CDATA[metabox]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=198</guid>
		<description><![CDATA[Na versão 2.7 o WordPress estreiou as meta boxes, que são aquelas caixinhas arrastáveis que estão presente no dashboard, na área de edição de posts e páginas além de outros locais na área administrativa do WordPress. Muitas vezes, na criação &#8230; <a href="http://www.marcelomesquita.com/criando-meta-boxes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Na versão 2.7 o WordPress estreiou as meta boxes, que são aquelas caixinhas arrastáveis que estão presente no dashboard, na área de edição de posts e páginas além de outros locais na área administrativa do WordPress.</p>
<p>Muitas vezes, na criação de plugins que interajem com os posts ou páginas, é necessário adicionar um novo campo à area de edição. Afim de manter a formatação do WordPress, a criação de uma meta box é o caminho mais limpo e fácil. Também é possível adicionar as metaboxes as páginas dos seus plugins, mas é uma tarefa um pouco mais complicada, então vamos deixar para outro artigo.</p>
<h4>add_meta_box($id, $title, $callback, $page, $context=&#8217;advanced&#8217;, $priority=&#8217;default&#8217;, $callback_args=null);</h4>
<p>Essa função é a responssável por adicionar a meta box a uma determinada página. O $id é o identificador único para o HTML, é com esse identificador que o WordPress manipulará sua metabox. Já o $title é o título da metabox, $callback é a sua função que ficará responssável pelo carregamento do conteúdo dentro da metabox e $page é a página onde a sua metabox será carregada (&#8216;page&#8217;, &#8216;post&#8217;, &#8216;link&#8217;, etc). Os outros parâmetros são opcionais: $context define o local da página onde sua metabox será carregada por padrão (&#8216;normal&#8217;, &#8216;advanced&#8217;, &#8216;side&#8217;) enquanto $priority diz o posicionamento padrão da metabox dentro do $context (&#8216;high&#8217; ou &#8216;low&#8217;), e por fim $callback_args que permite a passagem de argumentos à metabox.</p>
<p>Por exemplo, para criar uma metabox que mostre uma frase de incentivo (não consegui pensar em algo mais simples e útil) na parte de cima do sidebar da tela de edição de posts, ficaria assim:</p>
<pre>add_meta_box('incentivador', 'Incentivador', 'incentive_me', 'post', 'side', 'high');</pre>
<p>Não se esqueça de criar a função &#8216;incentive_me&#8217; em seu plugin.</p>
<p>Agora só falta adicionar um gancho para a chamada da metabox:</p>
<pre>add_action('do_meta_boxes', 'incentivador_metabox');</pre>
<p>Onde &#8216;incentivador_metabox&#8217; é a função que conterá o seu add_meta_box.</p>
<p>O código final ficaria assim:</p>
<pre>&lt;?php
/*
Plugin Name: MetaBox: Incentivador
Description: Mostra uma frase
Version: 0.1
Author: Marcelo Mesquita
Author URI: http://www.marcelomesquita.com/
*/

add_action('do_meta_boxes', 'incentivador_metabox');

function incentivador_metabox()
{
    add_meta_box('incentivador', 'Incentivador', 'incentive_me', 'post', 'side', 'high');
}

function incentive_me()
{
    $frases = array(
        'Você consegue!',
        'Faça seu melhor!',
        'Tudo é possível!'
    );

    print $frases[rand(0, 3)];
}
?&gt;</pre>
<p>Para saber mais acesse a <a href="http://codex.wordpress.org/Function_Reference/add_meta_box" target="_blank">Referência da Função add_meta_box</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/criando-meta-boxes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Criando Widgets para o WordPress 2.8</title>
		<link>http://www.marcelomesquita.com/criando-widgets-para-o-wordpress-28/</link>
		<comments>http://www.marcelomesquita.com/criando-widgets-para-o-wordpress-28/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 03:27:39 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[Temas]]></category>
		<category><![CDATA[2.8]]></category>
		<category><![CDATA[widgets]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=194</guid>
		<description><![CDATA[Como todos já devem saber, foi lançada a versão 2.8 do WordPress e entre as principais melhorias está novo sistema de widgets. A interface do usuário está muito mais simples de utilizar, todos os widgets e sidebares ficam listados, basta &#8230; <a href="http://www.marcelomesquita.com/criando-widgets-para-o-wordpress-28/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Como todos já devem saber, foi lançada a versão 2.8 do WordPress e entre as principais melhorias está novo sistema de widgets. A interface do usuário está muito mais simples de utilizar, todos os widgets e sidebares ficam listados, basta arrastar um widget para o sidebar desejado e pronto! O WordPress salva automaticamente o sidebar, além disso os widgets já são multiplicáveis então não é mais necessário ficar regulando a divisão deles ou utilizar plugins que façam a duplicação.</p>
<p>Mas a melhoria não foi só na interface com o usuário, a criação dos widgets também ficou muito mais simples, o WordPress disponibiliza uma classe com todo o código bruto para o funcionamento dos widgets sobrando para o desenvolvedor apenas algumas funções específicas.</p>
<p>A <a href="http://codex.wordpress.org/Plugins/WordPress_Widgets_Api" target="_blank">API dos Widgets do WordPress</a> fornece um modelo para a criação dos widgets:</p>
<pre>class My_Widget extends WP_Widget {
	function My_Widget() {
		// widget actual processes
	}

	function widget($args, $instance) {
		// outputs the content of the widget
	}

	function update($new_instance, $old_instance) {
		// processes widget options to be saved
	}

	function form($instance) {
		// outputs the options form on admin
	}
}
register_widget('My_Widget');</pre>
<p>Explicando rapidamente, nesse modelo você cria uma classe &#8216;My_Widget&#8217; filha de uma classe &#8216;WP_Widget&#8217; que é a classe fornecida pelo WordPress contendo o código bruto, restando ao desenvolvedor a definição dos métodos:</p>
<h3>My_Widget()</h3>
<p>O construtor deve sempre ter o mesmo nome da classe ou se chamar __construct (depende da versão do PHP). No construtor são definidos o id, o nome, a descrição, e outras informações relativas ao widget.</p>
<h3>widget($args, $instance)</h3>
<p>Esse método define a forma como o widget é apresentado no tema. O parêmetro $args é um array contendo a formatação da estrutura do widget como: tags de abertura e fechamento do widget e do título do widget além do nome e id do widget.</p>
<p>O conteúdo dessa função não muda muito em relação ao modelo anterior dos widgets que era chamado pelo &#8216;register_sidebar_widget&#8217;, a única diferença é que o conteúdo da função, antes carregado do banco, agora vem todo no array $instance.</p>
<h3>form($instance)</h3>
<p>O médoto form representa a inteface administrativa do widget, onde é feita a configuração do mesmo, sua definição não é obrigatória.</p>
<p>Esse método é o espelho da função chamada pelo &#8216;register_widget_control&#8217;, mas aqui fica somente a estrutura do formulário. Assim como o método &#8216;widget&#8217;, aqui os dados não precisam mais serem carregados do banco, o array $instance traz todos os dados. O que notei de diferente na montagem do formulário foram apenas as nomeclaturas dos campos, agora tendo que ser feita da seguinte forma:</p>
<pre>&lt;input type="text" id="<span style="color: #990000;">&lt;?php print $this-&gt;get_field_id('nome-do-campo'); ?&gt;</span>" name="<span style="color: #990000;">&lt;?php print $this-&gt;get_field_name('nome-do-campo); ?&gt;</span>" value="&lt;?php print $instance['nome-do-campo']; ?&gt;" /&gt;</pre>
<h3>update($new_instance, $old_instance)</h3>
<p>Também não é necessária a definição do método update. É esse método que realiza o processamento dos dados antes de salva-los no banco. O parâmetro $new_instance contém os dados novos (os que acabaram de ser informados) enquanto o $old_instance contém os dados antigos, para o caso de ser necessário fazer uma comparação.</p>
<p>Após o processamento dos dados, um array com os dados finais deverá ser retornado.</p>
<p>Não pretendo explicar novamente a lógica de criação de um widget, portanto vou simplesmente refazer o widget &#8216;Posts Mais Quentes&#8217; nesse novo modelo e caso tenham dúvidas, consultem o post <a href="http://www.marcelomesquita.com/opcoes-de-widgets/">Opções de Widgets</a>.</p>
<pre>&lt;?php
/*
Plugin Name: Widget: Posts mais quentes
Description: Lista posts mais comentados
Version: 0.3
Author: Marcelo Mesquita
Author URI: http://www.marcelomesquita.com/
*/

// Posts Mais Quentes
class Widget_Posts_Mais_Quentes extends WP_Widget
{
	function Widget_Posts_Mais_Quentes()
	{
		$this-&gt;WP_Widget('posts_mais_quentes', 'Posts Mais Quentes');
	}

	function widget($args, $instance)
	{
		global $wpdb;

		// Valor padrão, caso nada tenha sido informado
		if(empty($instance['quantidade'])) $instance['quantidade'] = "5";
		// Recuperando os posts
		$hot_posts = $wpdb-&gt;get_results("SELECT ID, post_title, comment_count FROM {$wpdb-&gt;posts} WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT {$instance['quantidade']}");

		if(empty($hot_posts))
			return false;

		// Usando o modelo de widgets do tema
		print $args['before_widget'];
		print $args['before_title'] . $instance['titulo'] . $args['after_title'];
		print "&lt;ul&gt;";
		// Listando os posts mais quentes
		foreach($hot_posts as $hot_post)
			print "&lt;li&gt;&lt;a href='" . get_permalink($hot_post-&gt;ID) . "'&gt;{$hot_post-&gt;post_title} ({$hot_post-&gt;comment_count})&lt;/a&gt;&lt;/li&gt;";
		print "&lt;/ul&gt;";
		print $args['after_widget'];
	}

	function update($new_instance, $old_instance)
	{
		return $new_instance;
	}

	function form($instance)
	{
		?&gt;
			&lt;p&gt;
				&lt;label for="&lt;?php print $this-&gt;get_field_id('titulo'); ?&gt;"&gt;Título:&lt;/label&gt;
				&lt;input type="text" id="&lt;?php print $this-&gt;get_field_id('titulo'); ?&gt;" name="&lt;?php print $this-&gt;get_field_name('titulo'); ?&gt;" maxlength="26" value="&lt;?php print $instance['titulo']; ?&gt;" class="widefat" /&gt;
				&lt;label for="&lt;?php print $this-&gt;get_field_id('quantidade'); ?&gt;"&gt;Quantidade:&lt;/label&gt;
				&lt;input type="text" id="&lt;?php print $this-&gt;get_field_id('quantidade'); ?&gt;" name="&lt;?php print $this-&gt;get_field_name('quantidade'); ?&gt;" maxlength="2" value="&lt;?php print $instance['quantidade']; ?&gt;" class="widefat" /&gt;
			&lt;/p&gt;
		&lt;?php
	}
}
// register widget
add_action('widgets_init', create_function('', 'return register_widget("Widget_Posts_Mais_Quentes");'));</pre>
<p>Boa sorte!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/criando-widgets-para-o-wordpress-28/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Regex em JavaScript para remover tags</title>
		<link>http://www.marcelomesquita.com/regex-em-javascript-para-remover-tags/</link>
		<comments>http://www.marcelomesquita.com/regex-em-javascript-para-remover-tags/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 16:22:37 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[MicroPosts]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=190</guid>
		<description><![CDATA[Expressão regular em JavaScript para remover as tags de um texto: text = text.replace(/&#60;[^&#62;]*&#62;/g, ""); Onde text é o texto formatado com as tags.]]></description>
				<content:encoded><![CDATA[<p>Expressão regular em JavaScript para remover as tags de um texto:</p>
<pre>text = text.replace(/&lt;[^&gt;]*&gt;/g, "");</pre>
<p>Onde text é o texto formatado com as tags.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/regex-em-javascript-para-remover-tags/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Minhas impressões sobre o BuddyPress</title>
		<link>http://www.marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/</link>
		<comments>http://www.marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 21:11:50 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[crítica]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=179</guid>
		<description><![CDATA[Estive trabalhando no projeto Cultura Digital e não tem sido uma tarefa fácil. Grande parte da dificuldade que estamos tendo é atribuída ao BuddyPress. Ele não parece ter sido desenvolvido para o WordPress, suas tabelas e códigos (tanto interface quanto &#8230; <a href="http://www.marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Estive trabalhando no projeto Cultura Digital e não tem sido uma tarefa fácil. Grande parte da dificuldade que estamos tendo é atribuída ao BuddyPress. Ele não parece ter sido desenvolvido para o WordPress, suas tabelas e códigos (tanto interface quanto programação) não seguem um padrão semelhante ao do WordPress (&#8220;Code is Poetry&#8221;).</p>
<h3>Banco de Dados</h3>
<p>Me espantei na primeira vez que resolvi analisar a estrutura de dados do BuddyPress; vinte e uma tabelas novas criadas! A instalação original do WP utiliza apenas dez tabelas, a do WPMU necessita de dezesete, por que diabos o BP precisaria de vinte e uma só pra ele, resultando em trinta e oito no total (BP + WPMU).</p>
<p>Após gerar o modelo de dados do BP pude ter uma visão mais ampla da bobagem que haviam feito:</p>
<h4>Nomeclatura das tabelas</h4>
<p>Nomes como &#8216;wp_bp_acivity_user_activity&#8217;, &#8216;wp_bp_acivity_user_activity_cached&#8217;, &#8216;bp_messages_messages&#8217; ou &#8216;bp_messages_threads&#8217; já eram em si um quebra-cabeça a ser decifrado.</p>
<h4>Normalização das tabelas</h4>
<p>Ao começar a trabalhar com as tabelas não pude deixar de notar a quantidade de campos &#8216;user_id&#8217; espalhados por tabelas, de alguma forma, conectadas. O caso mais claro foi o das tabelas &#8216;bp_activity_user_activity&#8217; e &#8216;bp_activity_user_activity_cached&#8217; que já são ligados através do campo &#8216;item_id&#8217; mas ambas possuem os campo &#8216;user_id&#8217;.</p>
<p>Outro caso que me fez perder alguns cabelos foi o da tabela &#8216;bp_messages_threads&#8217; que apenas mantém a ligação das mensagens que são respostas a outras mensagens. Isso poderia ser feito simplesmente criando um auto-relacionamento na tabela &#8216;bp_messages_messages&#8217;.</p>
<h4>Dados redundantes</h4>
<p>Acredito que o pior de tudo foi descobrir que algumas tabelas criadas pelo BuddyPress nem precisavam existir, pois serviam para armazenar informações que podiam ser armazenadas nas tabelas do WordPress.</p>
<p>Destaco o conjunto de tabelas &#8216;bp_xprofile_fields&#8217; e &#8216;bp_xprofile_data&#8217; que server para adicionar novos campos ao perfil do usuário. Para passar uma idéia, uma única tabela do WordPress substitui essas duas do BuddyPress, o plugin Register Plus é um exemplo de como isso pode ser feito. O único motivo, que vejo para que o BuddyPress tenha feito essa separação, seria para obter ganhos em performance, mas o fato de existir um campo para cada dado me fez pensar que a performance estaria equilibrada já que na tabela &#8216;usermeta&#8217; esses dados poderiam estar em forma de array e, assim, ocupariam um campo apenas.</p>
<p>Também não gostei da forma como o BuddyPress trata as atividades. Apesar das atividades do site serem o conjunto das atividades de cada usuário, os dados ficam duplicados em diferentes tabelas. Por exemplo: Ao alterar meu perfil uma nova atividade é cadastrada na tabela &#8216;bp_activity_user_activity&#8217; e depois a mesma informação é cadastrada na tabela &#8216;bp_activity_sitewide&#8217;.</p>
<h3>Codificação</h3>
<p>A codificação também ficou a desejar.</p>
<h4>Funções engessadas</h4>
<p>Diferente do WordPress onde as &#8216;template tags&#8217; (funções que auxiliam a montagem do tema) praticamente não interferem na forma como o html é montado, no BuddyPress algumas &#8216;template tags&#8217; carregam muito lixo e apresentam um visual pré-definido. Isso dificulta a personalização do tema pois força a alteração dos arquivos do BuddyPress para atingir um resultado esperado.</p>
<p>Por exemplo: a função que carrega os dados do perfil (xprofile_get_profile) monta uma tabela zebrada (uma linha clara outra escura), apenas com os dados informados e adiciona link a cada item. Mas a zebra que o BP monta é baseada nos dados que estão no banco, então se eu tiver deixado algum campo vazio a tabela acaba pulando uma cor deixando duas linhas claras e uma escura ou algo parecido. Se eu quiser corrigir essa zebra ou retirar os links dos dados eu precisarei criar uma função do zero para não ter que &#8216;hackear&#8217; o BP.</p>
<h4>Mistura de tema com plugin</h4>
<p>Os temas são muito dependentes de funções definidas nos plugins. Essa questão é mais ou menos a mesma citada no item acima, imagine tentar criar uma nova função apenas para recuperar os membros ou pense na dor de cabeça que é ficar alternando entre plugins e tema para entender como tal trecho de código é montado.</p>
<h3>Conclusão</h3>
<p>O BuddyPress tem muito a evoluir antes de se tornar um sistema confiável, acredito que o principal é voltar os esforços para deixá-lo mais compatível com o seu hospedeiro, o WordPress. Assim poderá haver uma maior compatibilidade entre os plugins e temas, além de diminuir a curva de aprendizado para os desenvolvedores que já trabalham com o WordPress, o que, na minha opinião, poderá resultar em um impulso na comunidade BuddyPress.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
