Skip to content

Tutto per WordPress, lo sviluppo web — e non solo

💡 Come creare un custom post type in WordPress: codice e plugin

💡 Come creare un custom post type in WordPress: codice e plugin

Post e Pagine standard coprono la maggior parte delle esigenze di un sito web tipico. Ma quando entra in gioco un catalogo prodotti, un database immobiliare o un portfolio progetti, questi due tipi di contenuto non bastano più. Mescolare prodotti con bozze di articoli è scomodo, e sovraccaricare le pagine con campi personalizzati è la strada per il caos nel pannello di amministrazione.

WordPress risolve questo problema con i Custom Post Type, Custom Post Types (CPT). Crei una sezione separata nel menu laterale con campi, categorie e template di visualizzazione propri. I prodotti restano separati dagli articoli. Gli eventi non si mescolano con le pagine. I dati rimangono dove devono stare.

Di seguito trovi due metodi testati: tramite codice con register_post_type() (flessibile, zero plugin aggiuntivi) e tramite il plugin gratuito CPT UI (nessun PHP richiesto). Entrambi funzionano su WordPress 6.7+ e sono stati testati su siti in produzione.

💡 Panoramica rapida:

  • Registrare un nuovo tipo di post tramite la funzione core register_post_type(), senza plugin, con pieno controllo sui parametri.
  • Alternativa senza codice: il plugin Custom Post Type UI fornisce un'interfaccia visiva, abbassa la barriera d'ingresso ed elimina gli errori di sintassi.
  • Dopo la registrazione, il tipo compare nel menu laterale. Tocchi finali: tassonomie, campi e flush dei permalink.

Che cos'è un custom post type

Qualsiasi contenuto in WordPress è un record con un campo post_type nella tabella wp_posts. Per gli articoli del blog è post. Per le pagine è page. Per gli allegati è attachment. Un tipo personalizzato aggiunge un altro valore: product per i prodotti, event per gli eventi, portfolio per i progetti. Qualunque cosa serva al tuo sito.

Ogni CPT ottiene la propria voce di menu nel pannello di amministrazione, una struttura URL (/events/webinar-2026/), tassonomie proprie e il supporto per i blocchi editor di cui hai bisogno: anteprime, estratti, editor, commenti. Tutto questo si abilita tramite checkbox nell'array supports, nessuna magia.

Il vantaggio principale è l'organizzazione. I prodotti non galleggiano nel feed del blog. Gli eventi non devono essere filtrati da un mucchio generale. L'amministrazione accelera e la ricerca sul sito funziona in modo più preciso.

Metodo 1: registrazione tramite codice, register_post_type()

Il metodo base che funziona da WordPress 3.0. Nessun plugin di terze parti necessario. Il codice va nel functions.php del tema child o, in modo più sicuro, tramite il plugin Code Snippets: un errore di codice non manderà in crash il sito ma disabiliterà semplicemente quello snippet specifico.

Passo 1: funzione sull'hook init

La funzione si aggancia a init. Prima non funziona perché il core non è ancora pronto ad accettare registrazioni. Dopo significa che il tipo non verrà rilevato fino alla richiesta successiva. Ecco un template minimo funzionante:

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' );

Dopo aver inserito il codice, nel pannello di amministrazione compare una sezione "Libri". Gli URL dei record diventano site.ru/books/book-name/. Funziona immediatamente.

Passo 2: parametri chiave

La funzione accetta due argomenti: una stringa chiave per il tipo (fino a 20 caratteri, lettere latine e trattini) e un array di impostazioni. Ecco i parametri che vale la pena configurare con attenzione:

Parametro

Cosa fa

Raccomandazione

public

Visibilità in amministrazione e frontend

true per la maggior parte dei casi

has_archive

Pagina archivio per tutti i record di questo tipo

true per cataloghi e raccolte

rewrite

Struttura URL (slug)

Imposta esplicitamente, senza caratteri speciali

supports

Blocchi editor

Minimo: title editor thumbnail

show_in_rest

Disponibilità nell'editor a blocchi

true è obbligatorio, altrimenti Gutenberg non si apre

menu_icon

Icona nel menu laterale

Scegli tra le Dashicons

Passo 3: tassonomie

Le categorie e i tag degli articoli non sono collegati al tuo CPT per impostazione predefinita. Creane di tuoi:

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' );

Le tassonomie si registrano tramite register_taxonomy() con un collegamento esplicito al post_type come secondo parametro. hierarchical => true fornisce una struttura ad albero come le categorie. false dà un elenco piatto come i tag.

Dopo la registrazione, vai su Impostazioni → Permalink e clicca "Salva le modifiche", anche se non hai cambiato nulla. WordPress ricostruirà le regole di routing. Senza questo passaggio, URL come /books/ restituiranno 404.

Quando il codice è sufficiente

Questo metodo funziona bene per uno o due tipi personalizzati quando la struttura non cambia spesso. Vantaggio: zero plugin aggiuntivi e pieno controllo su ogni parametro. Svantaggio: per relazioni complesse tra più CPT e form di invio frontend, il codice cresce rapidamente.

Metodo 2: senza codice, plugin Custom Post Type UI

