Un custom post type (CPT) di WordPress è un tipo di contenuto oltre ai cinque integrati (post, page, attachment, revision, nav_menu_item). I CPT permettono di archiviare contenuti strutturati come prodotti, eventi, immobili, ricette, testimonianze o portfolio, ognuno con menu di amministrazione, schermata di modifica, tassonomie, struttura URL e gerarchia di template propri. I custom post types sono stati introdotti in WordPress 2.9 (dicembre 2009) e sono diventati l’approccio standard con register_post_type() in WordPress 3.0 (giugno 2010). Un CPT viene registrato in PHP tramite register_post_type( $slug, $args ) sul hook init o visualmente tramite plugin come Custom Post Type UI (oltre 700.000 installazioni attive), Pods (oltre 100.000) e Meta Box (oltre 400.000). Da WordPress 5.0 (dicembre 2018) i CPT possono abilitare l’editor a blocchi impostando show_in_rest su true, che li espone anche sulla REST API a /wp-json/wp/v2/<slug>. WooCommerce registra il CPT product oltre a shop_order, shop_coupon, product_variation e altri dieci. The Events Calendar usa tribe_events. ACF Pro può registrare i CPT tramite la sua interfaccia dalla versione 6.1 (marzo 2023). I custom post types restano nel 2025 la spina dorsale di qualunque sito WordPress non blog.
Quando usare un custom post type?
- Prodotti e commerce (WooCommerce).
- Eventi (Events Calendar tribe_events).
- Immobili.
- Portfolio.
- Testimonianze, membri del team, FAQ.
- Ricette con dati strutturati.
- Offerte di lavoro.
Come registrare un custom post type
add_action( 'init', 'mysite_register_product_cpt' );
function mysite_register_product_cpt() {
$args = array(
'labels' => array( 'name' => 'Prodotti', 'singular_name' => 'Prodotto' ),
'public' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'prodotti' ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'menu_icon' => 'dashicons-cart',
);
register_post_type( 'product', $args );
}Argomenti importanti
| Argomento | Funzione |
|---|---|
| public | Imposta show_ui, publicly_queryable, exclude_from_search di default. |
| show_in_rest | Obbligatorio per l’editor a blocchi e endpoint REST. |
| has_archive | Crea un archivio a /<slug>/. |
| supports | Funzioni attive: title, editor, thumbnail, excerpt, custom-fields. |
| rewrite | Slug URL. |
Plugin contro tema
Registra sempre i CPT in un plugin, mai nel tema. Altrimenti cambiando tema il CPT scompare dal menu di amministrazione e il contenuto diventa inaccessibile.
Gerarchia di template
- Single: single-product.php, single.php, singular.php, index.php.
- Archive: archive-product.php, archive.php, index.php.
CPT e REST API
Con show_in_rest => true il CPT è disponibile a /wp-json/wp/v2/<rest_base>. I frontend headless consumano questo endpoint.
Plugin che registrano i CPT senza codice
- Custom Post Type UI (oltre 700.000 installazioni).
- ACF Pro 6.1+ (registra i CPT da marzo 2023).
- Pods Framework.
- Meta Box.
- Toolset Types.
Prestazioni
- Tutto il contenuto CPT vive in wp_posts. Prestazioni identiche fino a ~100.000 righe.
- Non registrare più di 20 a 30 CPT per sito.
- Flush rewrite rules una volta all’attivazione del plugin.
- Centinaia di migliaia di voci: considera una tabella dedicata (WooCommerce HPOS dal 8.0 agosto 2023).
Errori comuni
- Hook sbagliato. Usa init.
- Dimenticare show_in_rest.
- Non fare flush delle rewrite rules.
- Registrazione nel tema.
- Collisione di slug con una pagina.
Cosa controlla InspectWP
InspectWP rileva i custom post types nell’HTML renderizzato e interroga gli endpoint REST API quando esposti. Il report identifica i provider CPT popolari (WooCommerce, Events Calendar, ACF).