Criando páginas single para cada categoria (Single templates) no WordPress

Trabalhando com WordPress você tem um arquivo para cada página específica, por exemplo, o arquivo responsável pela página de categoria é o arquivo category.php, o arquivo responsável pela exibição do post em forma isolada é o arquivo single.php. Mas além dessas opções também podemos criar uma arquivo para a single de cada categoria, mas isso só é possível com trabalhando com três métodos diferentes: trabalhando com filtros , trabalhando com plugin ou trabalhando com condicional tags.

A primeira forma é adicionando um filtro(comando) dentro do functions.php que eu vou mostrar o trecho de código que trabalhamos logo abaixo :

add_filter('single_template', create_function('$t', 'foreach( (array) get_the_category() as $cat ) { if ( file_exists(TEMPLATEPATH . "/single-{$cat->term_id}.php") ) return TEMPLATEPATH . "/single-{$cat->term_id}.php"; } return $t;' ));

Explicando rapidamente esse bloco de código aplica um filtro, ele usar um for para acessar cada categoria ele pega o id e criar um template de uma página single, da seguinte forma single-[id-da-categoria].php, mas claro isso só será aplicado se o arquivo existir na pasta do tema.

A segunda forma é utilizando plugin que funciona da seguinte forma ele habilita a possibilidade de criar templates igual o esquema de page templates. Você baixa e instala o plugin aquela tradicional instalação ou pelo painel ou via ftp. Plugin instalado e ativado você irá criar um arquivo “qualquer_nome.php” no inicio do arquivo adicionamos a seguinte bloco de código :

 

Esse esquema diferente do primeiro não cria uma single pra cada categoria e sim um template de forma livre para qualquer tipo de post. O plugin de single post template você encontra aqui: http://wordpress.org/extend/plugins/single-post-template/

Outro plugin que tem um funcionamento similar é o Custom post template : http://wordpress.org/extend/plugins/custom-post-template/

A terceira forma é trabalhando com conditional tags(tags condicionais), são funções que funcionam como perguntas lógicas que retornam true ou false essas funções utilizamos juntos com um “if” para fazer o tratamento de uma determinada situação. Então visualizando esse panorama vamos fazer o tratamento da seguinte forma dentro do arquivo single.php adicionamos somente as conditional tags e para cada caso fazemos um include php para importar o php que desejamos. Vamos a um exemplo :

post;
   if ( in_category('3') ) {
     include(TEMPLATEPATH . '/single_para_categoria_3.php');
   } else {
     include(TEMPLATEPATH . '/single_para_outras_categorias.php');
   }
?>

O código acima é dessa forma sem mais, a historia vai ser resolvida nos arquivos single_para_categoria_3.php e single_para_outras_categorias.php é lá onde estarão o loop e toda a estrutura da página. A desvantagem de trabalhar dessa forma é que para cada categoria temos que fazer um tratamento, se caso for criada uma categoria nova tem que entrar no single.php e adicionar mais uma condicional.

Mais infos sobre conditional tags : http://codex.wordpress.org/Conditional_Tags

Atualizando:  Esse tipo de tratamento quebra a hierarquia de post_type uma solução seria modificar o nome do arquivo single-cat-[slug-categoria].php, por exemplo.

14 respostas para “Criando páginas single para cada categoria (Single templates) no WordPress”

  1. Bom dia Fellyph, a primeira forma, que é automática quando se cria novas categorias, no caso você deu o exemplo o reconhecimento da página pelo seu id, mas ela reconhece normalmente o slug da página? Como por exemplo, single-servicos.php.

  2. Fellyph, dei uma parada para analisar o código agora.

    O primeiro que é um function eu acho que pode ser feito dentro de single.php sem precisar gerar um processo a mais indo para o function para atuar como filtro, pois analisando a estratégia, é a mesma que eu estou adotando em um projeto (os dois geram as mesmas coisas), só que ao invés de utilizar o return da function eu dou um require TEMPLAT…, também na verdade não se cria uma página em nenhuma das duas. O fator legal dessa estratégia na function.php e a que eu fiz para mim é deixar o resultado mais dinâmico dentro de variáveis, sem precisar ter que colocar um if para cada categoria que existe, daí existindo ele chama o single para ela.

    O que acontece que utilizando o function como está ele não gera nada se caso não existir um modelo para aquela categoria, mas contendo ele o chama, então basta acrescentar um else e deixar um arquivo padrão, por exemplo, single-blog.php. Pois na verdade a função PHP file_exists é booleana e a função para se criar arquivo em php é outra.

    Resolvi comentar essas duas vezes porque procurando duas informações nessa semana na net eu encontrei o seu blog e o mesmo é bem legal.

  3. A primeira forma adiciona um filtro no template da single, toda chamada da single ele vai executar a função de verificar se existe um arquivo single-[slug-da-categoria].php

  4. Olá Rafael, a chamada do template sempre vai ocorrer. adicionar um filtro para a chamada do template e adicionar um if na single não vai mudar muito. Se vc observar o filtro ele recebe um $t esse é o template padrão se ele não entrar no if, continua retornando o template padrão então nem precisa do else. Mas vc precisa ter um single.php em seu tema.

  5. tenho um child tema do neon , ele tem um box grande em slide , abaixo mais 3 box pequeno um do lado do outro quero colocar um formulario de contato dentro de um desses 3 box , como faço ??

  6. Digníssimo, estou só querendo mudar o header do single.php, ou seja, queria que os post arquivados fossem exibidos com uma imagem diferente e até agora não encontrei nada. Tem como me ajudar?!

  7. Olá Marcos

    Você tem N opções para tratar isso, você pode na single.php no momento de chamar o header, usar get_header(“outro”); essa função iria carregar, por exemplo o arquivo: header-outro.php lá vc poderia dar um tratamento diferente para o header da single, problema neste caso que vc tinha que dar manutenção em dois arquivos.

    Outra solução seria usar a função body_class no seu e tratar essa imagem via css.

    Um terceira utilizar condicional tags dentro do header.php is_single()

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.