<?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>Mon, 07 Feb 2011 14:31:56 +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>MinC Headlines</title>
		<link>http://xemele.cultura.gov.br/blog/2010/03/09/minc-headlines/</link>
		<comments>http://xemele.cultura.gov.br/blog/2010/03/09/minc-headlines/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21: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[O HeadLines é um gerenciador de capas que permite ordenar os posts no WordPress por importância, faz basicamente o mesmo que o plugin &#8216;Lead Manager&#8216; mas de uma forma mais enxuta e integrada ao WordPress.
Inicialmente o plugin não teria mais a opção de datas de entrada e saída, mas recebemos vários pedidos para manter esse [...]]]></description>
			<content:encoded><![CDATA[<p>O HeadLines é um gerenciador de capas que permite ordenar os posts no WordPress por importância, faz basicamente o mesmo que o plugin &#8216;<a href="http://xemele.cultura.gov.br/blog/2008/05/15/gerenciador-de-capas/">Lead Manager</a>&#8216; mas de uma forma mais enxuta e integrada ao WordPress.</p>
<p>Inicialmente o plugin não teria mais a opção de datas de entrada e saída, mas recebemos vários pedidos para manter esse recurso e iremos trabalhar para incorporá-lo de forma opcional.</p>
<h2>Instalação</h2>
<ol>
<li>Faça o upload do plugin &#8216;minc-headlines&#8217; para o diretório &#8216;wp-content/plugins/&#8217; do WordPress</li>
<li>Ative o plugin</li>
<li>Edite o tema para utilizar o novo modelo de ordenamento</li>
</ol>
<p>Após a ativação do tema o plugin dois novos menus:</p>
<ul>
<li>Headlines &#8211; onde é possível ordenar os posts de uma determinada categoria</li>
<li>Headlines Categories &#8211; onde são criadas categorias específicas para as manchetes. Por padrão o plugin já cria uma categoria chamada &#8216;HeadLine&#8217;</li>
</ul>
<h2>Utilização</h2>
<p>Na tela de edição de posts uma nova caixa surgirá (HeadLines) onde será possível informar o título e a chamada opcional para a chamada além da posição em que esse posts ficará em cada categoria de manchete. Caso uma posição da categoria já esteja ocupada, o título do post aparece ao lado da ordem, facilitando a substituição de posts mais antigos.</p>
<p>O minc-headlines funciona de forma semelhante ao Objeto &#8216;WP_Query&#8217; do WordPress. Após carregados os posts, o loop e as template tags são do próprio WordPress. Abaixo mostro um exemplo:</p>
<pre>&lt;?php $headlines_loop = new HL_Query( "headline_category_name=headlines" ); ?&gt;
&lt;?php while( $headlines_loop-&gt;have_posts() ) : ?&gt;
&lt;a href='&lt;?php the_permalink(); ?&gt;'&gt;&lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;&lt;/a&gt;
&lt;?php the_content( 'leia mais' ) ?&gt;
&lt;?php endwhile; ?&gt;</pre>
<p>Basta informar em &#8216;headline_category_name&#8217; o slug da categoria de manchete que você deseja que seja carregada e o resto é basicamente o loop do WordPress.</p>
<h2>Permissões</h2>
<p>Diferente do &#8216;Lead Manager&#8217;, o HeadLines adiciona as permissões de usuários nas regras do WordPress. Dessa forma é possível manipular as permissões através de plugins como o &#8216;<a href="http://www.im-web-gefunden.de/wordpress-plugins/role-manager/" target="_self">Role Manager</a>&#8216;.</p>
<h2>Download</h2>
<p><a href="http://xemele.cultura.gov.br/files/2010/03/minc-headlines-0.3.9.zip">MinC HeadLines</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2010/03/09/minc-headlines/feed/</wfw:commentRss>
		<slash:comments>9</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/09/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/09/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 14: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[Brasília, 10/9/2009 – O potencial das Tecnologias da Informação e Comunicação (TICs) na melhoria da gestão municipal e no oferecimento de serviços virtuais para qualificar o atendimento ao cidadão será debatido nos dias 27 e 28 de outubro, no Centro de Eventos e Convenções Brasil 21.
O Encontro Nacional de Tecnologia da Informação para os Municípios [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Brasília, 10/9/2009</strong> – O potencial das Tecnologias da Informação e Comunicação (TICs) na melhoria da gestão municipal e no oferecimento de serviços virtuais para qualificar o atendimento ao cidadão será debatido nos dias 27 e 28 de outubro, no Centro de Eventos e Convenções Brasil 21.</p>
<p>O Encontro Nacional de Tecnologia da Informação para os Municípios Brasileiros reunirá prefeitos, secretários, gestores e técnicos municipais. Com inscrições já abertas (<a href="http://www.softwarepublico.gov.br/4cmbr" target="_blank">www.softwarepublico.gov.br/4cmbr</a>), o evento é promovido pela Secretaria de Logística e Tecnologia da Informação (SLTI) com o apoio da Secretaria de Gestão (Seges), ambas do Ministério do Planejamento. Também conta com o apoio da Subchefia de Assuntos Federativos /SRI/PR.</p>
<p>O objetivo do evento é difundir junto aos gestores municipais as soluções de TICs voltadas à qualificação dos serviços públicos em diversas áreas como compras governamentais, inclusão digital, convênios, integração de redes, saúde, educação e governo eletrônico.</p>
<p>O Governo Federal já desenvolveu uma iniciativa que alia a proximidade entre o Estado e os cidadãos, inerente aos municípios, às tecnologias da informação e com o objetivo de qualificar a prestação de serviços públicos. Esta é a proposta do 4CMBr Comunidade, Conhecimento, Colaboração e Compartilhamento.</p>
<p>Vinculado ao Portal do Software Público Brasileiro, esse espaço reúne soluções de TI voltadas à melhoria da gestão municipal e, conseqüentemente, do atendimento à população. O 4CMBr dispõe de diversos programas para administração pública que podem ser copiados e adaptados para os municípios, reduzindo custos na aquisição de soluções informatizadas.</p>
<p>Os usuários também podem propor sugestões para a melhoria das soluções, pois o ambiente oferece ferramentas de interação como fóruns, chats e espaços de colaboração. Também conta com publicações para apoiar programas de inclusão digital e relatos sobre experiências de sucesso em diversas cidades brasileiras.</p>
<p>O 4CMBr foi desenvolvido na plataforma web 2.0, a internet das redes sociais, e sua coordenação é gerenciada com a participação de profissionais das áreas acadêmica e técnica.</p>
<p>O Encontro integrará a programação do Fórum TIC 2009 – Tecnologias para um Brasil Sustentável – que também será realizado no Centro de Eventos e Convenções Brasil 21, no período de 27 a 30 de outubro. Mais informações podem ser obtidas pelo e-mail <a href="mailto:4cmbr@sotwarepublico.gov.br">4cmbr@sotwarepublico.gov.br</a></p>
<p><strong>Soluções públicas</strong></p>
<p>Além do Encontro Nacional de Tecnologia da Informação para os Municípios Brasileiros, o Ministério do Planejamento realiza, durante o Fórum TIC 2009, o Encontro Nacional do Portal do Software Público.</p>
<p>O evento promoverá palestras, oficinas, workshops e reuniões para debater as funcionalidades e inovações para as soluções já disponibilizadas no Portal do Software Público Brasileiro. Atualmente, cerca de 50 mil pessoas participam das comunidades de prática e compartilhamento do conhecimento.</p>
<p>Atualmente já estão disponíveis no local 30 soluções livres nas áreas da saúde, educação, saneamento, gestão de TI, TV Digital, geoprocessamento, entre outras. São softwares desenvolvidos por órgãos públicos, empresas e universidades que podem ser obtidos por qualquer pessoa mediante cadastramento no endereço <a href="http://www.softwarepublico.gov.br/" target="_blank"><span style="font-size: 12px"><span style="font-family: Arial">www.softwarepublico.gov.br</span></span></a></p>
<p><strong>Fonte:</strong> <a href="http://www.planejamento.gov.br/noticia.asp?p=not&amp;cod=4299&amp;cat=94&amp;sec=7" target="_blank">Ministério do Planejamento</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2009/09/18/evento-debate-o-uso-das-tic%e2%80%99s-na-melhoria-da-gestao-municipal/feed/</wfw:commentRss>
		<slash:comments>3</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>5</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>2</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>8</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>7</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>13</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>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>4</slash:comments>
		</item>
		<item>
		<title>Criando Widgets</title>
		<link>http://xemele.cultura.gov.br/blog/2009/03/07/criando-widgets/</link>
		<comments>http://xemele.cultura.gov.br/blog/2009/03/07/criando-widgets/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 03:27:15 +0000</pubDate>
		<dc:creator>Marcelo</dc:creator>
				<category><![CDATA[Documentação]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[register_sidebar_widget]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.marcelomesquita.com/?p=96</guid>
		<description><![CDATA[No WordPress o sistema de widgets permite que usuários comuns ativem funcionalidades no site sem precisar, necessáriamente, entender HTML, CSS, PHP, etc. Mas para isso, esses usuários precisam que desenvolvedores se dediquem um pouco mais para tornar seus produtos (plugins, temas, etc) aptos a trabalhar dessa forma.
Para adicionar um widget, basta criar uma uma função [...]]]></description>
			<content:encoded><![CDATA[<p>No WordPress o sistema de widgets permite que usuários comuns ativem funcionalidades no site sem precisar, necessáriamente, entender HTML, CSS, PHP, etc. Mas para isso, esses usuários precisam que desenvolvedores se dediquem um pouco mais para tornar seus produtos (plugins, temas, etc) aptos a trabalhar dessa forma.</p>
<p>Para adicionar um widget, basta criar uma uma função e informar para o WP que aquela função deve ser tratada como um widget. Isso é feito da seguinte forma:</p>
<pre>register_sidebar_widget('Nome do Widget', 'sua_funcao', 'sua_classe');</pre>
<p>É tão simples quanto parece, o &#8216;Nome do Widget&#8217; é o identificador do widget, &#8217;sua_funcao&#8217; é a função que deve ser chamada quando esse widget estiver ativo e &#8217;sua_classe&#8217; é opcional e se refere ao nome da classe css que deve ser inserida nesse widget.</p>
<p>Para que o seu widget se adeque ao tema é importante lembrar sempre de usar o modelo de widget definido no próprio tema para conter o conteúdo de sua função. Esse modelo é sempre embutido em forma de argumento na sua função, você só precisa usá-lo. Um exemplo vale mais do que mil palavras, então vejamos como ficaria:</p>
<pre>sua_funcao(<span style="color: #880000">$args</span>)
{
  print <span style="color: #880000">$args['before_widget']</span>;
  print <span style="color: #880000">$args['before_title']</span> . "Nome do Widget" . <span style="color: #880000">$args['after_title']</span>;
  print "conteúdo de seu widget";
  print <span style="color: #880000">$args['after_widget']</span>;
}</pre>
<p>Agora que você sabe que é fácil, não tem desculpa para não utiliza-lá em seus plugins. Assim, os usuário não precisarão fazer edições no template, para usufruir dos benefícios de seus plugins, além de tornar mais simples o seu controle.</p>
<p>Juntando o que você aprendeu até agora sobre <a href="http://www.marcelomesquita.com/criando-um-plugin/" target="_blank">criar um plugin</a> mas o que você acabou de aprender sobre criação de widget e um pouco de criatividade, já é possível fazer algumas coisas interessantes. Que tal um plugin que mostre no sidebar os posts mais quentes:</p>
<pre>&lt;?php
/*
Plugin Name: Posts mais quentes
Description: Lista posts mais comentados
Version: 0.1
Author: Marcelo Mesquita
Author URI: http://www.marcelomesquita.com/
*/

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

  // 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 5");

  // 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'];
}

// Ativa o sidebar
function posts_mais_quentes_widgets() {
  register_sidebar_widget('Posts Mais Quentes', 'posts_mais_quentes');
}

// Carregar o widget
add_action('widgets_init', 'posts_mais_quentes_widgets');

?&gt;</pre>
<p>Agora é só ativar o plugin e adicionar o widget ao sidebar para ve-lo funcionando. Colher de chá!</p>
<h3>Agradecimentos</h3>
<p>Obrigado ao Rômulo por corrigir o código do plugin acima.</p>
]]></content:encoded>
			<wfw:commentRss>http://xemele.cultura.gov.br/blog/2009/03/07/criando-widgets/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

