Skip to content

Tudo para WordPress, desenvolvimento web — e não só

💡 Como criar um custom post type no WordPress: código e plugin

💡 Como criar um custom post type no WordPress: código e plugin

Publicações e Páginas padrão cobrem a maioria das tarefas de um site típico. Mas quando entra em cena um catálogo de produtos, uma base de dados imobiliária ou um portfólio de projetos, estes dois tipos de conteúdo já não são suficientes. Misturar produtos com rascunhos de blogue é inconveniente e sobrecarregar páginas com campos personalizados é um caminho para o caos no painel de administração.

O WordPress resolve este problema através dos Custom Post Types, Custom Post Types (CPT). Cria-se uma secção separada no menu da barra lateral com os seus próprios campos, categorias e modelos de exibição. Os produtos vivem separados dos artigos. Os eventos não se misturam com as páginas. Os dados permanecem onde pertencem.

Abaixo estão dois métodos testados: através de código usando register_post_type() (flexível, zero plugins extra) e através do plugin gratuito CPT UI (sem necessidade de PHP). Ambos funcionam no WordPress 6.7+ e foram testados em sites de produção.

💡 Visão geral rápida:

  • Registar um novo tipo de publicação através da função principal register_post_type(), sem plugins, com controlo total sobre os parâmetros.
  • Alternativa sem código: o plugin Custom Post Type UI fornece uma interface visual, reduz a barreira de entrada e elimina erros de sintaxe.
  • Após o registo, o tipo aparece no menu da barra lateral. Toques finais: taxonomias, campos e limpeza de permalinks.

O que é um custom post type

Qualquer conteúdo no WordPress é um registo com um campo post_type na tabela wp_posts. Para artigos de blogue, é post. Para páginas, é page. Para anexos, é attachment. Um tipo personalizado adiciona outro valor: product para produtos, event para eventos, portfolio para projetos. O que melhor se adequar às necessidades do seu site.

Cada CPT recebe o seu próprio item de menu no painel de administração, uma estrutura de URL (/events/webinar-2026/), as suas próprias taxonomias e suporte para os blocos do editor de que necessita: miniaturas, excertos, editor, comentários. Tudo isto é ativado através de caixas de verificação no array supports, sem qualquer magia.

O principal benefício é a organização. Os produtos não andam à deriva no feed do blogue. Os eventos não precisam de ser filtrados de uma pilha geral. A administração acelera e a pesquisa do site funciona com mais precisão.

Método 1: registo através de código, register_post_type()

O método básico que funciona desde o WordPress 3.0. Não são necessários plugins de terceiros. O código vai no ficheiro functions.php do seu tema filho ou, de forma mais segura, através do plugin Code Snippets: um erro de código não fará o site cair, mas simplesmente desativará esse snippet específico.

Passo 1: função no hook init

A função liga-se ao init. Mais cedo não funcionará porque o núcleo ainda não está pronto para aceitar registos. Mais tarde significa que o tipo não será detetado até ao próximo pedido. Aqui está um modelo mínimo funcional:

1/**
2 * Registers a custom post type 'Books'.
3 * Place in functions.php of the child theme or via Code Snippets.
4 */
5function myprefix_register_book_post_type() {
6 register_post_type( 'book', array(
7 'labels' => array(
8 'name' => 'Books',
9 'singular_name' => 'Book',
10 'add_new_item' => 'Add New Book',
11 'edit_item' => 'Edit Book',
12 'view_item' => 'View Book',
13 'search_items' => 'Search Books',
14 'not_found' => 'No books found',
15 ),
16 'public' => true,
17 'has_archive' => true,
18 'rewrite' => array( 'slug' => 'books' ),
19 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
20 'show_in_rest' => true,
21 'menu_icon' => 'dashicons-book-alt',
22 ) );
23}
24add_action( 'init', 'myprefix_register_book_post_type' );

Após inserir o código, uma secção "Livros" aparece no painel de administração. Os URLs dos registos passam a ser site.ru/books/book-name/. Funciona imediatamente.

Passo 2: parâmetros chave

A função recebe dois argumentos: uma string de chave de tipo (até 20 caracteres, letras latinas e hífens) e um array de configurações. Aqui estão os parâmetros que vale a pena configurar deliberadamente:

Parâmetro

O que faz

Recomendação

public

Visibilidade no admin e frontend

true para a maioria dos casos

has_archive

Página de arquivo para todos os registos deste tipo

true para catálogos e coleções

rewrite

Estrutura do URL (slug)

Defina explicitamente, sem caracteres especiais

supports

Blocos do editor

Mínimo: title editor thumbnail

show_in_rest

Disponibilidade no editor de blocos

true é obrigatório, caso contrário o Gutenberg não abre

menu_icon

Ícone no menu da barra lateral

Escolha entre os Dashicons

Passo 3: taxonomias

As categorias e tags de artigos não são anexadas ao seu CPT por defeito. Crie as suas próprias:

1function myprefix_register_book_taxonomies() {
2 register_taxonomy( 'genre', 'book', array(
3 'label' => 'Genres',
4 'rewrite' => array( 'slug' => 'genre' ),
5 'hierarchical' => true,
6 'show_in_rest' => true,
7 ) );
8
9 register_taxonomy( 'book_tag', 'book', array(
10 'label' => 'Book Tags',
11 'rewrite' => array( 'slug' => 'book-tag' ),
12 'hierarchical' => false,
13 'show_in_rest' => true,
14 ) );
15}
16add_action( 'init', 'myprefix_register_book_taxonomies' );

As taxonomias são registadas através de register_taxonomy() com uma ligação explícita ao post_type como segundo parâmetro. hierarchical => true fornece uma estrutura em árvore como as categorias. false dá uma lista plana como as tags.