Se non vuoi toccare functions.php, installa Custom Post Type UI. Un plugin gratuito di WebDevStudios: un milione di installazioni attive, valutazione 4.6 su WordPress.org. Aggiornato a maggio 2026, testato fino a WP 7.0.

Interfaccia per aggiungere un custom post type nel plugin CPT UI

Come creare un CPT tramite interfaccia

  • Installa il plugin: Plugin → Aggiungi nuovo → "Custom Post Type UI" → Installa → Attiva.
  • Vai su CPT UI → Aggiungi/Modifica Tipi di Post.
  • Compila i campi: Post Type Slug (lettere latine, ad esempio event), Plural Label ("Eventi"), Singular Label ("Evento").
  • Nel blocco Impostazioni, spunta: Pubblico (True), Ha Archivio (True), Mostra in REST API (True).
  • Nel blocco Supports, spunta come minimo: Titolo, Editor, Anteprima, Estratto.
  • Clicca Aggiungi Tipo di Post.

Le tassonomie si creano nello stesso posto, nella scheda Aggiungi/Modifica Tassonomie. Specifica il collegamento al tuo tipo di post e le categorie appariranno nel menu laterale.

Punti di forza

Registrazione rapida senza rischio di errori di sintassi: il plugin assembla da solo un array $args corretto. La scheda Strumenti consente la migrazione dei tipi tra siti tramite esportazione e importazione del codice. CPT UI Pro aggiunge blocchi per l'output frontend e colonne drag-and-drop nel pannello di amministrazione, ma la versione gratuita copre completamente il compito di registrazione.

Nota che il plugin registra solo tipi e tassonomie. Per la visualizzazione frontend, avrai bisogno di template del tema, di CPT UI Pro o di una combinazione con Advanced Custom Fields o Elementor.

Confronto: codice versus plugin

Criterio

Codice (register_post_type)

Plugin (CPT UI)

Barriera d'ingresso

Richiede comprensione degli array PHP

Interfaccia simile alle impostazioni standard di WP

Numero di CPT

Illimitato

Illimitato

Trasferimento tra siti

Copia il codice

Esporta/importa tramite Strumenti

Codice extra sul sito

Nessuno

Più un plugin

Dipendenza dal plugin

Nessuna

Sì, CPT UI deve essere attivo

Documentazione

developer.wordpress.org

docs.pluginize.com

In pratica, si usa spesso una combinazione: registrare i tipi tramite CPT UI per velocità e aggiungere campi tramite Advanced Custom Fields. Questo ti dà un'interfaccia di configurazione visiva senza una sola riga di PHP.

⁉️🤔 Domande frequenti

Devo fare il flush dei permalink dopo aver creato un CPT?

Sì, sempre. Vai su Impostazioni → Permalink e clicca "Salva". WordPress ricostruirà le regole di routing. Senza questo, i nuovi URL come /books/ restituiranno 404.

In cosa si differenzia CPT UI da ACF nella registrazione dei tipi?

CPT UI registra solo tipi di post e tassonomie. ACF, a partire dalla versione 6.1, può anche registrare CPT, ma il suo punto di forza principale sono i campi personalizzati. La combinazione CPT UI + ACF ti dà un'interfaccia per i tipi e campi flessibili. Non sei vincolato a un unico fornitore.

Posso rinominare un tipo di post esistente?

Non esiste un meccanismo diretto. Quando cambi il post_type nel database, i vecchi record scompaiono dal pannello di amministrazione. L'approccio corretto: crea un nuovo tipo con il nome desiderato, migra i record con una query SQL UPDATE wp_posts SET post_type = 'new_type' WHERE post_type = 'old_type', e solo dopo rimuovi la vecchia registrazione. Un backup completo del database prima della migrazione è obbligatorio.

I tipi personalizzati scompaiono quando si cambia tema?

Se i tipi sono registrati nel functions.php del tema, sì, quando cambi tema scompariranno dal pannello di amministrazione. I record rimarranno nel database ma non saranno visibili. Registra i CPT in un plugin separato o tramite Code Snippets, e i tipi sopravvivranno a qualsiasi cambio di tema.

Come mostro i CPT in homepage nel feed generale?

Aggiungi un filtro in Code Snippets: add_filter( 'pre_get_posts', function( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } );. Sostituisci il tuo post_type nell'array e i record appariranno nel feed insieme agli articoli normali.

Quale metodo scegliere: riepilogo finale

Entrambi i metodi portano allo stesso risultato: una nuova sezione compare nel menu laterale, pronta per essere riempita di contenuti. La differenza sta solo nello strumento.

Se lavori sul sito in prima persona e non hai paura del functions.php, usa il codice. Una funzione register_post_type(), zero plugin aggiuntivi. Adatto per landing page, piccoli cataloghi e progetti con supporto di uno sviluppatore.

Se consegni il sito a un cliente o costruisci un progetto di contenuti con una dozzina di tipi, installa CPT UI. L'interfaccia visiva abbassa la barriera d'ingresso e l'esportazione della configurazione fa risparmiare ore durante la migrazione tra piattaforme.

In ogni caso, dopo la registrazione, imposta la visualizzazione: template single e archive nel tema o layout visivo tramite CPT UI Pro / Elementor Pro. Senza questo passaggio, il contenuto rimarrà solo nel pannello di amministrazione.