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:
- Baixe o plugin e instale o plugin em sua aplicação.
- Ative o plugin
- 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!