Após o registo, vá a Configurações → Permalinks e clique em "Guardar alterações", mesmo que não tenha alterado nada. O WordPress reconstruirá as regras de roteamento. Sem este passo, URLs como /books/ devolverão erro 404.

Quando o código é suficiente

Este método funciona bem para um ou dois tipos personalizados quando a estrutura não muda frequentemente. Vantagem: zero plugins extra e controlo total sobre cada parâmetro. Desvantagem: para relações complexas entre vários CPTs e formulários de submissão no frontend, o código cresce rapidamente.

Método 2: sem código, plugin Custom Post Type UI

Se não quiser mexer no functions.php, instale o Custom Post Type UI. Um plugin gratuito da WebDevStudios: um milhão de instalações ativas, classificação de 4.6 no WordPress.org. Atualizado em maio de 2026, testado até ao WP 7.0.

Interface para adicionar um tipo de publicação personalizado no plugin CPT UI

Como criar um CPT através da interface

  • Instale o plugin: Plugins → Adicionar Novo → "Custom Post Type UI" → Instalar → Ativar.
  • Vá a CPT UI → Adicionar/Editar Tipos de Publicação.
  • Preencha os campos: Slug do Tipo de Publicação (letras latinas, por exemplo event), Rótulo Plural ("Eventos"), Rótulo Singular ("Evento").
  • No bloco Configurações, marque: Público (Verdadeiro), Tem Arquivo (Verdadeiro), Mostrar na API REST (Verdadeiro).
  • No bloco Suportes, marque no mínimo: Título, Editor, Miniatura, Excerto.
  • Clique em Adicionar Tipo de Publicação.

As taxonomias são criadas no mesmo local, no separador Adicionar/Editar Taxonomias. Especifique a ligação ao seu tipo de publicação e as categorias aparecerão no menu da barra lateral.

Pontos fortes

Registo rápido sem risco de erros de sintaxe: o plugin monta um array $args correto por si próprio. O separador Ferramentas permite a migração de tipos entre sites através de exportação e importação de código. O CPT UI Pro adiciona blocos para exibição no frontend e colunas de arrastar e largar no painel de administração, mas a versão gratuita cobre totalmente a tarefa de registo.

Note que o plugin apenas regista tipos e taxonomias. Para a exibição no frontend, precisará de modelos de tema, CPT UI Pro ou uma combinação com Advanced Custom Fields ou Elementor.

Comparação: código versus plugin

Critério

Código (register_post_type)

Plugin (CPT UI)

Barreira de entrada

Requer compreensão de arrays PHP

Interface semelhante às configurações padrão do WP

Número de CPTs

Ilimitado

Ilimitado

Transferência entre sites

Copiar o código

Exportar/importar através de Ferramentas

Código extra no site

Nenhum

Mais um plugin

Dependência de plugin

Nenhuma

Sim, o CPT UI deve estar ativo

Documentação

developer.wordpress.org

docs.pluginize.com

Na prática, usa-se frequentemente uma combinação: registar tipos através do CPT UI para rapidez e adicionar campos através do Advanced Custom Fields. Isto dá-lhe uma interface de configuração visual sem uma única linha de PHP.

⁉️🤔 Perguntas frequentes

Preciso de limpar os permalinks após criar um CPT?

Sim, sempre. Vá a Configurações → Permalinks e clique em "Guardar". O WordPress reconstruirá as regras de roteamento. Sem isto, novos URLs como /books/ devolverão erro 404.

Como é que o CPT UI difere do ACF no registo de tipos?

O CPT UI apenas regista tipos de publicação e taxonomias. O ACF, a partir da versão 6.1, também pode registar CPTs, mas a sua principal força são os campos personalizados. A combinação CPT UI + ACF dá-lhe uma interface para tipos e campos flexíveis. Não fica preso a um único fornecedor.

Posso renomear um tipo de publicação existente?

Não existe um mecanismo direto. Quando altera o post_type na base de dados, os registos antigos desaparecem do painel de administração. A abordagem correta: criar um novo tipo com o nome desejado, migrar os registos com uma consulta SQL UPDATE wp_posts SET post_type = 'new_type' WHERE post_type = 'old_type', e só depois remover o registo antigo. É obrigatória uma cópia de segurança completa da base de dados antes da migração.

Os tipos personalizados desaparecem ao mudar de tema?

Se os tipos estiverem registados no functions.php do tema, sim, ao mudar de tema eles desaparecerão do painel de administração. Os registos permanecerão na base de dados, mas não serão visíveis. Registe os CPTs num plugin separado ou através do Code Snippets, e os tipos sobreviverão a qualquer mudança de tema.

Como exibo CPT na página inicial no feed geral?

Adicione um filtro no Code Snippets: add_filter( 'pre_get_posts', function( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } );. Substitua o seu post_type no array e os registos aparecerão no feed juntamente com os artigos normais.

Qual o método a escolher: resumo final

Ambos os métodos levam ao mesmo resultado: uma nova secção aparece no menu da barra lateral, pronta a ser preenchida com conteúdo. A diferença está apenas na ferramenta.

Se trabalha com o site de forma prática e não tem medo do functions.php, use código. Uma função register_post_type(), zero plugins extra. Adequado para landing pages, pequenos catálogos e projetos com suporte de desenvolvimento.

Se vai entregar o site a um cliente ou construir um projeto de conteúdo com uma dúzia de tipos, instale o CPT UI. A interface visual reduz a barreira de entrada e a exportação de configuração poupa horas ao migrar entre plataformas.

Em qualquer caso, após o registo, configure a exibição: modelos single e archive no tema ou layout visual através do CPT UI Pro / Elementor Pro. Sem este passo, o conteúdo permanecerá apenas no painel de administração.