
💡 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 */ 5 function 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 } 24 add_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 |
|---|---|---|
| Visibilidade no admin e frontend |
|
| Página de arquivo para todos os registos deste tipo |
|
| Estrutura do URL (slug) | Defina explicitamente, sem caracteres especiais |
| Blocos do editor | Mínimo: |
| Disponibilidade no editor de blocos |
|
| Í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:
1 function 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 } 16 add_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.
Passo 4: limpar permalinks
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.

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 ( | 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 |
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_typena 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 SQLUPDATE 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.phpdo 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 seupost_typeno 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.



