Evitando posts repetidos

Quando começamos a trabalhar com Múltiplos Loops, um detalhe importante, muito bem lembrado pelo David, é quanto aos posts repetidos. É possível que os diferentes Loops tenham algum post em comum e esse post acabe sendo duplicado em algum momento.

Para evitar que isso aconteça, existe uma solução simples, a instrução ‘continue‘ do php. Essa instrução pula a iteração atual dentro de uma estrutura de loop, no nosso caso o ‘while‘. Mas antes precisamos saber quais iterações devem ser puladas, portanto criamos um array para armazenar o ‘id’ dos posts que já foram apresentados e em seguida filtramos esses posts. Com isso teremos:

<?php $usados = array(); ?>
<?php $noticias = new WP_Query("category_name=noticias&showposts=3"); ?>
<?php while($noticias->have_posts()) : $noticias->the_post(); ?>
 <?php array_push($useds, $post->ID); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>
 
<?php $artigos = new WP_Query("category_name=artigosamp;showposts=3"); ?>
<?php while($artigos->have_posts()) : $artigos->the_post(); ?>
<?php if(in_array($post->ID, $usados)) continue; ?>
 <?php array_push($useds, $post->ID); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Explicando os trechos destacados: antes de tudo, criamos um array de nome $usados. No primeiro loop, a cada iteração, adicionamos o id do post da vez no array. E finalmente, nos loops consecutivos, verificamos se o post da vez já foi usado antes de carregar o seu conteúdo.

No bom programês, seria algo como:

<?php $usados = lista(); ?>
<?php $noticias = consulte_posts("quantidade_de_posts=3 e categoria_de_nome=noticias"); ?>
<?php enquanto(houverem_posts_em_noticias()) : carregue_o_post_da_vez(); ?>
 <?php adicionar_na_lista_dos_usados($id_do_post); ?>
trecho da interface a ser repetido...
<?php verifique_se_ainda_há_posts; ?>
 
<?php $artigos = consulte_posts("quantidade_de_posts=3 e categoria_de_nome=artigos"); ?>
<?php enquanto(houverem_posts_em_artigos()) : carregue_o_post_da_vez(); ?>
<?php se(na_lista_dos_usados_houver($id_do_post)) pular_iteração; ?>
 <?php adicionar_na_lista_dos_usados($id_do_post); ?>
trecho da interface a ser repetido...
<?php verifique_se_ainda_há_posts; ?>

Caso seu template tenha mais de dois loops, basta repetir a estrutura do segundo loop.

Qualquer dúvida é só avisar.

Tema: Painter

Da necessidade de personalização rápida de um tema e suas funcionalidades, surgiu a idéia do “Painter”. Um tema simples, com cores sólidas e poucas imagens, porém altamente customizável.

custom-colorsPersonalização

Destaco nele a possibilidade de personalização através da área administrativa, permitindo a escolha das cores de cada item do site além da imagem do cabeçalho. Conta com o farbtastic, um plugin em jquery para seleção de cores, presente na versão 2.7 do WordPress, dessa forma qualquer um pode alterar o tema, mesmo sem conhecimentos em html e css.

Devido a quantidade de campos editáveis, foi inserido um select com alguns esquemas de cores pré-definidos, mas isso não impede que as cores sejam alteradas uma por uma. E para aqueles que não dispensam um editor de imagens, os campos também podem ser preenchidos manualmente.

O tema já está pronto para utilização de widgets e para os plugins lead_manager, breadcrumb-xt e authimage.

Internacionalização

O idioma padrão do tema é inglês. Junto com o tema vão os arquivos de tradução (.po e .mo) para o português Brasileiro. Assim é possível traduzir o tema para outros idiomas também.

Agradecimentos

Muito obrigado ao Fabiano Rangel que deu uma geral no tema acabando com os tons de cinza e adicionando algumas imagens, além de criar os esquemas de cores pré-definidos que poupará o tempo de muitos. Agradeço também a paciência que o Fabiano teve para entender, testar e definir as cores para a criação do plugin, se não fosse por ele vocês teriam que se virar com nomes como: “Cor de fundo clara”, “Cor de frente escura”, “Cor de frente média”, etc…

