Página Single com layout personalizado de acordo com a categoria do post – WordPress
Quando decido utilizar o WordPress como gerenciador de conteúdo de um projeto web que não possuí a estrutura similar a de um blog já sei que precisarei labutar atrás de uma ou duas soluções não convencionais ou até mesmo desenvolver algo. Eu sei disso, acontece sempre!
Foi em uma dessas listas de discussão que encontrei alguém precisando de ajuda para exibir um layout diferenciado. A questão é a seguinte, no projeto o cliente pediu um layout que muda de acordo com a categoria, nas páginas de categoria é fácil fazer isso, basta lembrar da hierarquia de arquivos do wordpress, o problema era com as páginas de post unico, quando o visitante acessa determinado texto o arquivo chamado é o single.php, o cliente queria identificar a qual categoria o post pertencia e exibir o layout correspondente.
A solução é simples, não precisei de mais que 15 segundos para pensar um algoritmo que resolveria, o problema na verdade é que eu não estava acostumado a chamar a categoria de um post fora do loop e neste caso eu precisava saber a categoria antes de montar o loop já que o design da página dependeria dela.
A idéia era detectar a categoria no inicio do arquivo single e com sitch case incluir o arquivo de layout correspondente, uma pesquisa aqui e ali e então saiu o seguinte código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php // Chamo a variavel global que me trás as informações do post acessado global $post; // Aqui eu pego o array com os dados da categoria do post $categoria_arr = get_the_category($post->ID); // Aqui eu pego o slug da primeira categoria do post $categoria = $categoria_arr[0]->slug; // inicio o swit que vai verificar a categoria e incluir o arquivo com leyout correspondente switch ($categoria) { case 'x': include_once TEMPLATEPATH . '/category-x.php'; break; case 'y': include_once TEMPLATEPATH . '/category-y.php'; break; case 'z': include_once TEMPLATEPATH . '/category-z.php'; break; // Se naõ for nenhuma das categorias com layout pré definido chamo o layout padrão default: include_once TEMPLATEPATH . '/singl.php'; } ?> |
Você pode utilizar a mesma lógica para outras coisas, algo que achei interessante neste aprendizado é a variavel global $post, com ela conseguimos obter as informações do post fora do loop, muito interessante.
Se você gostou deste post, escreva um comentário e/ou cadastre-se em nosso feed.
Comentários
Poxa léo…
Gostei da solução.
Se fosse soh para mudar a página inicial temos a sulução
q seria em configuração – escrita:
escolher uma página estática.
vc eh bom msm…
vlw man.
Poxa léo…
Gostei da solução.
Se fosse soh para mudar a página inicial temos a sulução
q seria em configuração – escrita:
escolher uma página estática.
vc eh bom msm…
vlw man.
Fábio, valeu! Com o amadurecimento do WordPress tem muita gente utilizando ele em portais e um dos detalhes visuais que alguns gostam de utilizar nestes casos é uma identidade visual levemente modificada para cada seção/ categoria. Para criar páginas de categorias especificas podemos criar um arquivo com o id ou slug da categoria, mas quando acessamos o post os arquivos chamados são o single… com essa função é possível modificar o layout do post de acordo com a categoria, achei bacana compartilhar a ajuda que dei para uma colega de lista de discussão.
Só tá faltando o ‘e’ em ‘/single.php’; fora isso tá show, muito bem feito !
Irei postar isso no TudoParaWordPress e te linkar, ok ?
Abraços !
a ideia e manera mesmo mais assim o codigo fica menor
ID);
// Aqui eu pego o slug da primeira categoria do post
$categoria = $categoria_arr[0]->slug;
$caminho=TEMPLATEPATH.$categoria;
if(file_exists($categoria)) {
require_once $caminho;
// e o none dos caminho servico e por ai e menos codigo
// da sua forma nao vai aparece um switch gigante por ai wordpress:0)
}
else {
// aqui uma pagina qualquer ou o template single comum
}
?>
tem um erro no codigo que eu postei antes
assim esta certo falha nossa ![]()
slug;
$caminho=TEMPLATEPATH.$categoria;
if(file_exists($caminho)) {
require_once $caminho;
// e o none dos caminho servico
// da sua forma nao vai aparece um switch gigante
}
else {
// aqui uma pagina qualquer ou o template single comum
}
?>
Olá, quero saber o seguinte estou fazendo um site de colunistas. Cada Colonista terá a sua categoria com seu nome.
Por exemplo: Criei a Categoria Pedro no qual o Pedro ira escrever nesta categoria.
Quero que dentro da pagina da Categoria Pedro, apareça seus últimos posts uma descrição sobre o Pedro. Para cada Colunista desta forma.
Como poderia fazer?
Eu não criaria uma categoria para cada autor, mas já que fez assim então cria uma página category-autor.php para cada categoria e nela você cria uma query (WP_query) para puxar os posts do autor da categoria. Da até para otimizar criando um unico arquivo, recuperando o nome da categoria acessada e utilizando ela como parametro para puxar os posts do autor e a descrição.
Para dados do autor do post (nome, descrição e etc…) veja o codex: http://codex.wordpress.org/Author_Templates
[...] solução foi proposta no blog do Leo Baiano. Vale a pena conferir o blog dele, lá é possível encontrar mais detalhes sobre está [...]
Eu tava usando o plugin Custom Post Templates http://wordpress.org/extend/plugins/custom-post-template/ nas minhas páginas, mas essa solução é bem mais interessante.
Boa esta perdunta do Mauricio, no caso de post em mais de uma categoria como fica a hierarquia?
Ando meio sem tempo para programação, alguém testou?
Testado e aprovado! O leo criou isso aí numa dúvida minha e funcionou 100%, pode ser visualizado em http://www.oqueeutenho.com.br
As categorias “Nutrição esportiva”, “Saúde esportiva”,”+Saúde”, “Mãe e bebê” e “Medicina esportiva” estão configuradas categoria e single para receber cada uma delas um layout próprio… As demais seguem o padrão do site.
A solução é ótima.
Se alguém tiver luz de como adaptar pra ele levar em conta sempre a categoria mãe? E, quem sabe, tendo mais de abrisse uma neutra.
Tenho dois times: Gremio e Inter. As notícias do Grêmio abrem azul, as do Inter em vermelho.
Dai se uma notícia tá marcado na categoria gremio e inter poderia abrir em verde, sei lá. rss
Dai Grêmio categoria mãe. Dai tem, futebol feminino, sub17 e veteranos (subcategorias). Tudo azul.
Mauricio, precisei fazer uma adaptação parecida em um projeto, ao invés de usar o primeiro indice do array (array[0]) você pode montar um foreach e dentro dele testar as categorias marcadas no post para ver quais são mães e registrar a cor. Para o caso da cor neutra é só definir, no case, que caso existam 2 categorias mães dentro do laço ele utiliza um terceira cor.
Com conhecimento PHP e o minimo de WP você pode adaptar o script acima para que fique de acordo com o que comentei e atenda perfeitamente sua necessidade.
Perdoe minha ignorância..
Mas onde eu coloco as categorias correspondentes aos layout que criei para cada uma?
Tem como citar um trecho com exemplo?
Obrigado!
Diego, não precisa você colocar as categorias em lugar algum, basta criar o arquivo com seu layout e nomear com o slug da categoria, exemplo, se quiser que a categoria ‘noticias’ fique com layout personalizado basta criar um arquivo com o nome ‘category-noticias.php’.
Cara sua ajuda me ajudou muito mesmo, muito obrigado, comecei a trabalhar com web designer a pouco tempo e já estou em uma empresa, então as vezes surgem desafios que para mim são um pouco grandes ainda, mas com a ajuda de pessoas como vc, eu outros vão conseguindo vencer…
Tudo bem,
Preciso de uma ajuda! Estou criando um tema onde vou trabalhar com duas categorias, ex:
Categoria 01: sub1, sub2, sub3
Categoria 02: sub1, sub2, sub3
Os posts inseridos na categoria 01 aparecerão na index.php, os posts cadastrados na catagoria 02 não devem aparecer na index, e sim em outra página (single)…o código mostrado acima faz isso? se sim, onde insiro esse código?
Att,
Thiano
Thiano, o código mostrado acima não faz o que você quer, ele permite que você mostre a página single com layout personalizado conforme a categoria do post que esta sendo visualizado pelo visitante. Fazer o que você deseja é relativamente simples, basta utilizar query_posts() na home, pesquise pelos parametros do query_posts que vai resolver seu problema.

Oie Leo,
Realmente ficou ótimo e o principal de tudo é que o cliente final ADOROU!!!!!
Mais uma vez obrigada..