Um custom post type (CPT) do WordPress é um tipo de conteúdo além dos cinco embutidos (post, page, attachment, revision, nav_menu_item). CPTs permitem armazenar conteúdo estruturado como produtos, eventos, imóveis, receitas, depoimentos ou portfólios, cada um com seu próprio menu admin, tela de edição, taxonomias, estrutura de URL e hierarquia de templates. Os custom post types foram introduzidos no WordPress 2.9 (dezembro de 2009) e tornaram se a abordagem padrão com register_post_type() no WordPress 3.0 (junho de 2010). Um CPT é registrado em PHP via register_post_type( $slug, $args ) no hook init, ou visualmente via plugins como Custom Post Type UI (mais de 700.000 instalações ativas), Pods (mais de 100.000) e Meta Box (mais de 400.000). Desde o WordPress 5.0 (dezembro de 2018) CPTs podem habilitar o editor de blocos definindo show_in_rest como true, o que também os expõe na REST API em /wp-json/wp/v2/<slug>. O WooCommerce registra o CPT product mais shop_order, shop_coupon, product_variation e dez outros. The Events Calendar usa tribe_events. ACF Pro pode registrar CPTs via sua interface desde a versão 6.1 (março de 2023). Custom post types continuam sendo a espinha dorsal de qualquer site WordPress não blog em 2025.
Quando usar um custom post type?
- Produtos de e commerce (WooCommerce).
- Eventos (Events Calendar tribe_events).
- Imóveis.
- Portfólios.
- Depoimentos, membros da equipe, FAQs.
- Receitas com dados estruturados.
- Vagas de emprego.
Como registrar um custom post type
add_action( 'init', 'mysite_register_product_cpt' );
function mysite_register_product_cpt() {
$args = array(
'labels' => array( 'name' => 'Produtos', 'singular_name' => 'Produto' ),
'public' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'produtos' ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'menu_icon' => 'dashicons-cart',
);
register_post_type( 'product', $args );
}Argumentos importantes
| Argumento | Função |
|---|---|
| public | Define show_ui, publicly_queryable, exclude_from_search por padrão. |
| show_in_rest | Obrigatório para o editor de blocos e endpoint REST. |
| has_archive | Cria um arquivo em /<slug>/. |
| supports | Recursos ativos: title, editor, thumbnail, excerpt, custom-fields. |
| rewrite | Slug de URL. |
Plugin contra tema
Registre CPTs sempre em um plugin, nunca no tema. Caso contrário, ao trocar de tema o CPT desaparece do menu admin e o conteúdo fica inacessível.
Hierarquia de templates
- Single: single-product.php, single.php, singular.php, index.php.
- Archive: archive-product.php, archive.php, index.php.
CPTs e REST API
Com show_in_rest => true o CPT fica disponível em /wp-json/wp/v2/<rest_base>. Frontends headless consomem esse endpoint.
Plugins que registram CPTs sem código
- Custom Post Type UI (mais de 700.000 instalações).
- ACF Pro 6.1+ (registra CPTs desde março de 2023).
- Pods Framework.
- Meta Box.
- Toolset Types.
Desempenho
- Todo conteúdo CPT vive em wp_posts. Desempenho idêntico até ~100.000 linhas.
- Não registre mais de 20 a 30 CPTs por site.
- Flush rewrite rules uma vez na ativação do plugin.
- Centenas de milhares de entradas: considere tabela dedicada (WooCommerce HPOS desde 8.0 agosto de 2023).
Erros comuns
- Hook errado. Use init.
- Esquecer show_in_rest.
- Não fazer flush das rewrite rules.
- Registro no tema.
- Colisão de slug com página.
O que o InspectWP verifica
O InspectWP detecta custom post types no HTML renderizado e rastreia endpoints REST API quando expostos. O relatório identifica provedores populares (WooCommerce, Events Calendar, ACF).