Download

painter

Exemplos

painterpainter-redpainter-pastel

Adicionando bibliotecas javascript ao seu tema ou plugin

Normalmente quando se está desenvolvendo um tema ou um plugin você sente a necessidade de utilizar alguma biblioteca em javascript para facilitar a realização de determinada tarefa. A maneira mais fácil é sem dúvida utilizando a tag ‘<script>’ no corpo do seu arquivo. Agora imagine que todos os desenvolvedores que utilizam jquery resolvam adicionar as chamadas à biblioteca no corpo de seus plugins. Usuários que possuam vários plugins ativos provavelmente terão uma baita dor de cabeça mais cedo ou mais tarde quando esses plugins causarem algum conflito.

Como não podia deixar de ser, o WordPress já tem uma solução para os nossos problemas. Uma função chamada ‘wp_enqueue_scripts’ que é responsável por enfileirar e ordenar a chamada das bibliotecas, evitando assim a duplicação de arquivos e, possibilitanto, o carregamento das dependências antes.

A primeira coisa que você deve fazer é registrar a biblioteca para que o WordPress saiba que ela existe. Isso deve ser feito utilizando a seguinte função:

wp_register_script($handle, $src, $deps = array(), $ver = false)

O parâmetro obrigatório ‘$handle’ é o identificador único da biblioteca, o nome pelo qual o WordPress saberá quem é quem no conjunto de bibliotecas disponível. Em seguida vem o ‘$src’, que informa o endereço do arquivo, também obrigatório. Caso esse arquivo tenha alguma dependência, esta deve ser informadas em ‘$deps’ no formato de array, onde cada item do array é uma dependência a ser satisfeita. Essas dependências são informadas pelo ‘$handle’ das respectivas dependências. E por último (e menos importante) ‘$ver’ é a versão do script.

Não é possível registrar um script que já esteja registrado. Caso você tente, seu script será ignorado. Mas se for realmente necessário, você pode remover um script anterior para adicionar o seu. Isso pode acontecer quando você desenvolve para versões mais antigas do WP. Para remover um script utilize:

wp_deregister_script($handle)

Onde ‘$handle’ é o identificador do script que você deseja remover.

Depois de definidos, os scripts e suas dependências, você deve informar quais scripts devem ser carregados e onde eles serão carregados. Para a primeira questão, use:

wp_enqueue_script($handle, $src = false, $deps = array(), $ver = false)

Apesar de todos os parêmetros dessa função, o único obrigatório é o ‘$handle’ que informa qual o script será carregado. Os outros parâmetros são exatamente iguais aos parâmetros do wp_register_script e funcionam da mesma forma. A resposta pra isso é que se o script definido pelo $handle não estiver registrado o WordPress utiliza o atual.

Pronto! Agora só falta informar onde o script deve ser carregado. Nos temas, basta colocar a chamada ‘wp_queue_script’ no template onde a biblioteca será utilizada e o ‘wp_head’ faz o resto. Assim, se você pretende usar a biblioteca jquery nos resultados das buscas, adicione ao search.php a linha:

<?php wp_enqueue_script('jquery'); ?>

Já na área administrativa você precisa criar uma função que carregue o script e adiciona-la à ação ‘init’, por exemplo:

function load_scripts()
{
wp_enqueue_script('jquery');
}
  
add_action('init', 'load_scripts');

É isso… essa explicação também se aplica aos estilos você só precisa mudar as funções para ‘wp_register_style’, ‘wp_deregister_style’ e ‘wp_enqueue_style’ respectivamente. E para conferir os scripts e estilos que o WordPress carrega por padrão, confira o arquivo script-loader.php na pasta wp-includes.

Multiplos Loops

Para deixar seu blog com mais cara de site um dica é mudar o modelo de apresentação das notícias nas áreas principais. Ao invés da lista corrida dos últimos posts na home do blog, colunas organizam melhor as notícias além de permitir uma visão mais ampla do conteúdo, por exemplo, você pode dividir seu site em sessões e então listar na home as últimas notícias de cada sessão, deixando a disposição mais equilibrada. Dessa forma também é possível agrupar uma quantidade maior de posts evitando que os visitantes fiquem rolando o site ou procurando o conteúdo através da paginação.

