Fazendo melhor uso dos sticky posts
quinta-feira, 26/03/2009 às 14:15
Com a chegada do WordPress 2.7, a plataforma mostrou algumas boas novidades. Como todo mundo já deve saber disso, dispensarei grandes apresentações. Bem, dentre tais novidades, a que chamou bastante atenção foi a chamada sticky posts/posts fixos, que nada mais são do que posts que você pode manter fixos na página inicial e, principalmente, no topo do seu blog/site, se assim quiser. Ainda acho que a funcionalidade é muito básica, mas tais considerações eu deixo para um próximo texto. Por enquanto, a idéia é tentar detalhar um pouco as vantagens que a interessante novidade (não mais tão novidade, mas tudo bem) pode trazer para o seu site.
Fixando o post
Basta você criar um novo post ou editar um antigo e marcar a opção Fixar este post na página inicial no painel Publicar e pronto, seu post será o primeiro da lista. Caso deseje usar a funcionalidade para mais de um post, sem problemas. O WordPress jogará todos os posts marcados como sticky/fixo pro topo do seu site. Só atenção: a ordem dos posts respeitará a ordem que foi usada para marcá-los. O último post fixado vai ser sempre o primeiro da fila, independente da data dos outros. E que fique claro, os posts continuam na ordem cronológica. Se você desmarcar a opção de fixar o post, ele simplesmente não aparecerá mais no topo das postagens.
Estilizando o post
Como a Cátia já escreveu em seu texto sobre o post_class(), o WordPress agora cria, através dessa função, várias classes para o post. E claro, era de se esperar que uma classe sticky fosse atribuída caso o post estivesse marcado assim. A minha estrutura ficou assim:
<div id="destaques" class="post sticky hentry category-i">
Agora, é só declarar a classe sticky no seu arquivo CSS e estilizá-la como bem entender.
A tag condicional is_sticky()
Sendo redundante, a função is_sticky()
, se usada dentro do The Loop, vai retornar verdadeiro caso o post tenha sido marcado como sticky. É, simples assim.
<?php if (is_sticky()) echo Este é um sticky post; ?>
Caso você precise saber se tal post é um sticky, basta colocar a ID do post desejado como parâmetro da função:
<?php if (is_sticky(33)) echo Esse é um sticky post também; ?>
Ignorando sticky posts
Provavelmente você não vai querer que os posts fiquem fixos em todas as áreas do seu site, principalmente se você executa várias queries dentro do mesmo arquivo. Para ignorar os sticky posts e mantê-los na ordem cronológica, faça uso do parâmetro caller_get_posts=1
dentro da query:
<?php query_posts(caller_get_posts=1); ?>
Retirando ou mostrando apenas os sticky posts na query
Não há muito o que explicar. Caso você não queira que a sua query mostre os posts marcados como sticky, faça:
<?php $sticky = get_option(sticky_posts) ; ?> <?php query_posts(array(post__not_in => $sticky)); ?>
Agora, se a idéia e mostrar apenas aqueles posts marcados, use o parâmetro post__in
:
<?php $sticky = get_option(sticky_posts) ; ?> <?php query_posts(array(post__in => $sticky)); ?>
Mostrando apenas um sticky post no topo da página
Por padrão, o query_posts()
traz todos os posts fixados para o topo. Se você quiser apenas um desses posts no topo, isso pode ser feito da seguinte maneira:
<?php $sticky = get_option(sticky_posts); ?> <?php query_posts(p= . $sticky[0]); ?>
Essa query é perfeita para blogs que possuam espaço para um post destaque. Porém, ela traz o primeiro post marcado como sticky (é, o primeiro de todos), o que não me parece uma solução muito interessante. Para que a query retorne o último post fixado, apenas adicione a função array_reverse()
para que assim a primeira ocorrência seja, na verdade, o último sticky post.
<?php $sticky = get_option(sticky_posts); ?> <?php $sticky = array_reverse($sticky); ?> <?php query_posts(p= . $sticky[0]); ?>
E é isso. Resumidamente, estão aí todos (ou quase todos) os principais detalhes sobre sticky posts. É bem possível que este artigo não tenha mostrado nenhuma novidade perto de outros já escritos, mas ei, é mais uma referência. E sugestões, claro, são mais do que apreciadas.
por Beduino | |
27 de março de 2009 às 9:53
Belo tutorial muito interessante o recurso. Que venham outros!
por Marcus Piffer | |
4 de abril de 2009 às 9:53
Em qual arquivo eu coloco esse código?
por eduardo | |
6 de abril de 2009 às 12:33
Marcus, uma das idéias é você usa-lo no home.php.
por Beto | |
21 de abril de 2009 às 17:42
Show! O WP tem crescido muito, antes eu nao o suportava, hoje eu amo esse sistema !
Otima dica!
I love WP ! hehehee
por Natan | |
17 de maio de 2009 às 8:53
Interessante, boa função. Sou fâ do wordPress, sou fã também dessa imensa comunidade que se aglomera entorno deste todo poderoso WP que sempre ajuda e contribui para seu crescimento.
por Taís | |
2 de agosto de 2009 às 11:57
Hmmm como vocês fazem esse efeito de editor de código? é bem convincente 8D
por Cerberus | |
3 de agosto de 2009 às 21:27
Excelente tutorial muito bom mesmo, parabéns Eduardo pelo ótimo texto, claro e explicativo.
por Mateus Neves | |
5 de agosto de 2009 às 0:33
Ótima dica, e ótima funcionalidade. Aprendi hoje. Valeu.
por Walter Araujo dos Santos | |
15 de setembro de 2009 às 15:32
Olá Eduardo, primeiramente parabéns pelo excelente post, em segundo eu segui sua lógica em um trabalho onde preciso colocar na home.php dois loops um com apenas o ultimo post fixo entao usei a sequencia
1.
2.
3.
e logo apos no segundo loop onde eu preciso apresentar somente os outros posts que nao estao marcados como fixo utilizei
1.
2. $sticky)); ?>
mas nao está funcionando o post__not_in
por Eduardo Zulian | |
17 de setembro de 2009 às 17:32
Waler, acho que deu pau aí no seu comentário. Explica de novo!
por Bruno | |
15 de dezembro de 2009 às 10:18
Estou trabalhando em um guia de serviços em meu portal onde os posts serão as empresas e as categorias as atividades delas. Daí estou tentando usar o query_posts para colocá-las em ordem alfabética. Tenho alguns posts fixos que na index aparecem no topo. Porém nas categorias e na busca (search) não funciona. Aparecem pela data de postagem. Sabem o que pode ocorrer? (usei o mesmo query_posts)
por Waldir | |
18 de janeiro de 2010 às 15:47
Caros amigos
Estou começando agora com o WordPress e utilizo a versão 2.9.1. Trata-se de de uma ferramenta poderosa.
Só não estou sabendo utilizar um recurso que para mim seria uma mão na roda: como fixar um post na página inicial (sticky posts). Eu segui os passos do meu painel de controles, mas não funcionou.
Se puderem me ajudar, ficarei muito grato. E, se possível, pediria o favor de também me mandarem a resposta através do e-mail: rapidix@rapidix.com.br
Muito grato.
por Adi Barbosa | |
21 de janeiro de 2010 às 13:15
Foi muito útil as informações, obrigado e votos de sucesso!
por Bruno | |
1 de fevereiro de 2010 às 20:42
Estou trabalhando em um guia de serviços em meu portal onde os posts serão as empresas e as categorias as atividades delas. Daí estou tentando usar o query_posts para coloc��-las em ordem alfabética. Tenho alguns posts fixos que na index aparecem no topo. Porém nas categorias e na busca (search) não funciona. Os posts fixos aparecem pela ordem alfabética e não no topo. Sabem o que pode ocorrer?
por Lili | |
25 de fevereiro de 2010 às 17:40
Olá estou mexendo com o wordpress a pouco tempo, estou apanhando um pouco, mas com muita pesquisa e esforço estou aprendendo.
Sobre o Sticky, eu marquei apenas um post como fixo, mas não sei se é problema com o tema que eu escolhi pq esse post se repete.
Tipo logo abaixo do cabeçalho aparece o post fixo, em seguida o ultimo post publicado, logo após o post fixo aparece novamente e aí o restante dos posts.
Podem me ajudar por favor?
por Eduardo Zulian | |
26 de fevereiro de 2010 às 11:26
@Bruno
Você precisa usar o query_posts() dentro do seu search.php, da mesma forma. Não tem erro.
@Lili
Faz o teste com algum dos códigos aí em cima. Acho que vai funcionar direitinho.
por Bruno | |
3 de março de 2010 às 16:27
Eu consegui colocar a busca (search) em ordem alfabetica. Porém os posts fixos não aparecem no topo. Tem alguma maneira?!?
por Tiago Celestino | |
30 de março de 2010 às 22:19
E como seria para puxar dentro de um wp_query? Coloquei assim:
have_posts()) : ?>
porém retorna todos os posts das categorias. Usei o meta_highlight, mas mesmo assim não consegui. Alguém sabe como fazer?