De WordPress a Hugo: Temas Não São o Que Você Pensa

Neste post
Quem trabalha com WordPress por tempo suficiente desenvolve uma intuição sobre o que um tema é e o que ele faz. Essa intuição funciona bem dentro do ecossistema — ela guia decisões sobre estrutura de arquivos, sobre onde colocar lógica e sobre como estender funcionalidades. O problema aparece quando você migra para o Hugo e tenta aplicar esse mesmo modelo mental.
As palavras são parecidas — templates, layouts, partials — mas o que elas significam na prática é radicalmente diferente. Um tema no WordPress é, em essência, uma aplicação PHP completa que consulta banco de dados, toma decisões de lógica e renderiza HTML, tudo no mesmo lugar. Um tema no Hugo é uma coleção de templates que recebe dados já processados e se limita a apresentá-los. Parece uma diferença sutil até você sentar para construir o seu primeiro layout e perceber que quase tudo que você sabia precisa ser reaprendido.
Este post não tenta substituir a documentação do Hugo nem ser um tutorial de criação de temas — se você procura um guia prático para montar um blog com Hugo, Pages CMS e Cloudflare, veja Como criei este blog sem gastar um centavo. O objetivo aqui é mapear as diferenças conceituais entre os dois mundos — o modelo mental do WordPress e o do Hugo — para que a transição seja menos frustrante e mais produtiva.
O Modelo Mental do WordPress#
O Tema como Aplicação#
No WordPress, o tema não é apenas uma camada visual. Ele é, na prática, a aplicação que roda o site. Um tema decide quais posts buscar, como filtrar resultados, quais campos personalizar, que scripts carregar e como montar cada página. Ele tem acesso direto ao banco de dados através da API do WordPress, pode registrar custom post types, criar endpoints REST, manipular queries e até alterar o comportamento do admin. A fronteira entre “tema” e “plugin” é tênue — e na prática muitos temas cruzam essa linha sem cerimônia.
Isso cria um modelo mental específico: quando um desenvolvedor WordPress pensa em tema, ele pensa em um pacote completo. Estrutura de dados, lógica de apresentação e markup vivem juntos, frequentemente no mesmo arquivo PHP. O tema é o centro gravitacional do projeto — quase tudo passa por ele ou depende dele.
O Loop, o Banco de Dados e o functions.php#
O coração de um tema WordPress é o Loop. Antes de qualquer template ser renderizado, o WordPress já faz uma query ao banco de dados baseada na URL. O tema recebe essa query pronta e itera sobre os resultados com while ( have_posts() ). Parece simples, mas a implicação é profunda: o tema opera em tempo de execução, respondendo a cada requisição do visitante com uma consulta ao MySQL.
O arquivo functions.php reforça esse modelo. Ele funciona como o bootstrap do tema — é onde você registra menus, sidebars, tamanhos de imagem, enfileira scripts e folhas de estilo com wp_enqueue_script, adiciona suporte a funcionalidades do core e, inevitavelmente, escreve lógica que deveria estar em um plugin. O functions.php é executado a cada carregamento de página, o que significa que qualquer código ali tem acesso a todo o estado do WordPress naquele momento: usuário logado, query atual, opções do banco, hooks disponíveis. É poder e responsabilidade no mesmo arquivo — e a razão pela qual temas WordPress podem se tornar tão complexos quanto a aplicação que eles supostamente apenas “vestem”.
O Modelo Mental do Hugo#
O Tema como Camada de Templates#
No Hugo, o tema é exatamente o que o nome sugere: uma camada de apresentação. Ele não consulta banco de dados porque não existe nenhum. Ele não executa lógica em tempo de requisição porque não existe tempo de requisição — tudo acontece no momento do build, antes de o site ser publicado. O resultado é um conjunto de arquivos HTML estáticos que podem ser servidos por qualquer servidor web sem nenhuma dependência de runtime.
Um tema Hugo é uma coleção de arquivos de template escritos na linguagem de templates do Go. Estes definem como o conteúdo será apresentado, mas não definem qual conteúdo existe nem como ele é estruturado. Essa responsabilidade pertence aos arquivos Markdown e à configuração do site. O tema recebe tudo já mastigado — taxonomias resolvidas, páginas ordenadas, parâmetros disponíveis — e se limita a transformar esses dados em HTML. Se no WordPress o tema é o maestro que rege a orquestra, no Hugo ele é a partitura: define a forma, mas não toca os instrumentos.
Conteúdo Mora no Markdown, Lógica Mora no Build#
No WordPress, conteúdo vive no banco de dados e só é acessível através da API. No Hugo, o conteúdo são arquivos de texto. Cada post é um arquivo Markdown com um bloco de front matter — metadados em YAML, TOML ou JSON no topo do arquivo — seguido do corpo do texto. Não existe intermediário: o que está no diretório content/ é o que o Hugo processa.
Essa separação tem consequências práticas que pegam quem vem do WordPress desprevenido. No WordPress, para adicionar um campo personalizado a um post, você usa a API de meta fields ou um plugin como o ACF e acessa o valor com get_post_meta() dentro do tema. No Hugo, você simplesmente adiciona uma chave no front matter do arquivo Markdown e acessa com .Params.nomedachave no template. Não há camada intermediária, não há plugin, não há banco — só texto e templates. A lógica que existe nos templates do Hugo é limitada a condicionais, loops e funções de formatação. Ela serve para decidir como apresentar os dados, nunca para buscá-los ou transformá-los de forma complexa. Qualquer coisa mais elaborada acontece no pipeline de build do Hugo, fora do alcance do tema.
O Que Pega de Surpresa#
Hierarquia de Templates: Convenção vs Lookup Order#
No WordPress, a hierarquia de templates é uma cascata baseada em nomes de arquivo. Se o visitante acessa uma página de categoria, o WordPress procura category-slug.php, depois category-id.php, depois category.php, depois archive.php e finalmente index.php. O desenvolvedor aprende essa sequência uma vez e aplica para o resto da vida. É previsível, bem documentada e raramente gera confusão.
No Hugo, o sistema equivalente é o lookup order — e ele é consideravelmente mais complexo. O template usado para renderizar uma página depende da combinação de tipo de conteúdo, layout, seção, formato de saída e idioma. Uma página do tipo post na seção blog com layout single em português vai disparar uma busca por dezenas de caminhos possíveis antes de encontrar um template que sirva. A documentação do Hugo tem uma tabela enorme para cada tipo de página detalhando essa ordem. Na prática, o desenvolvedor que vem do WordPress tenta criar um arquivo com o nome “óbvio” e se frustra quando o Hugo ignora solenemente o template — porque o nome não corresponde a nenhuma posição válida no lookup order. A curva de aprendizado aqui é real, e a solução é consultar a documentação até internalizar o sistema.
Tema Filho vs. Overrides no Hugo#
No WordPress, o mecanismo de tema filho é uma peça central do ecossistema. Você cria um diretório com um style.css que referencia o tema pai, adiciona um functions.php próprio e, a partir daí, pode sobrescrever qualquer template do tema original colocando um arquivo com o mesmo nome no diretório do tema filho. Isso permite customizar sem tocar no código do tema pai — proteção essencial para sobreviver a atualizações.
No Hugo, esse conceito existe de forma mais simples e, ao mesmo tempo, mais direta. Qualquer arquivo de template colocado no diretório layouts/ da raiz do projeto tem precedência sobre o arquivo equivalente dentro do tema. Não há necessidade de declarar um “tema filho” nem de criar um arquivo de configuração especial. Se o tema define layouts/_default/single.html e você cria o mesmo caminho na raiz do seu projeto, o Hugo usa a sua versão. O modelo é transparente e funciona bem, mas exige disciplina: não há um mecanismo que avise quais templates você sobrescreveu, e após uma atualização do tema o desenvolvedor precisa verificar manualmente se os overrides ainda são compatíveis.
Sem Plugins — E Agora?#
O ecossistema de plugins é uma das maiores forças do WordPress e uma das maiores fontes de complexidade. Precisa de um formulário de contato? Plugin. SEO? Plugin. Cache? Plugin. Galeria de imagens? Plugin. O tema frequentemente é construído já pressupondo a existência de determinados plugins, e a remoção de um deles pode quebrar o site de formas imprevisíveis.
Hugo não tem sistema de plugins. Essa é provavelmente a diferença que mais desorienta quem chega do WordPress. A funcionalidade que no WordPress viria de um plugin no Hugo é resolvida de outras maneiras: shortcodes customizados para componentes reutilizáveis dentro do conteúdo, partials para fragmentos de template, módulos Hugo para importar funcionalidade de repositórios externos e processamento de dados com arquivos JSON, YAML ou CSV no diretório data/. Nenhuma dessas soluções tem a conveniência do “instale e ative” do WordPress — todas exigem que o desenvolvedor entenda o que está fazendo e escreva ou adapte código. Em compensação, não existe a fragilidade de depender de código de terceiros executando em produção a cada requisição.
Para tarefas de manutenção como manter tags consistentes e gerar meta descriptions para SEO, ferramentas externas ao Hugo preenchem a lacuna. O Hugin, por exemplo, usa IA para sugerir tags e resumos diretamente nos arquivos Markdown, sem depender de plugins em tempo de execução.
Assets: De enqueue a Hugo Pipes#
No WordPress, a forma correta de incluir CSS e JavaScript é através do sistema de enfileiramento: wp_enqueue_style() e wp_enqueue_script(). Essas funções registram dependências, controlam a ordem de carregamento, permitem condicionar scripts a páginas específicas e evitam duplicação. É um sistema robusto, mas que opera em tempo de execução — cada página monta sua lista de assets dinamicamente.
Hugo Pipes resolve o mesmo problema de forma radicalmente diferente. Assets são processados durante o build: SCSS é compilado, JavaScript é agrupado e minificado, fingerprinting é aplicado para cache busting, e o resultado são arquivos estáticos com caminhos definitivos. Tudo isso é declarado nos templates com funções como resources.ToCSS, resources.Minify e resources.Fingerprint, encadeadas em um pipeline. Não há preocupação com a ordem de carregamento em runtime porque não existe runtime. O template declara o que precisa, o Hugo processa durante o build e o HTML final sai com os caminhos corretos para arquivos já otimizados. Para quem passou anos lutando com conflitos de jQuery e scripts que carregavam fora de ordem, a previsibilidade do Hugo Pipes é um alívio.
O Que Muda na Sua Cabeça#
A transição de WordPress para Hugo não é apenas técnica — é uma mudança de postura. No WordPress, o desenvolvedor de temas opera com a mentalidade de quem constrói uma aplicação: ele pensa em estado, em sessões, em queries, em hooks que disparam em momentos específicos do ciclo de vida da requisição. No Hugo, essa complexidade simplesmente não existe. O site inteiro é gerado de uma vez, em segundos, e o resultado é um diretório de arquivos HTML que não precisam de nada para funcionar além de um servidor web capaz de servir arquivos estáticos.
Essa simplicidade cobra um preço de entrada. O desenvolvedor perde a flexibilidade de tomar decisões em tempo de requisição — não há como mostrar conteúdo diferente para um usuário logado, não há como processar um formulário no servidor, nem como fazer uma busca dinâmica sem recorrer a serviços externos. Quem vem do WordPress precisa aceitar que essas limitações não são defeitos, são consequências de uma escolha arquitetural que prioriza velocidade, segurança e previsibilidade. Um site Hugo não tem superfície de ataque em runtime porque não há runtime. Não há banco de dados para ser invadido, não há PHP para ser explorado, nem plugins com vulnerabilidades esperando para serem descobertas.
O ganho mais significativo, porém, é cognitivo. Quando o tema é apenas uma camada de apresentação e o conteúdo são arquivos de texto versionados em Git, o desenvolvedor consegue manter o modelo completo do site na cabeça. Não existem surpresas escondidas no banco de dados, não há lógica implícita em hooks que alguém adicionou há três anos, não há estado misterioso que muda entre uma requisição e outra. O que você vê nos arquivos é o que existe. Essa transparência muda a forma de trabalhar — debugar um problema em Hugo é ler templates e verificar front matter, não é vasculhar tabelas no MySQL tentando entender por que um post aparece de um jeito na home e de outro na página de categoria.
Considerações Finais#
A questão não é qual ferramenta é melhor. WordPress continua sendo a escolha certa para muitos projetos — especialmente os que precisam de conteúdo dinâmico, gerenciamento multiusuário ou integração com um ecossistema vasto de plugins. O ponto é que migrar de WordPress para Hugo sem recalibrar o modelo mental é receita para frustração. Os conceitos não se traduzem diretamente, e tentar forçar um dentro do outro só produz temas Hugo que parecem gambiarras de quem ainda está pensando em PHP e MySQL. O investimento real da transição não é aprender a sintaxe de templates do Go — isso leva dias. É desaprender vinte anos de reflexos condicionados sobre o que um tema deve ser e o que ele deve fazer.
Sysadmin, 53 anos, brasileiro trabalhando de casa para o mundo todo. Cuida de servidores Linux, containers LXC, e de gatos que não saem de cima do teclado.