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.

Quando tratamos de post o arquivo mais específico é o single.php, por que o mais específico? Caso o single.php não exista o index.php será responsável por exibir o conteúdo da 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 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.

Carregando diferentes templates com add_filter

A primeira forma é adicionando um filtro para isso devemos adicionar-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 );
}

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 uma comportamento padrão e segundo realizamos um tratamento para não sobrescrever a single de um post type, exemplo, caso tenhamos uma categoria filme e um post type filme não termos conflito pois a single da categoria ‘filmes’ será single-post-filmes.php e a single do post type ‘filmes’ será single-filmes.php.

Carregando diferentes templates 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 single 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 em sua aplicação.
  2. Ative o plugin
  3. Crie um novo template para sua página single com um comentário no início do seu arquivo:
<?php
/*
PostType Page Template: [Nome para descrever seu template]
Description: [Essa parte é opcional]
*/
?>

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.

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 de 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' );
}

O código acima inserimos dentro de nosso single.php não criamos um template novo para toda nossa single 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 dentro da pasta template-parts o arquivo “content-filmes.php” nele você irá realizar a customização que você deseja, caso contrário carregamos o arquivo content-post.php um trecho genérico para outras categorias.

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

Até o próximo post pessoal!

Participe da discussão

14 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()

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *