Custom Post Type in WordPress

Cosa sono i Custom Post Type

I Custom Post Type (CPT) sono uno dei meccanismi più potenti di WordPress. Mentre WordPress nativamente gestisce due tipi di contenuto (post e pagine), i CPT permettono di crearne di nuovi con caratteristiche, comportamenti e interfacce completamente personalizzate. Un CPT non è altro che un tipo di contenuto aggiuntivo registrato nel sistema, con proprie voci di menu, tassonomie, permalink e template.

WordPress tratta ogni CPT come un contenuto di prima classe: supporta l’editor Gutenberg, la REST API, le revisioni, gli excerpt, i campi personalizzati e qualsiasi funzionalità tu voglia attivare.

Quando usare i CPT

Portfolio

Un portfolio è il caso d’uso classico per un CPT. Invece di utilizzare post standard con categorie, crei un CPT “Progetti” o “Portfolio” con campi specifici come cliente, anno, tecnologie usate e URL del progetto live. Ogni progetto ha il proprio template di visualizzazione e le proprie pagine di archivio.

Testimonianze

Le recensioni dei clienti meritano un tipo di contenuto dedicato. Un CPT “Testimonianze” può includere campi per il nome del cliente, la sua azienda, la valutazione in stelle e la foto. Puoi visualizzarle in slider, griglia o singole citazioni in qualsiasi parte del sito tramite shortcode o blocchi Gutenberg.

Prodotti

Anche senza WooCommerce, puoi creare un CPT “Prodotti” per cataloghi semplici. Registra campi come prezzo, scheda tecnica, disponibilità e galleria immagini. Per funzionalità e-commerce complete, WooCommerce registra già il proprio CPT “product”, ma un CPT personalizzato è utile per cataloghi senza carrello o listini prezzi.

Eventi

Un CPT “Eventi” è ideale per conferenze, workshop, webinar e appuntamenti. Puoi aggiungere campi per data, ora, luogo, relatori e biglietti. Combinato con plugin come The Events Calendar, ottieni un sistema completo di gestione eventi perfettamente integrato.

Registrare un CPT via functions.php

La registrazione di un CPT avviene tramite la funzione register_post_type(), chiamata all’interno dell’hook init del tema. Ecco un esempio completo:

function crea_cpt_portfolio() {
$labels = array(
‘name’ => ‘Portfolio’,
‘singular_name’ => ‘Progetto’,
‘add_new’ => ‘Aggiungi Progetto’,
‘add_new_item’ => ‘Aggiungi Nuovo Progetto’,
‘edit_item’ => ‘Modifica Progetto’,
‘view_item’ => ‘Vedi Progetto’,
‘search_items’ => ‘Cerca Progetti’,
‘not_found’ => ‘Nessun progetto trovato’,
‘not_found_in_trash’ => ‘Nessun progetto nel cestino’
);
$args = array(
‘labels’ => $labels,
‘public’ => true,
‘has_archive’ => true,
‘rewrite’ => array(‘slug’ => ‘portfolio’),
‘menu_icon’ => ‘dashicons-portfolio’,
‘supports’ => array(‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’, ‘revisions’),
‘show_in_rest’ => true,
);
register_post_type(‘portfolio’, $args);
}
add_action(‘init’, ‘crea_cpt_portfolio’);
Questo codice va inserito nel file functions.php del tema. Per maggiore sicurezza e organizzazione, è consigliabile creare un plugin site-specific (mu-plugin) anziché modificare il tema.

Argomenti di register_post_type

Labels

L’array labels definisce tutte le etichette testuali visibili nell’interfaccia di amministrazione. Personalizzarle rende l’esperienza utente più coerente e professionale, soprattutto se il sito viene gestito da clienti che non parlano inglese.

Supports

L’array supports attiva le funzionalità dell’editor per il CPT: title (titolo), editor (contenuto), thumbnail (immagine in evidenza), excerpt (riassunto), custom-fields (campi personalizzati), revisions (cronologia revisioni), page-attributes (ordine e pagina padre), post-formats (formati post) e comments (commenti).

Rewrite

Il parametro rewrite controlla la struttura degli URL del CPT. L’opzione slug definisce la base dell’URL (es. /portfolio/nome-progetto). with_front gestisce la presenza della base dei permalink, e pages/front abilitano la paginazione dell’archivio.

Menu icon

menu_icon accetta il nome di una dashicon (es. dashicons-portfolio, dashicons-cart, dashicons-testimonial) o l’URL di un’icona personalizzata. Le dashicons sono la libreria di icone integrata di WordPress e offrono centinaia di opzioni.

Public e show_in_rest

public => true rende il CPT visibile nel frontend e nel backend, con pagine pubbliche e permalink. show_in_rest => true abilita il CPT nella REST API di WordPress, permettendo l’utilizzo dell’editor a blocchi e l’accesso ai dati tramite API.

Tassonomie personalizzate con register_taxonomy

Oltre ai CPT, puoi creare tassonomie personalizzate per organizzare i contenuti in modo specifico. register_taxonomy() segue la stessa logica di register_post_type():

function crea_tassonomia_settore() {
$labels = array(
‘name’ => ‘Settori’,
‘singular_name’ => ‘Settore’,
‘search_items’ => ‘Cerca Settori’,
‘all_items’ => ‘Tutti i Settori’,
‘edit_item’ => ‘Modifica Settore’,
‘add_new_item’ => ‘Aggiungi Nuovo Settore’
);
register_taxonomy(‘settore’, ‘portfolio’, array(
‘labels’ => $labels,
‘hierarchical’ => true,
‘show_in_rest’ => true,
‘rewrite’ => array(‘slug’ => ‘settore’)
));
}
add_action(‘init’, ‘crea_tassonomia_settore’);
Con hierarchical => true la tassonomia si comporta come le categorie (con padre-figlio); con false, come i tag.

Plugin CPT UI come alternativa

Se preferisci un’interfaccia grafica al codice, il plugin Custom Post Type UI (CPT UI) permette di registrare CPT e tassonomie senza scrivere una riga di PHP. L’interfaccia è chiara e offre tutti gli stessi parametri di register_post_type(). Il plugin esporta anche il codice PHP generato, che puoi copiare nel tema se decidi di rimuovere il plugin.

Template per CPT: single-{cpt}.php e archive-{cpt}.php

WordPress segue una gerarchia di template ben definita. Per un CPT chiamato “portfolio”, puoi creare:
– single-portfolio.php per il template del singolo progetto
– archive-portfolio.php per l’archivio dei progetti
– taxonomy-settore.php per l’archivio filtrato per tassonomia
Senza questi file, WordPress usa single.php e archive.php del tema. La gerarchia garantisce che il template più specifico venga sempre caricato per primo.

CPT nella REST API per setup headless

Con show_in_rest => true, il CPT è accessibile tramite REST API all’endpoint /wp/v2/portfolio. Puoi personalizzare i campi restituiti con register_rest_field() o creare endpoint personalizzati con register_rest_route(). I dati in JSON includono titolo, contenuto, excerpt, meta, tassonomie e URL delle thumbnail. Questo rende i CPT perfetti per architetture headless con frontend React, Vue.js o Next.js.

Conclusione

I Custom Post Type sono fondamentali per trasformare WordPress da semplice blog in un CMS enterprise in grado di gestire qualsiasi tipo di contenuto. La registrazione tramite functions.php o plugin dà il controllo completo su comportamento e aspetto. Combina CPT con tassonomie personalizzate, campi avanzati (ACF) e template dedicati per creare architetture di contenuto professionali, scalabili e perfettamente integrate con l’editor a blocchi e la REST API.

Lascia una risposta