Hierarquia de Templates WordPress: O Guia Técnico Completo
A Hierarquia de Templates do WordPress é o sistema de resolução determinístico que o WordPress usa para selecionar qual arquivo de template PHP renderiza uma determinada solicitação de página. Quando um visitante carrega qualquer URL no seu site, o WordPress avalia o contexto da consulta — tipo de post, taxonomia, slug, ID e mais — e percorre uma lista priorizada de nomes de arquivos candidatos até encontrar uma correspondência no diretório do tema ativo. Se nenhum template específico existir, ele recorre a index.php.
Compreender este sistema em profundidade não é opcional para o desenvolvimento sério em WordPress. É a base de cada layout personalizado, cada substituição de tema e cada otimização de desempenho envolvendo cache de templates. Seja você executando uma publicação com muito conteúdo, uma loja WooCommerce ou uma configuração WordPress headless, a hierarquia governa qual PHP é executado em cada carregamento de página.
O Que é Realmente a Hierarquia de Templates
Em sua essência, a Hierarquia de Templates é uma cadeia de pesquisa incorporada no núcleo do WordPress (wp-includes/class-wp-query.php e wp-includes/template.php). Quando o WordPress termina de analisar a solicitação e preencher o objeto global $wp_query, ele chama equivalentes de get_template_part() internamente para resolver o template correto. A resolução não é aleatória — é uma lista estrita e ordenada de nomes de arquivos verificados no diretório raiz do seu tema.
O principal insight arquitetônico que a maioria dos tutoriais perde: o WordPress não escaneia o diretório do seu tema. Ele constrói um array priorizado de nomes de arquivos candidatos com base nas variáveis de consulta e, em seguida, verifica cada arquivo usando locate_template(). Essa distinção importa quando você está depurando templates ausentes ou construindo geradores de temas programáticos.
A cadeia de fallback sempre termina em index.php. Este arquivo é o único arquivo de template que o WordPress exige que todo tema inclua, de acordo com os padrões de desenvolvimento de temas.
Arquivos de Template Principais Que Todo Tema Deve Compreender
| Arquivo de Template | Acionado Quando | Fallback Para |
|---|---|---|
front-page.php | A página inicial estática está definida em Configurações > Leitura | home.php |
home.php | Página de índice de posts do blog | index.php |
single-{post-type}.php | Post único de um tipo de post personalizado específico | single.php |
single.php | Qualquer post único (tipo de post padrão) | singular.php |
singular.php | Qualquer post ou página única (catch-all genérico) | index.php |
page-{slug}.php | Uma página específica por slug | page-{ID}.php |
page-{ID}.php | Uma página específica por ID do banco de dados | page.php |
page.php | Qualquer página estática | singular.php |
category-{slug}.php | Arquivo de categoria por slug | category-{ID}.php |
category-{ID}.php | Arquivo de categoria por ID do termo | category.php |
category.php | Qualquer arquivo de categoria | archive.php |
tag-{slug}.php | Arquivo de tag por slug | tag-{ID}.php |
tag.php | Qualquer arquivo de tag | archive.php |
taxonomy-{tax}-{term}.php | Taxonomia personalizada, termo específico | taxonomy-{tax}.php |
taxonomy-{tax}.php | Taxonomia personalizada, qualquer termo | taxonomy.php |
taxonomy.php | Qualquer arquivo de taxonomia personalizada | archive.php |
author-{nicename}.php | Arquivo de autor por nicename do utilizador | author-{ID}.php |
author-{ID}.php | Arquivo de autor por ID do utilizador | author.php |
author.php | Qualquer arquivo de autor | archive.php |
archive-{post-type}.php | Arquivo de tipo de post personalizado | archive.php |
archive.php | Qualquer arquivo (data, autor, taxonomia) | index.php |
date.php | Arquivo baseado em data | archive.php |
search.php | Página de resultados de pesquisa | index.php |
404.php | Nenhum conteúdo correspondente encontrado | index.php |
attachment.php | Página de anexo único | single.php |
embed.php | Frame oEmbed para um post | index.php |
index.php | Fallback universal | — |
Observe a entrada singular.php — este é um template que muitos desenvolvedores ignoram completamente. Introduzido no WordPress 4.3, ele fica entre single.php/page.php e index.php na hierarquia, atuando como um catch-all unificado para qualquer visualização de conteúdo singular. Se o seu tema incluir singular.php, ele capturará casos onde nem single.php nem page.php existem.
A Ordem Completa de Resolução de Templates por Tipo de Página
Posts Únicos do Blog
Quando um visitante solicita um post padrão (post_type = 'post'), o WordPress verifica nesta ordem exata:
single.phpsingular.phpindex.php
single-post-{slug}.php (WordPress 4.4+, ex., single-post-hello-world.php)
single-post.phpA variante baseada em slug no passo 1 raramente é documentada, mas é extremamente útil para dar a um único post principal um layout completamente único sem tocar em nenhum outro template.
Tipos de Posts Personalizados
Para um tipo de post personalizado registado como portfolio:
single-portfolio-{slug}.phpsingle-portfolio.phpsingle.phpsingular.phpindex.php
Para o seu arquivo (requer 'has_archive' => true em register_post_type()):
archive-portfolio.phparchive.phpindex.php
Um erro comum: registar um tipo de post personalizado com 'has_archive' => false (o padrão) e depois perguntar por que archive-portfolio.php nunca carrega. A URL do arquivo simplesmente retorna um 404 nesse caso.
Páginas Estáticas
- Arquivo de template definido via caixa de meta Atributos de Página (template de página personalizado)
page-{slug}.phppage-{ID}.phppage.phpsingular.phpindex.php
Templates de página personalizados são arquivos PHP no diretório do seu tema que incluem um comentário de cabeçalho de arquivo:
<?php
/**
* Template Name: Full Width Layout
* Template Post Type: page
*/A declaração Template Post Type (WordPress 4.7+) restringe quais tipos de posts podem usar este template no editor. Sem ela, o template aparece no menu suspenso de Atributos de Página apenas para páginas.
Arquivos de Categoria
category-{slug}.phpcategory-{ID}.phpcategory.phparchive.phpindex.php
Arquivos de Taxonomia Personalizada
Para uma taxonomia registada como genre com um slug de termo thriller:
taxonomy-genre-thriller.phptaxonomy-genre.phptaxonomy.phparchive.phpindex.php
Arquivos de Autor
author-{user_nicename}.phpauthor-{user_ID}.phpauthor.phparchive.phpindex.php
A Página Inicial (Caso Crítico)
Esta é a parte mais incompreendida da hierarquia. O WordPress distingue entre dois cenários de página inicial:
Cenário A — Índice de posts do blog como página inicial (Configurações > Leitura: "Seus posts mais recentes"):
front-page.phphome.phpindex.php
Cenário B — Página estática como página inicial (Configurações > Leitura: "Uma página estática"):
front-page.php
page.php (se não existir front-page.php)
index.phpO detalhe crítico: front-page.php tem precedência em ambos os cenários. Se front-page.php existir no seu tema, ele sempre renderiza a página inicial independentemente das configurações de Leitura. Isso surpreende muitos desenvolvedores que criam front-page.php para uma página inicial estática, mas esquecem que ele também substituirá o índice do blog se eles alterarem a configuração posteriormente.
Resultados de Pesquisa e 404
Resultados de pesquisa:
search.phpindex.php
Páginas de erro 404:
404.phpindex.php
Um 404.php bem elaborado é um ativo de conversão, não uma reflexão tardia. Deve incluir um formulário de pesquisa, links para conteúdo popular e navegação clara — tudo o que requer compreensão do sistema de templates para implementar corretamente.
Como o WordPress Resolve Templates Internamente
Compreender a mecânica interna ajuda ao depurar ou estender o sistema. O processo de resolução em wp-includes/template.php funciona da seguinte forma:
// Simplified representation of WordPress template resolution
function get_query_template( $type, $templates = array() ) {
$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
if ( empty( $templates ) ) {
$templates = array( "{$type}.php" );
}
// Fires before template resolution — allows plugins/themes to modify the list
$templates = apply_filters( "_{$type}_template_hierarchy", $templates );
$template = locate_template( $templates );
// Fires after template is located — allows final override
$template = apply_filters( "{$type}_template", $template, $type, $templates );
return $template;
}Dois hooks de filtro são críticos aqui:
_{$type}_template_hierarchy — dispara antes da pesquisa de arquivo, permitindo que você injete candidatos adicionais no array
{$type}_template — dispara depois que o arquivo é localizado, permitindo que você substitua o caminho do template resolvido completamente
Esses hooks são como plugins de page builder, redes multisite e WooCommerce substituem templates sem tocar nos arquivos do tema.
Substituindo Programaticamente a Hierarquia de Templates
Injetando um Caminho de Template Personalizado
add_filter( 'single_template_hierarchy', function( $templates ) {
// Prepend a plugin-directory template before theme templates are checked
if ( is_singular( 'portfolio' ) ) {
array_unshift( $templates, plugin_dir_path( __FILE__ ) . 'templates/single-portfolio.php' );
}
return $templates;
} );
Substituindo um Template Após a Resolução
add_filter( 'template_include', function( $template ) {
if ( is_singular( 'portfolio' ) && current_user_can( 'edit_posts' ) ) {
// Load a debug template for editors
$debug_template = get_stylesheet_directory() . '/debug/single-portfolio-debug.php';
if ( file_exists( $debug_template ) ) {
return $debug_template;
}
}
return $template;
} );
O filtro template_include é o último hook antes do WordPress carregar o arquivo de template. Ele recebe o caminho totalmente resolvido e deve retornar um caminho de arquivo válido.
Partes de Template e a Função get_template_part()
As partes de template são fragmentos PHP reutilizáveis carregados via get_template_part(). Elas seguem sua própria mini-hierarquia:
// Loads content-video.php if it exists, falls back to content.php
get_template_part( 'template-parts/content', 'video' );
O WordPress 5.5 adicionou um terceiro parâmetro para passar dados para partes de template:
get_template_part( 'template-parts/card', 'product', array(
'post_id' => get_the_ID(),
'show_price' => true,
) );
Dentro da parte de template, recupere esses dados com:
$args = wp_parse_args( $args, array(
'post_id' => 0,
'show_price' => false,
) );
Isso elimina a necessidade de usar variáveis globais para passar dados entre templates — uma melhoria significativa para manutenibilidade e testabilidade.
Temas Filhos e o Sistema de Substituição de Templates
Os temas filhos estendem a hierarquia ao adicionar o diretório do tema filho ao início do caminho de pesquisa de templates. Quando locate_template() é executado, ele verifica:
Diretório do tema filho (get_stylesheet_directory())
Diretório do tema pai (get_template_directory())
Isso significa que você pode substituir qualquer template do tema pai criando um arquivo com o nome idêntico no seu tema filho. Você não precisa copiar o arquivo inteiro — apenas as partes que deseja alterar — mas o WordPress carrega o arquivo como uma unidade completa, portanto você deve incluir toda a marcação necessária.
Erro comum em temas filhos: Copiar functions.php do tema pai para o tema filho e esperar que ele substitua as funções do pai. Ao contrário de outros arquivos de template, functions.php em um tema filho é carregado além do functions.php do pai, não em vez dele. Ambos os arquivos são executados.
Para criar uma estrutura mínima de tema filho:
my-child-theme/
├── style.css (required — contains theme header comment)
├── functions.php (optional — enqueue parent styles here)
└── single-post.php (overrides parent's single-post.php)
O cabeçalho style.css deve declarar o pai:
/*
Theme Name: My Child Theme
Template: parent-theme-directory-name
*/
Depurando Qual Template Está Ativo
Método 1: Plugin Query Monitor
O plugin Query Monitor (gratuito, WordPress.org) exibe o arquivo de template resolvido e a hierarquia completa de candidatos no painel da barra de ferramentas do administrador. Esta é a ferramenta de depuração mais confiável disponível e adiciona sobrecarga negligenciável.
Método 2: O Hook template_include
add_filter( 'template_include', function( $template ) {
if ( current_user_can( 'manage_options' ) ) {
echo '<!-- Template: ' . esc_html( str_replace( ABSPATH, '', $template ) ) . ' -->';
}
return $template;
} );
Isso exibe o caminho do template como um comentário HTML visível apenas para administradores. Remova-o antes de implantar em produção.
Método 3: WP_DEBUG e Registro
Em um servidor de desenvolvimento, ative o registro de depuração em wp-config.php:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
Em seguida, adicione registro temporário dentro de template_include:
add_filter( 'template_include', function( $template ) {
error_log( 'Resolved template: ' . $template );
return $template;
} );
Em um ambiente de VPS Hosting com acesso root, você pode monitorar o log de depuração em tempo real:
tail -f /var/www/html/wp-content/debug.log
Esta abordagem é muito mais confiável do que depender de ferramentas de depuração baseadas em navegador ao solucionar problemas de resolução de templates em um servidor ativo ou de staging.
WooCommerce e o Sistema de Substituição de Templates
O WooCommerce vem com sua própria hierarquia de templates que fica sobre o sistema nativo do WordPress. Os templates do WooCommerce ficam em wp-content/plugins/woocommerce/templates/ e são carregados via sua própria função wc_get_template(), que verifica substituições em:
wp-content/themes/your-theme/woocommerce/wp-content/themes/your-child-theme/woocommerce/Para substituir o template de produto único do WooCommerce, copie woocommerce/templates/single-product.php para your-theme/woocommerce/single-product.php. Nunca edite os arquivos de template do plugin diretamente — eles são sobrescritos em cada atualização do plugin.
O WooCommerce também se conecta aos hooks de ação woocommerce_template_single_*, o que lhe dá controle granular sobre seções individuais (preço, abas, botão adicionar ao carrinho) sem substituir arquivos de template inteiros. Esta é a abordagem preferida para modificações menores.
Temas de Blocos e a Hierarquia de Templates na Edição Completa do Site
O WordPress 5.9 introduziu a Edição Completa do Site (FSE) com temas de blocos, o que muda como a hierarquia de templates funciona na prática. Os temas de blocos armazenam templates como arquivos HTML em um diretório templates/ em vez de arquivos PHP:
my-block-theme/
├── templates/
│ ├── index.html
│ ├── single.html
│ ├── page.html
│ ├── archive.html
│ └── 404.html
├── parts/
│ ├── header.html
│ └── footer.html
└── theme.jsonA lógica de resolução segue as mesmas regras de hierarquia, mas o WordPress agora também verifica o banco de dados para templates personalizados pelo utilizador salvos via o Editor do Site. A ordem de pesquisa torna-se:
- Template salvo pelo utilizador no banco de dados (tipo de post
wp_template) - Arquivo HTML do diretório
templates/do tema - Arquivo HTML do diretório
templates/do tema pai - Templates de fallback integrados do WordPress
Temas PHP clássicos e temas de blocos podem coexistir em uma instalação WordPress, mas você não pode misturar templates PHP e templates de blocos HTML dentro de um único tema. Se o seu tema tiver um diretório templates/ e um theme.json válido, o WordPress o trata como um tema de blocos.
Para equipes que executam cargas de trabalho críticas de desempenho em Servidores Dedicados, compreender essa distinção é essencial ao avaliar frameworks de temas — os temas de blocos transferem a renderização de templates para o analisador de blocos, que tem características de cache diferentes da execução de templates PHP.
Implicações de Desempenho da Hierarquia de Templates
Cada resolução de template envolve verificações do sistema de arquivos via locate_template(). Em um site com muito tráfego, isso pode adicionar sobrecarga mensurável se não for armazenado em cache. Principais otimizações:
Cache de objetos: Use um cache de objetos persistente (Redis ou Memcached) para armazenar em cache os resultados de WP_Query e reduzir o número de consultas ao banco de dados que alimentam a seleção de templates.
OPcache: Certifique-se de que o PHP OPcache está ativado e configurado corretamente. Como os templates são arquivos PHP, o OPcache os compila para bytecode no primeiro carregamento e serve as solicitações subsequentes a partir da memória. Em um VPS com cPanel devidamente configurado, o OPcache normalmente está ativado por padrão, mas pode exigir ajuste de opcache.memory_consumption e opcache.max_accelerated_files para temas grandes com muitos arquivos de template.
Evite arquivos de template desnecessários: Cada arquivo de template no diretório do seu tema é um candidato que locate_template() deve verificar. Temas com centenas de arquivos de template (comuns em temas comerciais inchados) aumentam o I/O do sistema de arquivos em cada solicitação sem cache. Audite seu tema e remova templates não utilizados.
Cache de página completa: Ferramentas como WP Rocket, W3 Total Cache ou cache no nível do servidor (cache FastCGI do Nginx, Varnish) ignoram completamente a execução de templates PHP para utilizadores anônimos. A resolução da hierarquia de templates só é executada quando o cache falha.
Padrões Práticos de Personalização
Padrão 1: Layout Específico de Categoria Sem um Plugin
Crie category-news.php no diretório do seu tema. O WordPress o usa automaticamente para o arquivo da categoria “news”. Sem plugin, sem hook de filtro — apenas um arquivo com o nome correto.
<?php
/**
* Template for the "news" category archive.
* Inherits from: category.php → archive.php → index.php
*/
get_header();
?>
<main class="news-archive">
<h1><?php single_cat_title(); ?></h1>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'template-parts/card', 'news' ); ?>
<?php endwhile; endif; ?>
<?php the_posts_pagination(); ?>
</main>
<?php get_footer(); ?>Padrão 2: Layout Por Autor para Colaboradores em Destaque
// author-jane-smith.php — loads only for the author with nicename "jane-smith"
get_header();
?>
<div class="featured-author-layout">
<?php get_template_part( 'template-parts/author', 'featured' ); ?>
<!-- Custom bio section, social links, etc. -->
</div>
<?php get_footer(); ?>Padrão 3: Lógica Condicional Dentro de index.php
Se você está construindo um tema mínimo e quer evitar múltiplos arquivos de template, pode usar tags condicionais dentro de index.php:
<?php get_header(); ?>
<?php if ( is_front_page() && is_home() ) : ?>
<?php get_template_part( 'template-parts/home', 'blog-index' ); ?>
<?php elseif ( is_front_page() ) : ?>
<?php get_template_part( 'template-parts/home', 'static' ); ?>
<?php elseif ( is_single() ) : ?>
<?php get_template_part( 'template-parts/content', get_post_type() ); ?>
<?php elseif ( is_archive() ) : ?>
<?php get_template_part( 'template-parts/archive', 'default' ); ?>
<?php else : ?>
<?php get_template_part( 'template-parts/content', 'none' ); ?>
<?php endif; ?>
<?php get_footer(); ?>Este padrão é usado por temas como Twenty Twenty-One e é perfeitamente válido. A desvantagem é que um único index.php grande torna-se mais difícil de manter à medida que a complexidade cresce.
Multisite e Hierarquia de Templates
Em uma rede WordPress Multisite, cada site na rede pode usar um tema ativo diferente. A hierarquia de templates opera de forma idêntica por site, mas plugins ativados na rede podem usar filtros template_include ou _{$type}_template_hierarchy para injetar templates compartilhados em todos os sites sem duplicar arquivos de tema.
Um padrão multisite comum é um diretório de “template de rede” fora da raiz web que é referenciado via hooks de filtro no nível do plugin. Isso permite que uma equipe de design central envie atualizações de templates para todos os sites simultaneamente — uma vantagem operacional significativa para agências que gerenciam dezenas de sites de clientes em um único ambiente de Hospedagem Web Compartilhada ou VPS.
SSL, Segurança e Permissões de Arquivos de Template
Os arquivos de template são PHP e devem ser tratados como código executável. Permissões de arquivo incorretas são um vetor de ataque comum. Em um servidor Linux, os arquivos de template do tema devem ser de propriedade do utilizador do servidor web (normalmente www-data ou nginx) e definidos para o modo 644:
find /var/www/html/wp-content/themes/your-theme -type f -name "*.php" -exec chmod 644 {} ;
find /var/www/html/wp-content/themes/your-theme -type d -exec chmod 755 {} ;Nunca defina arquivos PHP para 777. Se um arquivo de template requer acesso de escrita (incomum e geralmente desaconselhável), use 664 com propriedade de grupo adequada.
Combinar sua instalação WordPress com um Certificado SSL válido garante que o conteúdo renderizado por templates — incluindo páginas geradas dinamicamente com dados sensíveis do utilizador — seja sempre transmitido via HTTPS. Isso é inegociável para qualquer site que use formulários de contato, contas de utilizador ou e-commerce.
Referência da Hierarquia de Templates: Fluxo Visual
Request URL
|
v
WordPress Query Resolution (WP_Query)
|
+-- Is it the front page?
| front-page.php → home.php → index.php
|
+-- Is it a single post?
| single-{type}-{slug}.php → single-{type}.php → single.php → singular.php → index.php
|
+-- Is it a static page?
| [custom template] → page-{slug}.php → page-{ID}.php → page.php → singular.php → index.php
|
+-- Is it a category archive?
| category-{slug}.php → category-{ID}.php → category.php → archive.php → index.php
|
+-- Is it a custom taxonomy?
| taxonomy-{tax}-{term}.php → taxonomy-{tax}.php → taxonomy.php → archive.php → index.php
|
+-- Is it an author archive?
| author-{nicename}.php → author-{ID}.php → author.php → archive.php → index.php
|
+-- Is it a date archive?
| date.php → archive.php → index.php
|
+-- Is it search results?
| search.php → index.php
|
+-- Is it a 404?
404.php → index.phpMatriz de Decisão: Quando Usar Qual Abordagem de Personalização
| Cenário | Abordagem Recomendada | Evitar |
|---|---|---|
| Substituir uma categoria específica | Criar category-{slug}.php no tema | Modificar archive.php diretamente |
| Substituir uma página específica | Criar page-{slug}.php ou usar cabeçalho de template personalizado | Editar page.php |
| Modificar template do WooCommerce | Copiar para o diretório theme/woocommerce/ | Editar arquivos do plugin |
| Modificar template do tema pai | Criar arquivo idêntico no tema filho | Editar arquivos do tema pai |
| Aplicar lógica a múltiplos tipos de página | Usar tags condicionais em um template compartilhado | Duplicar código entre templates |
| Injetar templates de um plugin | Usar filtro _{$type}_template_hierarchy | Codificar caminhos em arquivos de tema |
| Substituir qualquer template como último recurso | Usar filtro template_include | Usar exit() ou die() em templates |
| Personalização de tema de blocos | Usar o Editor do Site ou arquivos HTML templates/ | Misturar templates PHP e HTML de blocos |
Principais Conclusões Técnicas
index.phpé obrigatório. Todo tema deve incluí-lo. É o fallback universal que termina cada cadeia de resolução.singular.phpé a camada intermediária subutilizada. Ele captura qualquer post ou página única quando nemsingle.phpnempage.phpexistem. Use-o em temas mínimos para reduzir a contagem de arquivos.front-page.phpsubstitui tudo para a página inicial, independentemente das configurações de Leitura. Se existir, ele carrega — sempre.- A nomenclatura de arquivos é sensível a maiúsculas e minúsculas em servidores Linux.
Category-News.phpnão corresponderá quando o WordPress procurarcategory-news.php. Esta é uma falha silenciosa que é difícil de depurar sem o Query Monitor. - O filtro
template_includeé a substituição mestre. Ele dispara após toda a resolução da hierarquia ser concluída e lhe dá uma oportunidade final de trocar qualquer template por qualquer motivo. - Os temas de blocos armazenam templates como HTML, não PHP. A lógica da hierarquia é idêntica, mas o formato do arquivo e a estrutura de diretórios diferem fundamentalmente dos temas clássicos.
- O
functions.phpdo tema filho carrega além do pai, não em vez dele. Todos os outros arquivos de template seguem o padrão de substituição padrão. - O ajuste do OPcache importa em escala. Em sites com muito tráfego, certifique-se de que
opcache.max_accelerated_filesexcede o número total de arquivos PHP na sua instalação WordPress, incluindo todos os templates de tema. - Os templates do WooCommerce ficam fora da hierarquia do WordPress. Eles requerem um fluxo de trabalho de substituição separado via o subdiretório
woocommerce/no seu tema. - Combine seu trabalho de personalização de templates com um domínio devidamente configurado e Registo de Domínio para garantir consistência de URL canônica em todas as páginas renderizadas por templates.
FAQ
O que acontece se o WordPress não conseguir encontrar nenhum arquivo de template na hierarquia?
O WordPress sempre encontra index.php porque é necessário para todo tema válido. Se index.php estiver ausente, o WordPress lança um erro fatal e exibe uma página em branco ou erro do servidor. Este é o único arquivo de template cuja ausência quebra o site completamente.
Posso usar a hierarquia de templates em um plugin sem modificar o tema ativo?
Sim. Use o filtro _{$type}_template_hierarchy para adicionar um caminho de diretório de plugin ao array de candidatos antes de locate_template() ser executado, ou use template_include para trocar o caminho do template resolvido após a resolução. É assim que WooCommerce, bbPress e a maioria dos principais plugins injetam seus próprios templates sem exigir modificações no tema.
Por que front-page.php substitui meu índice do blog mesmo quando defino “Seus posts mais recentes” nas configurações de Leitura?
Porque front-page.php tem precedência incondicional para a página inicial em todas as configurações de Leitura. Se você quiser que o índice do blog use home.php em vez disso, renomeie ou remova front-page.php do seu tema. Dentro de front-page.php, use is_home() para detectar se a página inicial também é o índice do blog e renderize adequadamente.
Como descubro qual arquivo de template o WordPress está usando atualmente para uma página específica?
Instale o plugin Query Monitor. Ele exibe o caminho do template resolvido e a hierarquia completa de candidatos na barra de ferramentas do administrador em cada carregamento de página. Alternativamente, adicione um filtro template_include temporário que exibe o caminho como um comentário HTML visível apenas para administradores.
A hierarquia de templates funciona da mesma forma no WordPress Multisite?
A lógica de resolução por site é idêntica. Cada site resolve templates em relação ao seu próprio tema ativo. A diferença está no nível da rede: plugins ativados na rede podem usar hooks de filtro para injetar templates compartilhados em todos os sites, e a função get_stylesheet_directory() retorna o caminho correto para o tema ativo de cada site individual, não um caminho de rede compartilhado.
