<?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>Xemelê</title>
	<atom:link href="http://xemele.cultura.gov.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://xemele.cultura.gov.br</link>
	<description>Interatividade Web no Governo</description>
	<lastBuildDate>Sat, 04 May 2013 00:25:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ministério da Cultura</title>
		<link>http://xemele.cultura.gov.br/blog/2010/05/10/ministerio-da-cultura/</link>
		<comments>http://xemele.cultura.gov.br/blog/2010/05/10/ministerio-da-cultura/#comments</comments>
		<pubDate>Tue, 11 May 2010 00:08:55 +0000</pubDate>
		<dc:creator>Guilherme Aguiar</dc:creator>
				<category><![CDATA[Sites GOV em WordPress]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://xemele.cultura.gov.br/?p=398</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2010/05/10/ministerio-da-cultura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MinC Headlines</title>
		<link>http://xemele.cultura.gov.br/blog/2010/05/09/minc-headlines/</link>
		<comments>http://xemele.cultura.gov.br/blog/2010/05/09/minc-headlines/#comments</comments>
		<pubDate>Sun, 09 May 2010 22:00:48 +0000</pubDate>
		<dc:creator>Marcelo</dc:creator>
				<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://xemele.cultura.gov.br/?p=384</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2010/05/09/minc-headlines/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Vem aí o I Encontro Nacional do Software Público Brasileiro</title>
		<link>http://xemele.cultura.gov.br/blog/2009/09/15/vem-ai-o-i-encontro-nacional-do-software-publico-brasileiro/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/09/15/vem-ai-o-i-encontro-nacional-do-software-publico-brasileiro/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 16:29:39 +0000</pubDate>
		<dc:creator>Guilherme Aguiar</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Novidades]]></category>
		<category><![CDATA[Xemelê]]></category>
		<category><![CDATA[encontro]]></category>
		<category><![CDATA[inscrições]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[software público]]></category>

		<guid isPermaLink="false">http://xemele.cultura.gov.br/?p=297</guid>
		<description><![CDATA[Nos dias 27, 28, 29 e 30 de outubro todas as comunidades abertas e fechadas do Portal do Software Público Brasileiro estarão reunidas no primeiro evento totalmente dedicado ao software público. No I Encontro Nacional, na cidade de Brasília, serão organizadas mais de 30 comunidades e mais de 50 atividades, divididas em palestras, oficinas, reuniões [...]]]></description>
			<content:encoded><![CDATA[<p>Nos dias 27, 28, 29 e 30 de outubro todas as comunidades abertas e fechadas do Portal do Software Público Brasileiro estarão reunidas no primeiro evento totalmente dedicado ao software público. No I Encontro Nacional, na cidade de Brasília, serão organizadas mais de 30 comunidades e mais de 50 atividades, divididas em palestras, oficinas, reuniões das comunidades e workshops.<span id="more-297"></span></p>
<p>Para o evento está confirmada a presença de todos os coordenadores de comunidade. No I Encontro você terá oportunidade de conversar diretamente com cada desenvolvedor e com os usuários dos softwares, discutir os rumos do desenvolvimento do código e influenciar na evolução de cada solução.</p>
<p>Estão previstas atividades para todo o ecossistema de produção dos softwares livres disponíveis no Portal. No mesmo evento estarão presentes o setor público, o setor privado, o terceiro setor, as comunidades de software livre e os grupos de interesse dedicados aos municípios, academia e qualidade de software. Para o coordenador técnico do Portal SPB, Eduardo Santos, que também participa da coordenação da comunidade OpenACS, será um bom momento para compartilhar o conhecimento e colaborar para melhoria de cada solução.</p>
<p>O evento será gratuito e vai inaugurar um movimento liderado pelo Portal de “inscrição consciente”, para evitar que uma pessoa ocupe a vaga de outra sem necessidade. Esse movimento é fundamental pois todas as atividades de treinamento e encontros das comunidades serão gratuitas e abertas para o público em geral.</p>
<p>Na mesma data serão organizados mais dois eventos organizados pelo Portal: a V Rodada de Compartilhamento de Software e o I Encontro Nacional de Apoio Tecnológico aos Municípios, este evento dedicado às prefeituras brasileiras.</p>
<p>Os usuários do Portal do Software Público terão prioridade na inscrição do evento e a programação será apresentada no início de setembro.</p>
<p>O evento é resultado de uma parceria entre o Fórum de Tecnologia da Informação- Fórum TIC e o Portal do Software Público Brasileiro. Confira os detalhes do Fórum TIC no endereço <a href="http://www.forumtic.org.br" target="_blank">www.forumtic.org.br</a></p>
<h3>Programação<a href="http://www.softwarepublico.gov.br/spb/download/file/programa-encontro-2009.pdf" target="_blank"><br />
Clique aqui para baixar a programação</a></h3>
<h3>Inscrição<a href="http://www.softwarepublico.gov.br/eventos/view-week-display?venue_id=14595981&amp;date=2009-10-27&amp;parent_event_id=14603439" target="_blank"><br />
Clique aqui para fazer a sua inscrição</a></h3>
<h3>Dicas</h3>
<p>Recebemos muitas mensagens contendo dúvidas, sugestões e pedidos de esclarecimentos dos usuários interessados em participar do I Encontro Nacional do Software Público Brasileiro.</p>
<p>Na intenção de apoiar e garantir a sua presença passamos, abaixo, algumas dicas sobre o evento:</p>
<ul>
<li><strong>O evento</strong>: todos os coordenadores de comunidade estarão presentes. Será uma execelente oportunidade para conhecer um pouco mais sobre cada solução, discutir tecnicamente os projetos, apresentar propostas de desenvolvimento e colaborar na evolução de cada software.</li>
<li><strong>A programação</strong>: a primeira versão da grade será divulgada no dia 08/09 para todos os usuários do Portal. A primeira grade estará bem próxima da versão final e isto vai ajudá-lo a montar a sua agenda de participação. O evento vai do dia 27 ao dia 30 de outubro.</li>
<li><strong>Funcionário público</strong>: se você trabalha no setor público não esqueça de colocar o evento na sua programação de viagens. Algumas instituições já fazem no mês de setembro a programação de viagens do mês de outubro.</li>
<li><strong>As atividades</strong>: todas as 30 comunidades abertas e as 02 fechadas terão atividades no evento. Serão mais de 70 atividades. É importante ficar atento com a programação específica da comunidade que você tem interesse.</li>
<li><strong>As inscrições</strong>: as inscrições serão abertas no dia 10/09 para todas as atividades.</li>
<li><strong>A inscrição no evento</strong>: a inscrição é gratuita. Ao se inscrever você tem direito de participar de todas as atividades do Fórum TIC e do I Encontro de Apoio Tecnológico para os Municípios Brasileiros. A prioridade na inscrição será para os usuários cadastrados no Portal SPB.</li>
<li><strong>A hospedagem</strong>: procure reservar seu hotel antecipadamente. Em Brasília, os hotéis normalmente tem uma grande procura. Junto com a inscrição será divulgada uma lista de hotéis. O local do evento fica próximo do Setor Hoteleiro Sul &#8211; SHS.</li>
<li><strong>O local</strong>: o evento será no <a href="http://www.convencoesbrasil21.com.br/">Centro de Eventos e Convenções Brasil 21</a>, SHS, quadra 06, lote 01, conjunto A – Brasília &#8211; DF</li>
<li><strong>As oficinas técnicas</strong>: as oficinas têm limite de inscrição, decorrente da quantidade de computadores na sala. Só realize a inscrição se realmente for participar da atividade para não impedir a participação de outra pessoa.</li>
<li><strong>Os encontros de comunidade</strong>: todas as soluções que se encontram há mais de 6 meses no Portal SPB terão encontros de comunidade. Neste espaço serão apresentados, brevemente, o estágio atual da solução, a perspectiva de evolução da mesma e uma rodada de debates com os participantes.</li>
<li><strong>As conferências</strong>: no dia 30 serão realizadas três conferências dedicadas ao CACIC, KyaPanel e OpenACS. Serão 06 horas para cada solução, inclusive com apresentação de casos de sucesso.</li>
<li><strong>Para quem mora em Brasília ou nos arredores</strong>: não deixe sua inscrição para última hora, pois as vagas para as atividades são limitadas.</li>
<li><strong>A divulgação</strong>: a mensagem que será enviada no dia 08 para todos os usuários do Portal SPB poderá ser encaminhada para a sua rede de contatos.</li>
</ul>
<p>Qualquer dúvida envie uma mensagem para <a href="http://planejamento.gov.br/">guialivre@planejamento.gov.br</a></p>
<p>Fonte: <a href="http://www.softwarepublico.gov.br" target="_blank">Portal do Software Público Brasileiro</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2009/09/15/vem-ai-o-i-encontro-nacional-do-software-publico-brasileiro/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando Meta Boxes</title>
		<link>http://xemele.cultura.gov.br/blog/2009/07/24/criando-meta-boxes/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/07/24/criando-meta-boxes/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 20:30:41 +0000</pubDate>
		<dc:creator>Marcelo</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.<span id="more-198"></span></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;, &#8217;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://xemele.cultura.gov.br/blog/2009/07/24/criando-meta-boxes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando Widgets para o WordPress 2.8</title>
		<link>http://xemele.cultura.gov.br/blog/2009/07/18/criando-widgets-para-o-wordpress-28/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/07/18/criando-widgets-para-o-wordpress-28/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 03:27:39 +0000</pubDate>
		<dc:creator>Marcelo</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.<span id="more-267"></span></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://xemele.cultura.gov.br/blog/2009/07/18/criando-widgets-para-o-wordpress-28/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Regex em JavaScript para remover tags</title>
		<link>http://xemele.cultura.gov.br/blog/2009/06/15/regex-em-javascript-para-remover-tags/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/06/15/regex-em-javascript-para-remover-tags/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 16:22:37 +0000</pubDate>
		<dc:creator>Marcelo</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://xemele.cultura.gov.br/blog/2009/06/15/regex-em-javascript-para-remover-tags/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Minhas impressões sobre o BuddyPress</title>
		<link>http://xemele.cultura.gov.br/blog/2009/06/11/minhas-impressoes-sobre-o-buddypress/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/06/11/minhas-impressoes-sobre-o-buddypress/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 21:11:50 +0000</pubDate>
		<dc:creator>Marcelo</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 (&#8220;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 (&#8220;Code is Poetry&#8221;).<span id="more-265"></span></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://xemele.cultura.gov.br/blog/2009/06/11/minhas-impressoes-sobre-o-buddypress/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Modelo de Banco do BuddyPress 1.0</title>
		<link>http://xemele.cultura.gov.br/blog/2009/06/09/modelo-de-banco-do-buddypress-10/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/06/09/modelo-de-banco-do-buddypress-10/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 16:36:54 +0000</pubDate>
		<dc:creator>Marcelo</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><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>, 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.<span id="more-264"></span></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" 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://xemele.cultura.gov.br/blog/2009/06/09/modelo-de-banco-do-buddypress-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evento debate o uso das TIC’s na melhoria da gestão municipal</title>
		<link>http://xemele.cultura.gov.br/blog/2009/04/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/04/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 15:55:04 +0000</pubDate>
		<dc:creator>Guilherme Aguiar</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[gestão]]></category>
		<category><![CDATA[municípios]]></category>
		<category><![CDATA[software público]]></category>
		<category><![CDATA[soluções]]></category>

		<guid isPermaLink="false">http://xemele.cultura.gov.br/?p=336</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2009/04/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opções de Widgets</title>
		<link>http://xemele.cultura.gov.br/blog/2009/03/14/opcoes-de-widgets/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/03/14/opcoes-de-widgets/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 01:44:12 +0000</pubDate>
		<dc:creator>Marcelo</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" 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(&#8216;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(&#8216;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://xemele.cultura.gov.br/blog/2009/03/14/opcoes-de-widgets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
