<?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://marcelomesquita.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://marcelomesquita.com</link>
	<description>Desenvolvedor Web</description>
	<lastBuildDate>Tue, 01 Jun 2010 21:09:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Plugin: Widget Custom Loop</title>
		<link>http://marcelomesquita.com/plugin-widget-custom-loop/</link>
		<comments>http://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 dá quase sempre por categorias &#8211; uma coluna mostra os posts da categoria x enquanto [...]]]></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://marcelomesquita.com/wp-content/uploads/2010/04/widget-custom-loop-0.4.zip">Widget Custom Loop</a></p>
]]></content:encoded>
			<wfw:commentRss>http://marcelomesquita.com/plugin-widget-custom-loop/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress é CMS</title>
		<link>http://marcelomesquita.com/wordpress-e-cms/</link>
		<comments>http://marcelomesquita.com/wordpress-e-cms/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 02:36:09 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<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 do Drupal, só quero derrubar alguns mitos que existem em relação ao WordPress quando comparado [...]]]></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://marcelomesquita.com/wordpress-e-cms/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Migrando conteúdo do Drupal para o WordPress</title>
		<link>http://marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/</link>
		<comments>http://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 se nunca mais precisar trabalhar com ele.
A instalação básica do Drupal gera 47 tabelas e [...]]]></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 &#8217;sites/all/modules/&#8217; ou &#8217;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://marcelomesquita.com/migrando-conteudo-do-drupal-para-o-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando Meta Boxes</title>
		<link>http://marcelomesquita.com/criando-meta-boxes/</link>
		<comments>http://marcelomesquita.com/criando-meta-boxes/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 20:30:41 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[WordPress]]></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 de plugins que interajem com os posts ou páginas, é necessário adicionar um novo campo à [...]]]></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 (&#8217;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 (&#8217;normal&#8217;, &#8216;advanced&#8217;, &#8217;side&#8217;) enquanto $priority diz o posicionamento padrão da metabox dentro do $context (&#8217;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://marcelomesquita.com/criando-meta-boxes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando Widgets para o WordPress 2.8</title>
		<link>http://marcelomesquita.com/criando-widgets-para-o-wordpress-28/</link>
		<comments>http://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 arrastar um widget para o sidebar desejado e pronto! O WordPress salva automaticamente o sidebar, [...]]]></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://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://marcelomesquita.com/regex-em-javascript-para-remover-tags/</link>
		<comments>http://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[MicroBlog]]></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://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://marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/</link>
		<comments>http://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[BuddyPress]]></category>
		<category><![CDATA[banco de dados]]></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 programação) não seguem um padrão semelhante ao do WordPress (&#8221;Code is Poetry&#8221;).
Banco de Dados
Me espantei [...]]]></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 (&#8221;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://marcelomesquita.com/minhas-impressoes-sobre-o-buddypress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Modelo de Banco do BuddyPress 1.0</title>
		<link>http://marcelomesquita.com/modelo-de-banco-do-buddypress-10/</link>
		<comments>http://marcelomesquita.com/modelo-de-banco-do-buddypress-10/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 16:36:54 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[modelo]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=180</guid>
		<description><![CDATA[Estou disponibilizando agora o modelo de banco do bp 1.0, assim como o modelo do WP e o modelo do WPMU, esse não é uma representação fiel do banco e sim uma visualização simplificada para consulta. Devido a quantidade de tabelas existentes no BuddyPress, mantive apenas a tabela &#8216;users&#8217; do WPMU, pois é a nela [...]]]></description>
			<content:encoded><![CDATA[<p>Estou disponibilizando agora o <a href="../wp-content/uploads/2009/02/modelo-de-banco-do-wpmu-27.zip" target="_blank"><a href="http://www.marcelomesquita.com/wp-content/uploads/2009/06/modelo-de-banco-do-bp-10.zip">modelo de banco do bp 1.0</a></a>, assim como o <a href="../modelo-de-banco-do-wordpress-27/">modelo do WP</a> e o <a href="http://www.marcelomesquita.com/modelo-de-banco-do-wordpress-mu-27/">modelo do WPMU</a>, esse não é uma representação fiel do banco e sim uma visualização simplificada para consulta. Devido a quantidade de tabelas existentes no BuddyPress, mantive apenas a tabela &#8216;users&#8217; do WPMU, pois é a nela que se concentram a maioria dos relacionamentos do BP. Além disso também fiquei por fazer alguns relacionamentos que estavam confusos e ambiguos.</p>
<p>No arquivo estão o xml para edição no <a href="http://www.fabforce.net/dbdesigner4/" target="_blank">DBDesigner</a> e uma imagem no formato png, conforme a apresentada abaixo.</p>
<p><a href="http://www.marcelomesquita.com/wp-content/uploads/2009/06/bp-10.png"><img class="size-large wp-image-184 alignleft" title="bp-10" src="http://www.marcelomesquita.com/wp-content/uploads/2009/06/bp-10-1024x785.png" alt="bp-10" width="475" height="363" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://marcelomesquita.com/modelo-de-banco-do-buddypress-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Casa nova, vida&#8230; complicada</title>
		<link>http://marcelomesquita.com/casa-nova-vida-complicada/</link>
		<comments>http://marcelomesquita.com/casa-nova-vida-complicada/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 12:02:57 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[vida]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/casa-nova-vida-complicada/</guid>
		<description><![CDATA[Pra quem acompanha o blog&#8230; semana passada eu fiquei sumido pois estava de mudança, ainda não me organizei completamente mas acho que já voltarei a escrever essa semana esse ano. =P
]]></description>
			<content:encoded><![CDATA[<p>Pra quem acompanha o blog&#8230; semana passada eu fiquei sumido pois estava de mudança, ainda não me organizei completamente mas acho que já voltarei a escrever <span style="text-decoration: line-through;">essa semana</span> esse ano. =P</p>
]]></content:encoded>
			<wfw:commentRss>http://marcelomesquita.com/casa-nova-vida-complicada/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Opções de Widgets</title>
		<link>http://marcelomesquita.com/opcoes-de-widgets/</link>
		<comments>http://marcelomesquita.com/opcoes-de-widgets/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 01:44:12 +0000</pubDate>
		<dc:creator>Marcelo Mesquita</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[get_options]]></category>
		<category><![CDATA[register_widget_control]]></category>
		<category><![CDATA[update_options]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[widgets_init]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=155</guid>
		<description><![CDATA[Após criar um widget o próximo passo é adicionar algumas opções a ele, tornando-o mais flexível para o usuário final. Utilizando como exemplo o plugin de posts mais quentes, digamos que você tenha definido a quantidade de cinco posts para serem apresentados mas um usuário queira mostrar apenas três. Para essas situações utilizamos a seguinte [...]]]></description>
			<content:encoded><![CDATA[<p>Após <a href="http://www.marcelomesquita.com/criando-widgets/" target="_blank">criar um widget</a> o próximo passo é adicionar algumas opções a ele, tornando-o mais flexível para o usuário final. Utilizando como exemplo o plugin de posts mais quentes, digamos que você tenha definido a quantidade de cinco posts para serem apresentados mas um usuário queira mostrar apenas três. Para essas situações utilizamos a seguinte função:</p>
<pre>register_widget_control('Nome do Widget', 'sua_funcao_de_configuracao', 'largura', 'altura')</pre>
<div id="attachment_158" class="wp-caption alignright" style="width: 209px"><img class="size-medium wp-image-158" title="configuracao_posts_mais_quentes" src="http://www.marcelomesquita.com/wp-content/uploads/2009/03/configuracao_posts_mais_quentes-199x300.png" alt="Formulário de configuração do Widget" width="199" height="300" /><p class="wp-caption-text">Formulário de configuração do Widget</p></div>
<p>Essa função permite configurar as opções de seu widget onde &#8216;Nome do Widget&#8217; é o nome do widget que deseja configurar (o mesmo que informou em &#8216;register_sidebar_widget&#8217;), &#8217;sua_funcao_de_configuracao&#8217; é a função que deve ser chamada para configurar o plugin e &#8216;largura&#8217; e &#8216;altura&#8217; são opcionais e se referem ao tamanho do formulário de configuração.</p>
<p>A sua função de configuração deve possuir um formulário com os campos de configuração e uma rotina para salvar esses dados no banco. O seu formulário não deve conter as tags &#8216;form&#8217; nem &#8217;submit&#8217;, pois eles são acrescentados automáticamente pelo WordPress de forma a englobar todos os widgets.</p>
<p>Vamos ver uma forma fácil de implementar essa configuração:</p>
<pre>function configurar_posts_mais_quentes()
{
  // Inicializa as variáveis necessárias
  $options = array();

  // Salvando as opções
  if($_POST['salvar_posts_mais_quentes'])
  {
    $opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes'];

    // Valor padrão, caso nada tenha sido informado
    if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = 5;

    update_option('posts_mais_quentes', $opcoes);
  }

  // Carregar as opções desse widget
  $opcoes = get_option('posts_mais_quentes');

  // Formulário
  ?&gt;
    &lt;input type="hidden" name="salvar_posts_mais_quentes" value="1" /&gt;

    &lt;p&gt;
      &lt;label for="quantidade_de_posts_mais_quentes"&gt;Quantidade:&lt;/label&gt;
      &lt;input type="text" name="quantidade_de_posts_mais_quentes" maxlength="2" value="&lt;?php print $opcoes['quantidade']; ?&gt;" class="widefat" /&gt;
    &lt;/p&gt;
  &lt;?php
}</pre>
<p>Explicando&#8230; começando na linha 18 ($opcoes = get_option(&#8217;posts_mais_quentes&#8217;)) carrega as opções desse widget do banco. Notem que usei a tabela &#8216;options&#8217; do banco do WordPress para salvar as opções do plugins, como foi explicado no post <a href="http://www.marcelomesquita.com/plugins-e-banco-de-dados/" target="_blank">plugins e banco de dados</a>.</p>
<p>Agora vamos para o início do formulário na linha 22, onde adiciono um campo oculto (&lt;input type=&#8221;hidden&#8221; name=&#8221;salvar_posts_mais_quentes&#8221; value=&#8221;1&#8243; /&gt;) apenas para ter controle quando o formulário for enviado. Também adicionei um campo de texto na linha 26 (&lt;input type=&#8221;text&#8221; name=&#8221;quantidade_de_posts_mais_quentes&#8221; maxlength=&#8221;2&#8243; value=&#8221;&lt;?php print $opcoes['quantidade']; ?&gt;&#8221; class=&#8221;widefat&#8221; /&gt;) para que o usuário possa informar a quantidade de posts que devem aparecer em seu widget.</p>
<p>Voltando para a linha 7, analizo se o formulário foi enviado, checando se o campo oculto foi informado, então valido o dado recebido do formulário ($opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes']) e, finalmente, salvo as informações no banco (update_option(&#8217;posts_mais_quentes&#8217;, $opcoes)). Notem também que as informações desse widget foram salvas como array, assim é possível armazenar todas as configurações em um único local, poupando quantidade de acesso ao banco e organizando os dados.</p>
<p>Tentei montar esse formulário da forma mais simples possível, além disso coloquei alguns comentários para facilitar o entendimento.</p>
<p>Mas não é só isso, depois de salvar as configurações desse widget ainda falta carregá-las na hora de montar o widget:</p>
<pre>function posts_mais_quentes($args)
{
  global $wpdb;

  // Carregar as opções desse widget
  <span style="color: #990000;">$opcoes = get_option('posts_mais_quentes');</span>

  // Recuperando os posts
  $hot_posts = $wpdb-&gt;get_results("SELECT ID, post_title, comment_count FROM {$wpdb-&gt;posts} ORDER BY comment_count DESC LIMIT <span style="color: #990000;">{$opcoes['quantidade']}</span>");

  // Usando o modelo de widgets do tema
  print $args['before_widget'];
  print $args['before_title'] . "Mais Quentes" . $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'];
}</pre>
<p>Essa função é a mesma do <a href="http://www.marcelomesquita.com/criando-widgets/" target="_blank">post anterior</a> com duas pequenas alterações. Uma na linha 6, onde carrego as configurações salvas e na linha 9 onde uso a quantidade de posts informadas pelo usuário para limitar a consulta (LIMIT {$opcoes['quantidade']}).</p>
<p>É isso&#8230; crie novas possibilidades para seus widgets, os usuários finais possuem sempre gostos diversos, simplifique a vida deles. Abaixo coloco o código completo desse estudo com uma opção a mais para a escolha do título do widget.</p>
<pre>&lt;?php
/*
Plugin Name: Posts mais quentes
Description: Lista posts mais comentados
Version: 0.2
Author: Marcelo Mesquita
Author URI: http://www.marcelomesquita.com/
*/

// Posts Mais Quentes
function posts_mais_quentes($args)
{
  global $wpdb;

  // Carregar as opções desse widget
  $opcoes = get_option('posts_mais_quentes');

  // Valor padrão, caso nada tenha sido informado
  if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = "5";

  // Recuperando os posts
  $hot_posts = $wpdb-&gt;get_results("SELECT ID, post_title, comment_count FROM {$wpdb-&gt;posts} ORDER BY comment_count DESC LIMIT {$opcoes['quantidade']}");

  // Usando o modelo de widgets do tema
  print $args['before_widget'];
  print $args['before_title'] . $opcoes['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'];
}

// Configurações dos Posts Mais Quentes
function configurar_posts_mais_quentes()
{
  // Inicializa as variáveis necessárias
  $opcoes = array();

  // Salvando as opções
  if($_POST['salvar_posts_mais_quentes'])
  {
    $opcoes['titulo'] = $_POST['titulo_dos_posts_mais_quentes'];
    $opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes'];

    // Valor padrão, caso nada tenha sido informado
    if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = "5";

    update_option('posts_mais_quentes', $opcoes);
  }

  // Carregar as opções desse widget
  $opcoes = get_option('posts_mais_quentes');

  // Formulário
  ?&gt;
    &lt;input type="hidden" name="salvar_posts_mais_quentes" value="1" /&gt;

    &lt;p&gt;
      &lt;label for="titulo_dos_posts_mais_quentes"&gt;Título:&lt;/label&gt;
      &lt;input type="text" name="titulo_dos_posts_mais_quentes" maxlength="26" value="&lt;?php print $opcoes['titulo']; ?&gt;" class="widefat" /&gt;
      &lt;label for="quantidade_de_posts_mais_quentes"&gt;Quantidade:&lt;/label&gt;
      &lt;input type="text" name="quantidade_de_posts_mais_quentes" maxlength="2" value="&lt;?php print $opcoes['quantidade']; ?&gt;" class="widefat" /&gt;
    &lt;/p&gt;
  &lt;?php
}

// Ativar o widget
function posts_mais_quentes_widgets()
{
  // Adicionar o widget
  register_sidebar_widget('Posts Mais Quentes', 'posts_mais_quentes');

  // Adicionar o controle ao widget
  register_widget_control('Posts Mais Quentes', 'configurar_posts_mais_quentes');
}

// Carregar o widget
add_action('widgets_init', 'posts_mais_quentes_widgets');
?&gt;</pre>
<p>Boa sorte!</p>
]]></content:encoded>
			<wfw:commentRss>http://marcelomesquita.com/opcoes-de-widgets/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
