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

Esse post originalmente era de 2011, dei uma atualizada no conteúdo com alguns novos recursos e correções. Trabalhando com WordPress você tem um arquivo para cada situação específica, por exemplo, o arquivo responsável pela página de categoria é o arquivo category.php, ou page.php para uma página, ou 404.php quando o conteúdo não for encontrado, assim como para página single.

Como funciona a estrutura de páginas singulares

Quando tratamos de post o arquivo mais específico é o single.php, porque o mais específico? Caso o single.php não exista o index.php será responsável por exibir o conteúdo da página single ou o mais novo arquivo de template singular.php ele foi introduzido na versão 4.3 do WordPress para exibir o conteúdo de um post ou uma página. A imagem abaixo representa a ordem de carregamento:

Mas além dessas opções também podemos criar um arquivo para a página singular 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.

Como adicionar código no WordPress?

Primeiramente, se iremos realizar uma alteração em produção precisamos realizar um backup da nossa aplicação. Especialmente se você não está familiarizado com código.

A opção mais simples é alterando o código do functions.php esse processo é válido quando você possui um tema que não tem atualizações constantes. Caso contrário um tema filho ou um plugin será a melhor opção, porque as suas alterações não serão afetadas caso o tema principal seja atualizado.

Carregando diferentes templates com add_filter

A primeira forma é adicionando um filtro para isso devemos adicioná-lo dentro do functions.php, o código ficará da seguinte forma:

add_filter('single_template', 'create_single_template'); function create_single_template( $template ) { global $post; $categories = get_the_category(); // caso não tenhamos categoria retornamos o template default. if ( ! $categories ) return $template; //resgatando o post type $post_type = get_post_type( $post->ID ); $templates = array(); foreach ( $categories as $category ) { // adicionando templates por id e slug $templates[] = "single-{$post_type}-{$category->slug}.php"; $templates[] = "single-{$post_type}-{$category->term_id}.php"; } // adicionando os templates padrões $templates[] = "single-{$post_type}.php"; $templates[] = 'single.php'; $templates[] = 'singular.php'; $templates[] = 'index.php'; return locate_template( $templates ); }
Code language: PHP (php)

Explicando código acima, aplicamos um filtro quando o WordPress chama o template para exibir um post, esse código é maior que a versão anterior desse post(2011), por duas razões continuamos retornando um comportamento padrão e segundo realizamos um tratamento para não sobrescrever a página singular de um post type.

Exemplo, caso tenhamos uma categoria filme e um post type filme não termos conflito, pois a página única da categoria ‘filmes’ será single-post-filmes.php e a single do post type ‘filmes’ será single-filmes.php.

Carregando diferentes templates single com Plugin

Alterar functions.php de forma errada pode afetar o funcionamento do todo o seu tema, para evitar problemas caso não domine muito programação a segunda forma é utilizando plugin, ainda sim, você precisará de noções de programação para criar o novo template a diferença que qualquer erro afetará somente a página singular que você estará criando.

Temos várias opções de plugins os passos serão bem parecidos, vou listar o plugin com atualizações mais recentes o Custom Post Template By Templatic:

  1. Baixe o plugin e instale o plugin na sua aplicação.
  2. Ative o plugin
  3. Crie um novo template para sua página singular com um comentário no início do seu arquivo:
<?php /* PostType Page Template: [Nome para descrever seu template] Description: [Essa parte é opcional] */ ?>
Code language: HTML, XML (xml)

Esse comportamento é bem parecido como template pages, nesse caso o nome do arquivo é irrelevante pode ser qualquer um. Feito isso se tudo ocorrer bem um dropdown irá aparecer na sua página de edição de posts para selecionar o template desejado.

plugin de templates para páginas singulares

Trabalhando com tags condicionais

A terceira forma é trabalhando com tags condicionais, elas são funções que funcionam como perguntas lógicas que retornam true ou false, para nossa solução iremos trabalhar com in_category(), para o nosso código não ficar extenso podemos dentro do nosso loop utilizar get_template_part como no exemplo abaixo:

// dentro do loop if ( in_category( 'filmes' ) ) { get_template_part( 'template-parts/content', 'filmes' ); } else { get_template_part( 'template-parts/content', 'post' ); }
Code language: JavaScript (javascript)

O código acima inserimos dentro do nosso single.php não criamos um template novo para toda a nossa página singular e sim um pequeno bloco que será incluído pela função get_template_part, caso o post seja da categoria “filmes” ele ira buscar na pasta template-parts o arquivo “content-filmes.php” nele você irá realizar a personalização que você deseja, caso contrário carregamos o arquivo content-post.php um trecho genérico para outras categorias.

Mais informações sobre conditional tags: http://codex.wordpress.org/Conditional_Tags

Mais artigos relacionados

Videos sobre WordPress em meu canal

Confira também os vídeos sobre WordPress no meu canal, lá eu tenho uma playlist dedicada a WordPress, com dicas relacionadas a SEO, performance e desenvolvimento de blocos gutenberg.

Qualquer dúvida só deixar um comentário para mais tutoriais sobre WordPress acesse a página da categoria. Até o próximo post pessoal!

Por Fellyph Cintra

Fellyph Cintra é um Google Developer Expert focado em tecnologias web, com participação ativa na comunidade WordPress. Com mais de 14 anos de experiência no mercado, Fellyph já palestrou em mais de 30 eventos ao redor do Brasil e Europa, sempre abordando as boas práticas de desenvolvimento na web.

20 comentários

  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.

    1. 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

  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.

    1. 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.

  3. 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 ??

  4. 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?!

    1. 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()

    1. Para fazer com PHP vc pode utilizar varios caminhos, adicionar o conteúdo após o loop da seu arquivo single.php ou adicionar um hook no functions.php para chamar uma funcao toda vez que o the content da sua página single ele imprime um conteúdo. Sem php vc pode criar um bloco gutenberg com um conteúdo pre-cadastrado.

  5. Acrescentei o código no “functions.php” e criei o template “single-releases.php” para exibir os posts de forma diferente do single.php.
    Já havia criado a categoria “Releases” com o slug : “releases”, mas não funcionou. O post da Categoria “releases” continua sendo exibida pelo “single.php”. Como resolver?

  6. Olá, tudo bem?
    É possível criar singles diferentes para o tema edumall, com tutor lms.
    Preciso criar duas singles para duas categorias diferentes, mas não consigo com o seu exemplo.

  7. Excelente! Três métodos funcionais explicados rapidamente de forma precisa e clara. 30 segundos de leitura e tava resolvido. É bom que alguém não tenha se rendido à essas porcarias de vídeos de 15 minutos pra fazer uma tarefa simples.
    Coloque algum banner e eu clicarei com prazer.

Deixe um comentário

O seu endereço de e-mail não será publicado.