O ‘WP_Query’ é a classe responsável pelos loops no WordPress, com ele podemos criar consultas no site que estarão amparadas por todas as funções presentes no Loop do WordPress facilitando todo o serviço de criação de novas colunas. A forma como ele funciona é semelhante ao ‘query_posts‘, inclusive os argumentos são os mesmos.

Aqui vai um exemplo:

<?php $noticias = new WP_Query("category_name=noticias&showposts=3"); ?>
<?php if($noticias->have_posts()) : ?>
<div class="noticias">
<?php while($noticias->have_posts()) : $noticias->the_post(); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>
</div>
<?php endif; ?>
 
<?php $artigos = new WP_Query("category_name=artigosamp;showposts=3"); ?>
<?php if($artigos->have_posts()) : ?>
<div class="artigos">
<?php while($artigos->have_posts()) : $artigos->the_post(); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>
</div>
<?php endif; ?>

Notem que utilizando o ‘WP_Query’, as funções ‘have_posts()’ e ‘the_post()’ devem ser precedidas pelo objeto instanciado. Como ‘$noticias’ e ‘$artigos’ do exemplo mostrado acima.

Nesse exemplo eu também adicionei a condicional if para mostrar como alterar a formatação dos posts das diferentes sessões. No programês:

<?php $noticias = consulte_posts("quantidade_de_posts=3 e categoria_de_nome=noticias"); ?>
<?php se(houverem_posts_em_noticias()) : ?>
<div class="noticias">
<?php enquanto(houverem_posts_em_noticias()) : carregue_o_post_da_vez(); ?>
trecho da interface a ser repetido…
<?php verifique_se_ainda_há_posts; ?>
</div>
<?php fim_das_noticias; ?>

O importante é que tenham em mente que as tags abertas entre o ‘if’ e o ‘while’ devem ser fechadas entre o ‘endwhile’ e o ‘endif’, ok.

Personalizando O Loop

Após entender como O Loop funciona, já podemos começar a brincar com o WordPress controlando o conteúdo a ser caregado ou filtrado. Mais uma vez o WordPress facilita a vida dos desenvolvedores disponibilizando a função query_posts().

Essa função permite criar parâmetros de consulta ou adicionar novos parâmetros aos passados via endereço do navegador, dessa forma você pode: excluir uma categoria da pesquisa; re-ordenar os posts; limitar a quantidade de resultados; entre outras coisas.

O funcionamento do query_posts é simples, apenas adicione a função ‘query_posts(‘args’)’ antes da função ‘have_posts()’ substituindo o args pelos argumentos desejados à sua consulta. Dessa forma o ‘have_posts()’ irá ignorar os parâmetros passados pelo endereço e fará uma consulta baseada nos dados informados. Por exemplo, se você quer listar três posts aleatórios da categoria ‘destaques’ o script seria assim:

<?php query_posts("&orderby=rand&showposts=3&category_name=destaques"); ?>
<?php while(have_posts()) : ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Note que cada atributo é separado pelo & assim como nos parâmetros passados via url. Dessa forma os desenvolvedores se sentem mais familiarizados com o código e não precisam ficar decorando a ordem dos atributos nem se preocupar em anular os que não serão usados.

Caso a sua intenção seja apenas filtrar os resultados de uma busca, adicione a variável ‘$query_string’ à sua função query_posts, dessa forma o WordPress mescla os seus argumentos com os argumentos da página. Essa variável é muito importante quando você pretende manter a navegabilidade, como é o caso dos resultados de uma pesquisa ou do conteúdo da página inicial do site. Para exemplificar, segue como seria o script para retirar uma categoria dos resultados de uma pesquisa:

<?php query_posts("{$query_string}&cat=-3"); ?>
<?php while(have_posts()) : ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Esse script deve ficar no arquivo search.php, então os posts encontrados na categoria 3 não aparecerão nos resultados das pesquisas e a paginação dos resultados continuará funcionando.