<?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>Bruno Cantuaria</title>
	<atom:link href="http://cantuaria.net.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://cantuaria.net.br</link>
	<description>Criação e Desenvolvimento de Websites</description>
	<lastBuildDate>Tue, 30 Apr 2013 13:09:52 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Diferença de Home e Front Page no WordPress</title>
		<link>http://cantuaria.net.br/blog/diferenca-de-home-e-front-page-no-wordpress/</link>
		<comments>http://cantuaria.net.br/blog/diferenca-de-home-e-front-page-no-wordpress/#comments</comments>
		<pubDate>Thu, 31 May 2012 18:54:28 +0000</pubDate>
		<dc:creator>cantuaria</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Temas]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=129</guid>
		<description><![CDATA[Tá com dificuldades com a sua home page, ou seria front page, do WordPress? Aprenda a diferença dos dois termos e como interagir com eles!]]></description>
				<content:encoded><![CDATA[<p>Há algum tempo descobri que o WordPress faz uma diferenciação singela, mas essencial, entre os nomes Home e Front Page. O grande problema, ou solução &#8211; depende apenas do ponto de vista, que isso acarreta, é que existem funções e arquivos específicos para Home e Front Page.</p>
<p>Quando vamos criar um tema para o WordPress temos três opções de escolha para modelar a página inicial do site. E como a moda hoje é ter uma página inicial diferente, mesmo que você tenha apenas um simplório blog, é muito importante sabermos diferenciar quando estamos falando de Home ou de uma Front Page.</p>
<p>Por padrão o WordPress apresenta a página inicial do site como uma página básica de blog, mostrando os artigos mais recentes postados. Sendo assim, o primeiro arquivo na pasta do tema que o WordPress busca é o <em>index.php</em>. De fato, você pode criar seu tema todo através do index.php já que o WordPress sempre voltará nele caso não exista um arquivo de tema mais específico para apresentar.</p>
<p>Mas como somos organizados (eu espero!), é lógico que você não vai querer toda a estrutura do tema em um arquivo só. Voltando para a página inicial o WordPress pode usar dois outros arquivos como página inicial, o <em>home.php</em> e o <em>front-page.php.</em></p>
<p>Mas qual a diferença dos dois? É bem simples, o Home é a página inicial que o WordPress irá mostrar se você não especificar alguma outra página como página inicial, já a Front Page é, obviamente, a página especificada como página inicial.</p>
<p>Não entendeu? É porque é realmente simples! Se você for no menu <strong>Configurações</strong> e no sub-menu <strong>Leitura</strong>, vai entender. A primeira configuração que aparecerá será <strong>A página inicial mostra </strong>com as opções <strong>Seus posts mais recentes (padrão)</strong> e <strong>Uma página estática (selecionar abaixo)</strong>. Se você não selecionar uma página estática, deixando a opção no padrão, então você terá uma <strong>Home</strong>, mas se você definir uma página estática como inicial, então você terá uma <strong>Front Page.</strong></p>
<p>Para deixar ainda mais fácil: <strong>se a página inicial possuir uma lista com os artigos mais recentes é uma Home, já se mostra o conteúdo de uma página, é uma Front Page.</strong></p>
<p>Agora vem a parte realmente importante. Se você criar um tema com um layout diferente para a página inicial e coloca ele no arquivo <em>front-page.php, </em>ele só terá efeito se você escolher uma página estática como a página inicial. Fique atento, o loop de posts padrão que você chamar nesse arquivo só retornará o conteúdo da página estática em questão, assim você pode transformar qualquer página estática em uma página personalizada usando ela como página inicial.</p>
<p>Agora se você implementar o layout diferente da página inicial no arquivo <em>home.php</em>, ele só terá efeito se a opção padrão de página inicial (os posts mais recentes) estiver selecionada. Aqui sim, o loop padrão de posts conterá os posts mais recentes publicados no site. É óbvio que você pode criar loops customizados em ambas as opções, ou nem mesmo usar loop nenhum, mas é importante lembrar que a diferença de Home e Front Page implica diferença no resultado do loop padrão.</p>
<p>Há também duas funções de comparação muito usadas, inclusive em plugins, que merecem a atenção. Trata-se da <em><a href="http://codex.wordpress.org/Function_Reference/is_home" target="_blank">is_home()</a></em> e da <a href="http://codex.wordpress.org/Function_Reference/is_front_page" target="_blank"><em>is_front_page()</em></a>. Como sugere, a <em>is_home() </em>retorna verdadeiro se a página em questão for a página inicial de posts recentes, já a <em>is_front_page()</em> retorna verdadeiro se a página em questão for uma página inicial estática.</p>
<p>Sabendo disso fica bem mais fácil programar a página inicial do seu tema. Lembrando que seu tema pode incluir os dois arquivos, home e front-page, que o WordPress vai pegar o correto conforme a configuração.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/diferenca-de-home-e-front-page-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress e uasort</title>
		<link>http://cantuaria.net.br/blog/wordpress-e-uasort/</link>
		<comments>http://cantuaria.net.br/blog/wordpress-e-uasort/#comments</comments>
		<pubDate>Tue, 15 May 2012 19:22:13 +0000</pubDate>
		<dc:creator>cantuaria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[codigo]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=121</guid>
		<description><![CDATA[O uasort é uma função do PHP usada para criar seu próprio meio de ordenação, veja como usar ele e as variáveis do WordPress para ordenação.]]></description>
				<content:encoded><![CDATA[<p>Essa semana passei por mais uma situação interessante e achei que ia caber bem aqui no blog. Trabalhando em um tema eCommerce com o WordPress acabei encontrando um pequeno bug em uma de suas funções.</p>
<p>Bom, não sei se é realmente um bug, mas não funciona como deveria. A função em questão é a <a href="http://codex.wordpress.org/Function_Reference/get_categories">get_categories()</a>, que serve para pegar uma lista com todas as categorias, de forma bem semelhante ao wp_query(). Acontece que no get_categories() o parâmetro &#8216;orderby&#8217;, que ordena a listagem, não funciona corretamente.</p>
<p>Fiz o teste usando tanto o &#8216;orderby&#8217; definido para nome, slug ou count, em todos eles a listagem vinha em uma ordem totalmente errada. Tentei procurar alguém com o mesmo problema mas não encontrei nada no Google, então tive que ir atrás de ordenar eu mesmo a lista. E é aí que entra o tal do <a href="http://php.net/manual/pt_BR/function.uasort.php">uasort</a>.</p>
<p>Como você já deve ter percebido, 99% das funções do WordPress ao retornar algum dado faz isso usando um array de multinível, também conhecido como matriz, o que impossibilita o uso de funções mais simples como a <a href="http://php.net/manual/pt_BR/function.sort.php">sort</a>, que é usada para ordernar arrays simples, ou vetores.</p>
<p>Um vetor basicamente é uma série indexada de valores, assim:</p>
<pre style="padding-left: 30px;">array ( [0] -&gt; valor 1, [1] -&gt; valor 2, [3] -&gt; valor 3 );</pre>
<p>Já uma matriz é uma série indexada de vetores, ou seja:</p>
<pre style="padding-left: 30px;">array ( [0] -&gt; array ([0] -&gt; valor 1, [1] -&gt; valor 2), [1] -&gt; array( [0] -&gt; valor 1, [1] -&gt; valor 2 ) );</pre>
<p>E para que seja possível passar vários dados estruturados em uma única variável, como é o caso das categorias, já que cada categoria possui várias variáveis, o WordPress utiliza matrizes. Uma ótima escolha, mas e o tal do <strong>uasort</strong>?</p>
<p>Bom, podemos utilizar o <strong>uasort</strong> para ordenar a matriz quando o WordPress não faz isso, seja por causa de bug ou por que ele simplesmente não oferece a opção. Note que se o WordPress oferecer a opção, o melhor é sempre usá-la, já que nesse caso ele ordenará o resultado ainda no Banco de Dados, otimizando o desempenho. Usar o <strong>uasort </strong>também pode ser muito útil quando você quiser apresentar dois resultados iguais em ordens diferentes sem precisar invocar a função de pesquisa novamente.</p>
<p>O PHP conta com várias funções de ordenação, mas apenas de nível simples, para vetores. Como as matrizes possuem diversos valores em diversos formatos em diversos índices, seria impossível uma função que descobrisse sozinha por qual índice seria a ordenação e qual formato seguiria. O <strong>uasort </strong>permite que nós criemos nosso próprio meio de ordenação, o que permite criarmos funções avançadas de ordenação.</p>
<p>Para usar o <strong>uasort</strong> é bem simples, precisamos criar uma função que recebe dois valores e chamar a função passando a variável, assim:</p>
<pre style="padding-left: 30px;">uasort($variável, "função_de_ordenação");</pre>
<pre style="padding-left: 30px;">function função_de_ordenação($a,$b) {</pre>
<pre style="padding-left: 60px;">//Como sabemos a estrutura da matriz, podemos comparar seu conteúdo. Aqui vou ordenar uma matriz que entre suas variáveis possui a 'count' que representa o número de posts dentro de cada categoria.</pre>
<pre style="padding-left: 60px;">if ($a-&gt;count == $b-&gt;count)</pre>
<pre style="padding-left: 90px;">return 0;</pre>
<pre style="padding-left: 60px;">return ($a-&gt;count &lt; $b-&gt;count) ? 1 : -1;</pre>
<pre style="padding-left: 30px;">}</pre>
<p>Note que a função obrigatoriamente tem que retornar 0 se os valores forem iguais, 1 se o primeiro valor for maior ou -1 se o primeiro valor for menor. Simples não?  Podemos deixar ainda mais interessante o exemplo acima, caso o &#8216;count&#8217; seja igual, vamos deixar em ordem alfabética, usando a função de comparação <strong>strcmp:</strong></p>
<pre style="padding-left: 30px;">function função_de_ordenação($a,$b) {</pre>
<pre style="padding-left: 60px;">if ($a-&gt;count == $b-&gt;count)</pre>
<pre style="padding-left: 90px;">return strcmp($a-&gt;name, $b-&gt;name);</pre>
<pre style="padding-left: 60px;">return ($a-&gt;count &lt; $b-&gt;count) ? -1 : 1;</pre>
<pre style="padding-left: 30px;">}</pre>
<p>Simples não é? Então fica aí a dica do <strong>uasort</strong>. Você pode precisar dele quando menos esperar (e ele vai te livrar de uma dor de cabeça enorme <img src='http://cantuaria.net.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/wordpress-e-uasort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Página de Login Personalizada no WordPress</title>
		<link>http://cantuaria.net.br/blog/pagina-de-login-personalizada-no-wordpress/</link>
		<comments>http://cantuaria.net.br/blog/pagina-de-login-personalizada-no-wordpress/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 06:44:06 +0000</pubDate>
		<dc:creator>Cantuaria</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=111</guid>
		<description><![CDATA[Se você precisa criar uma página personalizada de login no WordPress saiba que essa tarefa não é complicada, confira meu guia e divirta-se!]]></description>
				<content:encoded><![CDATA[<p>Se você buscar por algum tutorial sobre como criar uma página de login personalizada para WordPress no Google, vai cair em diversos tutorias que ensinam de diversas formas, desde uma simples maquiagem na página original a até sua própria página de login.</p>
<p>Mas até então não havia encontrado nenhum realmente completo, com todas as reais funções de uma página de login. Até que precisei criar um para um tema de compras coletivas na qual fui contratado como freelancer e tiver que buscar informações na raça em vários sites. Por isso, vou facilitar a vida de vocês e demonstrar minha solução.</p>
<h3>O Template</h3>
<p>Primeiramente você irá querer criar um Page Template para sua página de login, no meu caso o arquivo se chama template-login.php , bem direto né? Para definir ele como um Page Template, basta adicionar os comentários de identificação no topo do arquivo:</p>
<blockquote><p>/**<br />
* Template Name: Page &#8211; Login<br />
*/</p></blockquote>
<p>Aqui você irá criar sua página de login com as devidas tags HTML que você precisar. Eu espero que você saiba como fazer isso, senão aprenda em <a href="http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates">outro lugar</a> antes.</p>
<h3> O Formulário</h3>
<p>Vamos criar o formulário, a parte mais &#8220;visível&#8221; de nossa página. O código é bem simples, basicamente você vai criar um formulário com dois campos (usuário e senha) e o botão de submit.</p>
<p>O primeiro diferencial do meu código ao dos outros tutoriais, é que no meu código o formulário de login aponta para a minha própria página de login, enquanto nos outros apontam para o wp-login.php do próprio site. Funciona, mas se o login falhar por algum motivo (como senha errada) o usuário acaba vendo o formulário padrão de login, que é o que estamos tentando evitar.</p>
<p>Alguns poucos tutoriais ainda citam o uso do hook <strong>wp_login_failed</strong>, que deveria redirecionar o usuário para outra página caso o login desse errado, mas nos meus testes e em buscas no fóruns, vi que o hook não funciona na maioria dos casos (não me pergunte o porquê!).</p>
<p>Então vamos lá, criando o nosso simples formulário:</p>
<pre>&lt;form method="post"&gt;</pre>
<pre style="padding-left: 30px;">&lt;input type="text" name="log" value="Usuário"/&gt;</pre>
<pre style="padding-left: 30px;">&lt;input type="password" name="pwd" value="" /&gt;</pre>
<pre style="padding-left: 30px;">&lt;input type="submit" value="Logar" /&gt;</pre>
<pre>&lt;/form&gt;</pre>
<h3>O Header</h3>
<p>A mágica acontecerá no header do nosso Page Template. É aqui que tentaremos logar o usuário. Por isso, é importante colocar o código abaixo antes de qualquer impressão e antes mesmo do <strong>get_header()</strong>, porque precisaremos definir valores de cookies.</p>
<p>Antes de executarmos a função, obviamente vamos querer ver se estamos recebendo um login e uma senha. Afinal, não há porque tentar fazer um login sem essas duas informações, não é mesmo? Para isso, usaremos comparações padrões de if. Note que usaremos a variável <strong>$message</strong> para guardamos possíveis mensagens de erro:</p>
<pre style="padding-left: 30px;">if ($_POST['log'] || $_POST['pwd']){</pre>
<pre style="padding-left: 60px;">if (!$_POST['log'])</pre>
<pre style="padding-left: 90px;">$message = 'Cadê seu nome de usuário tapado?';</pre>
<pre style="padding-left: 60px;">elseif (!$_POST['pwd'])</pre>
<pre style="padding-left: 90px;">$message = 'O campo senha não é opcional.';</pre>
<pre style="padding-left: 60px;">else {</pre>
<pre style="padding-left: 60px;">//1º Passo = Done!</pre>
<pre style="padding-left: 60px;">}</pre>
<pre style="padding-left: 30px;">}</pre>
<p>Simples até então, certo? Temos o usuário e a senha, agora vamos usar a própria função do WordPress de conferir usuário e senha, a <strong>wp_authenticate</strong>. Se o usuário e senha existirem, teremos a classe user com todos os dados daquele usuário, caso contrário receberemos uma mensagem de erro. Perceba que o próprio wp_authenticate faz o serviço sujo de anti-injections.</p>
<pre style="padding-left: 30px;">$user = wp_authenticate($_POST['log'],$_POST['pwd']);</pre>
<pre style="padding-left: 30px;">if ($user-&gt;ID&gt;0) {</pre>
<pre style="padding-left: 60px;">//2º Passo = Done!</pre>
<pre style="padding-left: 30px;">} else {</pre>
<pre style="padding-left: 60px;">$message = 'Tá errado! Não vai me dizer que esqueceu a p** da senha de novo?';</pre>
<pre style="padding-left: 30px;">}</pre>
<p>Se o usuário e senha existirem, ótimo, caso contrário informamos o usuário de que a senha ou usuário está errado. Agora vem uma parte importante, salvar a sessão do usuário. Para isso teremos que usar outra função, a <strong>wp_set_auth_cookie</strong> que precisa saber apenas o ID do usuário que terá a sessão salva.</p>
<pre style="padding-left: 30px;">wp_set_auth_cookie($user-&gt;ID);</pre>
<p>Finalmente, após salvar a seção, basta jogarmos o usuário para a página que quisermos, como a página inicial do site, por exemplo. Para isso, vamos usar a função <strong>wp_redirect</strong>, lembre-se sempre de usar o <strong>exit</strong> após ela.</p>
<pre style="padding-left: 30px;">wp_redirect( home_url() );</pre>
<pre style="padding-left: 30px;">exit;</pre>
<p>Pronto! Confere o resultado final:</p>
<pre>if ($_POST['log'] || $_POST['pwd']){</pre>
<pre style="padding-left: 30px;">if (!$_POST['log'])</pre>
<pre style="padding-left: 60px;">$message = 'Cadê seu nome de usuário tapado?';</pre>
<pre style="padding-left: 30px;">elseif (!$_POST['pwd'])</pre>
<pre style="padding-left: 60px;">$message = 'O campo senha não é opcional.';</pre>
<pre style="padding-left: 30px;">else {</pre>
<pre style="padding-left: 60px;">$user = wp_authenticate($_POST['log'],$_POST['pwd']);</pre>
<pre style="padding-left: 60px;">if ($user-&gt;ID&gt;0) {</pre>
<pre style="padding-left: 90px;">wp_set_auth_cookie($user-&gt;ID);</pre>
<pre style="padding-left: 90px;">wp_redirect( home_url() );</pre>
<pre style="padding-left: 90px;">exit;</pre>
<pre style="padding-left: 60px;">} else</pre>
<pre style="padding-left: 90px;">$message = 'Tá errado! Não vai me dizer que esqueceu a p** da senha de novo?';</pre>
<pre style="padding-left: 30px;">}</pre>
<pre>}</pre>
<h3>Deixando mais interessante</h3>
<p>O nosso formulário de login está pronto, basta criar uma página, definir o template dela com o que acabamos de criar e mudar os links de Logins do seu site para ela.</p>
<p>Mas ela é bem básica, não é mesmo? Você provavelmente irá querer fuçar nela de várias formas, por isso vai algumas dicas do que eu já fiz nas minhas:</p>
<ul>
<li><strong>Checkbox de &#8220;Lembrar-me&#8221;</strong> &#8211; Bem útil e simples, basta colocarmos um checkbox no fim do nosso formulário. Na nossa função de logar, verificamos se o checkbox está marcado, se sim, ao salvarmos a sessão usamos true como segundo argumento da função <strong>wp_set_auth_cookie, </strong>assim aumentamos a vida do cookie de 2 dias para 2 semanas.</li>
</ul>
<pre style="padding-left: 60px;">&lt;input name="rememberme" type="checkbox" value="forever" /&gt;Lembrar</pre>
<pre style="padding-left: 60px;"></pre>
<div style="padding-left: 60px;">
<pre>if ($_POST['rememberme']=="forever")</pre>
<pre style="padding-left: 30px;">wp_set_auth_cookie($user-&gt;ID,true);</pre>
<pre>else</pre>
<pre style="padding-left: 30px;">wp_set_auth_cookie($user-&gt;ID,false);</pre>
</div>
<ul>
<li><strong>Redirecionamento personalizado:</strong> No meu caso, o formulário poderia ser carregado em qualquer página. Nesse caso, após logar, voltar para a página inicial nem sempre faria sentido, por isso criei um campo escondido no formulário para salvar a atual URL e redirecionar para ela após logar. Note que salvo ela entre tentativas consecutivas de login. Na nossa função, basta usar o valor dela na hora de redirecionar, note também que no meu caso eu não quero nunca que o usuário volte para a página de login após logado, por isso, se houver <strong>login</strong> na URL do redirecionamento, eu mando ele pra página inicial.</li>
</ul>
<pre style="padding-left: 60px;">&lt;input type="hidden" name="redirect_to" value="&lt;?php echo $_SERVER['REQUEST_URI']; ?&gt;" /&gt;</pre>
<pre style="padding-left: 60px;"></pre>
<div style="padding-left: 60px;">
<pre>if (!strpos($_POST['redirect_to'], 'login')){</pre>
<pre style="padding-left: 30px;">wp_redirect( site_url($_POST['redirect_to']) );</pre>
<pre>} else</pre>
<pre style="padding-left: 30px;">wp_redirect( home_url() );</pre>
</div>
<ul>
<li><strong>Função de Deslogar:</strong> Podemos também criar a função para deslogar o usuário de forma simples. Antes da nossa função podemos verificar uma variável qualquer, como a action, caso ela seja logout, deslogamos o usuário. Assim, basta criarmos um link para a nossa página personalizada com um <strong>?action=logout</strong> na URL para deslogarmos o usuário.</li>
</ul>
<pre style="padding-left: 60px;">if ($_GET['action'] == 'logout') {</pre>
<pre style="padding-left: 90px;">wp_logout();</pre>
<pre style="padding-left: 90px;">$message = 'Vaza!';</pre>
<pre style="padding-left: 60px;">}</pre>
<pre style="padding-left: 60px;"></pre>
<pre style="padding-left: 60px;">&lt;a href="&lt;?php echo site_url('/login/?action=logout'); ?&gt;"&gt;Logar&lt;/a&gt;</pre>
<h3>Conclusão</h3>
<p>O formulário de login não foi tão difícil de criar, o mais difícil foi apenas descobrir essas funções do WordPress relacionadas ao login que, apesar de estarem documentadas, não estão relacionadas.</p>
<p>O código completo para o arquivo criado neste artigo você <a href="http://codepad.org/MaPgVoH6">confere aqui</a>. Note que eu não cheguei a testar, porque no meu projeto meu template está bem mais cheio de códigos, com jQuery, outras funções e etc. Mas deve funcionar <img src='http://cantuaria.net.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Usando técnica semelhante, também consegui criar páginas próprias para refazer a senha e registrar, tem alguns outros detalhes, mas isso fica pra outro post.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/pagina-de-login-personalizada-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Propriedade Step em Inputs no HTML5 e seus Limites</title>
		<link>http://cantuaria.net.br/blog/propriedade-step-em-inputs-no-html5-e-seus-limites/</link>
		<comments>http://cantuaria.net.br/blog/propriedade-step-em-inputs-no-html5-e-seus-limites/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 04:56:40 +0000</pubDate>
		<dc:creator>Cantuaria</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[formularios]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=96</guid>
		<description><![CDATA[O novo input de tipo number do HTML 5 é bem interessante mas possui uma regra específica de implementação do parâmetro step, confira os detalhes e evite dores de cabeça]]></description>
				<content:encoded><![CDATA[<p>Ah o HTML5, o futuro da linguagem básica da internet vem cheio de novidades que prometem melhorar, e muito, as funções básicas que um site pode ter.</p>
<p>Dentre as novidades temos uma muito interessante, que é o input type=&#8221;number&#8221;, atualmente quando queremos receber um valor do usuário, usamos apenas o input type=&#8221;text&#8221;. Se ele for um valor numérico cabe a nós fazer a validação através de código, muitas vezes em javascript.</p>
<p>O type=&#8221;number&#8221; vem para acabar com isso, o próprio navegador impedirá o usuário de digitar um número naquele campo. E não para por aí. O type number também possui três propriedades muito úteis:</p>
<ul>
<li>min: para definir um valor mínimo para o campo.</li>
<li>max: para definir um valor máximo para o campo.</li>
<li>step: para definir os incrementos de valor daquele campo.</li>
</ul>
<p>Essas propriedades podem receber qualquer valor numérico ou real. As duas primeiras propriedades acima são bem simples e funcionam perfeitamente, já a terceira pode causar alguma dor de cabeça pois não funciona tão simples como podemos supor.</p>
<p>Antes de mais nada, é importante citar que a propriedade step ainda só funciona no Chrome e no Opera, no Safari também funciona, mas apenas no Mac. Ainda assim é uma propriedade que devemos começar a usar nos casos em que se aplique.</p>
<p>Primeiro vamos mostrar como o step funciona (os exemplos abaixo só funcionarão em um dos navegadores citados acima, vale a pena usar um deles para ver como funciona). Digamos que temos uma página de venda de produtos e o usuário deve escolher a quantidade de peças que irá comprar. O mínimo de produto é 1 e o máximo 10, podendo comprar qualquer quantidade entre esses valores. Nesse caso basta definirmos os valores e o step em 1. Confira:</p>
<form onsubmit="javascript:return false;" style="text-align: center;"><input type="number" min="1" max="10" step="1"/><BR /><br />
<em>&lt;input type=&#8221;number&#8221; min=&#8221;1&#8243; max=&#8221;10&#8243; step=&#8221;1&#8243;&gt;</em></form>
<p style="text-align: left;">Simples e perfeito, não? Agora vamos supor que o produto seja daqueles de pacote, digamos 3 em 1. O mínimo possível para comprar é 3, o máximo 30 e só pode comprar pacotes de 3 em 3, ou seja, step = 3. Dê uma olhada:</p>
<form onsubmit="javascript:return false;" style="text-align: center;"><input type="number" min="3" max="30" step="3" /><input type="submit" value="enviar"><BR /><br />
<em>&lt;input type=&#8221;number&#8221; min=&#8221;3&#8243; max=&#8221;30&#8243; step=&#8221;3&#8243;&gt;</em></form>
<p style="text-align: left;">Caso não tenha testado, tente colocar manualmente o valor 5 acima, ou qualquer outro não múltiplo de 3 e aperte Enviar. Legal não? O step é uma propriedade muito interessante, mas devemos tomar cuidado com sua aplicação. Vamos a outro exemplo onde o uso do step não é recomendado.</p>
<p style="text-align: left;">Suponhamos que agora temos uma página de leilão onde o usuário precisa definir o valor de seu lance, mas queremos que o incremento mínimo seja de R$ 1,50. Muito simples, vamos criar o valor mínimo de R$ 5,00 (o valor atual do leilão) e o step em R$ 1,50. Vejamos:</p>
<form onsubmit="javascript:return false;" style="text-align: center;"><input type="number"  min="5" step="1.50" /><input type="submit" value="enviar"><BR /><br />
<em>&lt;input type=&#8221;number&#8221; min=&#8221;5&#8243; step=&#8221;1.50&#8243;&gt;</em></form>
<p style="text-align: left;">Funcionou perfeitamente? Beleza, mas digamos que o usuário queira dar um lance de R$ 2,00, como ele vai fazer? Experimente no box acima. A propriedade step não só define os incrementos automáticos dos botões do input, mas sim restringe os incrementos, mesmo manuais, feitos no input. É muito importante se lembrar disso para não implementar o step errado.</p>
<p style="text-align: left;">No final, o uso do step acaba deixando o input number bem semelhante ao input range, já que restringe os valores que o usuário pode definir. Não encontrei uma maneira de usar o step mas sem restringir, como a validação é feita pelo próprio navegador não sei nem mesmo algum código javascript para ignorá-lo.</p>
<p style="text-align: left;">Agora vem a parte crítica da propriedade step. O valor padrão do step é 1, ou seja, se em algum momento você já implementou um input number e não declarou o step, saiba que nos navegadores em que ele já foi implementado, esse input só está aceitando valores inteiros. Se você quiser desabilitar a propriedade step não basta apenas não declará-la, mas sim definir o valor &#8220;any&#8221; para ela. Note que os incrementos automáticos ainda serão de 1, mas o campo aceitará qualquer valor:</p>
<form onsubmit="javascript:return false;" style="text-align: center;"><input type="number" step="any" /><input type="submit" value="enviar"><BR /><br />
<em>&lt;input type=&#8221;number&#8221; step=&#8221;any&#8221;&gt;</em></form>
<p style="text-align: left;">Já vi muitos formulários aí pela web utilizado o input number mas sem se preocupar em declarar o valor any para o step, o input number ainda não foi implementado no Firefox e no Internet Explorer, mas devem estar presentes muito em breve, com o step também funcionando.</p>
<p style="text-align: left;">Vale lembrar que, o step funciona também no input de type range, date, datetime, month, time e week. Caso o usuário não esteja utilizando um navegador que suporte esses novos types de input, aparece para eles o velho e bom input text, por isso, nada de deixar de validar as entradas, tanto no back quanto no frontend.</p>
<p style="text-align: left;">Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/propriedade-step-em-inputs-no-html5-e-seus-limites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sharer do Facebook Pulando Regras de Rewrite</title>
		<link>http://cantuaria.net.br/blog/sharer-do-facebook-pulando-regras-de-rewrite/</link>
		<comments>http://cantuaria.net.br/blog/sharer-do-facebook-pulando-regras-de-rewrite/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 05:42:55 +0000</pubDate>
		<dc:creator>Cantuaria</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Bug Fixes]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=80</guid>
		<description><![CDATA[Problemas com o Sharer do Facebook não pegando os dados corretos de sua página com rewrite rules? A solução é simples, confira!]]></description>
				<content:encoded><![CDATA[<p>Fala galera,</p>
<p>Hoje encontrei a solução para um problema que estava já há muito me incomodando. Trata-se de um erro que ocorre quando você compartilha a URL de uma página que passa por regras de rewrite usando a hook <a href="http://codex.wordpress.org/Class_Reference/WP_Rewrite">generate_rewrite_rules</a> do WordPress.</p>
<h3>Para que serve?</h3>
<div id="attachment_85" class="wp-caption alignright" style="width: 160px"><img class="size-thumbnail wp-image-85" title="Casa" src="http://cantuaria.net.br/wp-content/uploads/2012/02/casa-150x150.jpg" alt="Casa" width="150" height="150" /><p class="wp-caption-text">Essa é a &quot;Casa 1&quot;... não minha, obviamente...</p></div>
<p>Para quem não tem conhecimento, usamos essa hook quando queremos criar URL amigáveis em casos especiais. Por exemplo, vamos dizer que você tenha um plugin para manter e organizar informações sobre residências. O plugin funciona usando apenas uma página do seu site, por exemplo, &#8220;Casas&#8221;, que fica na URL http://seusite.com/casas/.</p>
<p>Ao entrar na página Casas, o usuário verá uma lista com todas as casas cadastradas no plugin. Até aí tudo bem, quando o usuário clicar em uma das Casas ele irá para a página individual da casa, que também é controlada pelo plugin. Nesse caso a URL da página individual seria http://seusite.com/casas/?id=casa1 . A mesma página, mas com conteúdo diferente, já que a variável &#8220;id&#8221; está sendo passada e indica que o usuário quer ver mais informações da Casa 1.</p>
<p>Para deixar essa url mais amigável, usamos uma regra personalizada no WordPress através do hook anteriormente citado, a nova regra irá passar tudo que vier após /casas/ como uma variável de nome id usando o método GET. Ou seja, a URL será http://seusite.com/casas/casa1/ mas o WordPress irá interpretar como se fosse a página http://seusite.com/casas/?id=casa1.</p>
<p>Simples e bem útil, não é mesmo? Nesse caso pode até ser supérfluo, mas imagine por exemplo se ao invés de:</p>
<p style="padding-left: 30px;">http://seusite.com/casas/?id=casa1&amp;regiao=curitiba&amp;pais=brasil</p>
<p>Você tiver apenas:</p>
<p style="padding-left: 30px;">http://seusite.com/casas/brasil/curitiba/casa1</p>
<p>Bem melhor, não?</p>
<h3>O Problema e sua Solução</h3>
<p>Voltando ao problema, o que ocorre é que quando você vai compartilhar a URL http://seusite.com/casas/casa1/ no Facebook, ele reconhece o redirecionamento que passa a variável &#8220;id&#8221; e ao invés de pegar as informações como título, descrição e imagens, da página Casa 1, ele pega as informações da página Casas. E isso é muito impróprio. Afinal, ele estará considerando todas as páginas individuais de casa que você tiver, como a mesma página que  a página de listagem geral das casas.</p>
<div id="attachment_83" class="wp-caption alignright" style="width: 160px"><img class="size-thumbnail wp-image-83" title="Facebook" src="http://cantuaria.net.br/wp-content/uploads/2012/02/facebook-150x150.jpg" alt="Facebook" width="150" height="150" /><p class="wp-caption-text">Debugger do Facebook é uma mão na roda na hora de encontrar problemas nas meta tags de seu site.</p></div>
<p>Felizmente o Facebook oferece uma ferramenta de <a href="https://developers.facebook.com/tools/debug">debug</a> que mostra as informações que ele coleta de uma URL. Se você já está acostumado com as meta tags do Open Graph, já deve conhecer as tags &#8220;og:title&#8221;, &#8220;og:description&#8221; e &#8220;og:image&#8221;. Acontece que o Facebook também aceita uma outra tag, e até pede para que ela sempre seja informada, se trata da &#8220;og:url&#8221;.</p>
<p>Em um primeiro momento eu até pensei: &#8220;Qual o sentido dessa tag? Afinal ele pega esses dados de uma URL!&#8221;. Mas então resolvi fazer o teste, coloquei a tal tag no Header da página passando sempre a exata URL da página e&#8230; funcionou!</p>
<p>Não sei se o objetivo da tag &#8220;og:url&#8221; é exatamente esse, passar a URL de onde o Facebook deve extrair as demais tags, mas obviamente deve ser algo assim. Também não sei se esse bug de ignorar as regras do rewrite é intencional ou não. O Google Plus, por exemplo, funciona perfeitamente sem necessitar de qualquer adaptação. Enfim, sempre adicione a tag &#8220;og:url&#8221;, poderá te livrar de algumas dores de cabeça no futuro!</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/sharer-do-facebook-pulando-regras-de-rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erro is_rtl ao Atualizar o WordPress 3.3</title>
		<link>http://cantuaria.net.br/blog/erro-is_rtl-ao-atualizar-o-wordpress-3-3/</link>
		<comments>http://cantuaria.net.br/blog/erro-is_rtl-ao-atualizar-o-wordpress-3-3/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 04:17:04 +0000</pubDate>
		<dc:creator>Cantuaria</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Bug Fixes]]></category>

		<guid isPermaLink="false">http://cantuaria.net.br/?p=71</guid>
		<description><![CDATA[Atualizou o WordPress para o 3.3 e não consegue mais acessar o sistema? Calma, a solução pode estar aqui. Confira!]]></description>
				<content:encoded><![CDATA[<p>Alô amigos!</p>
<p>A nova versão do WordPress 3.3, a famosa Sonny, é maravilhosa, não é mesmo? Mas algumas pessoas estão enfrentando uma verdadeira dor de cabeça com a atualização. Após a atualização, o seguinte erro pode aparecer e bloquear o acesso à área de administração:</p>
<div id="attachment_89" class="wp-caption alignright" style="width: 160px"><a href="http://cantuaria.net.br/wp-content/uploads/2012/02/popupdomination1.png"><img class="size-thumbnail wp-image-89 " title="Popup Domination" src="http://cantuaria.net.br/wp-content/uploads/2012/02/popupdomination1-150x150.png" alt="Popup Domination" width="150" height="150" /></a><p class="wp-caption-text">I&#39;ll not teach you how to fix your site.</p></div>
<blockquote><p><em><strong>Fatal error: Call to undefined function is_rtl()</strong></em></p></blockquote>
<p>Há grandes chances desse erro estar ocorrendo por causa do plugin <a href="http://09185-mmveckrzbgtciktq3p0g.hop.clickbank.net/">Popup Domination</a>. Para resolver o problema, basta acessar seu FTP, ir até a pasta dos plugins (wp-content/plugins/) e renomear a pasta &#8220;popup-domination&#8221; para qualquer outra coisa. Isso desativará o plugin e você terá acesso novamente à área de administração.</p>
<p>Se ainda assim o erro persistir, então o problema é com algum outro plugin ou até com seu tema. Então renomeie a pasta &#8220;plugins&#8221; para qualquer outra coisa para desativar todos os plugins, se resolver, renomeie a pasta de volta para &#8220;plugins&#8221; e vá ativando plugin por plugin até encontrar o causador do erro.</p>
<p>Como corrige o erro com o Popup Domination? Ah, aí já é outra conversa, mas como o plugin é comercial, você provavelmente poderá contar com o suporte oficial do plugin.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://cantuaria.net.br/blog/erro-is_rtl-ao-atualizar-o-wordpress-3-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
