{"id":1951,"date":"2026-05-18T08:41:47","date_gmt":"2026-05-18T08:41:47","guid":{"rendered":"https:\/\/studioimmens.com\/custom-post-type-in-wordpress\/"},"modified":"2026-07-16T17:05:55","modified_gmt":"2026-07-16T15:05:55","slug":"custom-post-type-in-wordpress","status":"publish","type":"post","link":"https:\/\/studioimmens.com\/en\/custom-post-type-in-wordpress\/","title":{"rendered":"Custom Post Type in WordPress"},"content":{"rendered":"<h2>Cosa sono i Custom Post Type<\/h2>\n<p>I Custom Post Type (CPT) sono uno dei meccanismi pi\u00f9 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 \u00e8 altro che un tipo di contenuto aggiuntivo registrato nel sistema, con proprie voci di menu, tassonomie, permalink e template.<\/p>\n<p>WordPress tratta ogni CPT come un contenuto di prima classe: supporta l&#8217;editor Gutenberg, la REST API, le revisioni, gli excerpt, i campi personalizzati e qualsiasi funzionalit\u00e0 tu voglia attivare.<\/p>\n<h2>Quando usare i CPT<\/h2>\n<h3>Portfolio<\/h3>\n<p>Un portfolio \u00e8 il caso d&#8217;uso classico per un CPT. Invece di utilizzare post standard con categorie, crei un CPT &#8220;Progetti&#8221; o &#8220;Portfolio&#8221; 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.<\/p>\n<h3>Testimonianze<\/h3>\n<p>Le recensioni dei clienti meritano un tipo di contenuto dedicato. Un CPT &#8220;Testimonianze&#8221; pu\u00f2 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.<\/p>\n<h3>Prodotti<\/h3>\n<p>Anche senza WooCommerce, puoi creare un CPT &#8220;Prodotti&#8221; per cataloghi semplici. Registra campi come prezzo, scheda tecnica, disponibilit\u00e0 e galleria immagini. Per funzionalit\u00e0 e-commerce complete, WooCommerce registra gi\u00e0 il proprio CPT &#8220;product&#8221;, ma un CPT personalizzato \u00e8 utile per cataloghi senza carrello o listini prezzi.<\/p>\n<h3>Eventi<\/h3>\n<p>Un CPT &#8220;Eventi&#8221; \u00e8 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.<\/p>\n<h2>Registrare un CPT via functions.php<\/h2>\n<p>La registrazione di un CPT avviene tramite la funzione register_post_type(), chiamata all&#8217;interno dell&#8217;hook init del tema. Ecco un esempio completo:<\/p>\n<p>function crea_cpt_portfolio() {<br \/>\n$labels = array(<br \/>\n&#8216;name&#8217; =&gt; &#8216;Portfolio&#8217;,<br \/>\n&#8216;singular_name&#8217; =&gt; &#8216;Progetto&#8217;,<br \/>\n&#8216;add_new&#8217; =&gt; &#8216;Aggiungi Progetto&#8217;,<br \/>\n&#8216;add_new_item&#8217; =&gt; &#8216;Aggiungi Nuovo Progetto&#8217;,<br \/>\n&#8216;edit_item&#8217; =&gt; &#8216;Modifica Progetto&#8217;,<br \/>\n&#8216;view_item&#8217; =&gt; &#8216;Vedi Progetto&#8217;,<br \/>\n&#8216;search_items&#8217; =&gt; &#8216;Cerca Progetti&#8217;,<br \/>\n&#8216;not_found&#8217; =&gt; &#8216;Nessun progetto trovato&#8217;,<br \/>\n&#8216;not_found_in_trash&#8217; =&gt; &#8216;Nessun progetto nel cestino&#8217;<br \/>\n);<br \/>\n$args = array(<br \/>\n&#8216;labels&#8217; =&gt; $labels,<br \/>\n&#8216;public&#8217; =&gt; true,<br \/>\n&#8216;has_archive&#8217; =&gt; true,<br \/>\n&#8216;rewrite&#8217; =&gt; array(&#8216;slug&#8217; =&gt; &#8216;portfolio&#8217;),<br \/>\n&#8216;menu_icon&#8217; =&gt; &#8216;dashicons-portfolio&#8217;,<br \/>\n&#8216;supports&#8217; =&gt; array(&#8216;title&#8217;, &#8216;editor&#8217;, &#8216;thumbnail&#8217;, &#8216;excerpt&#8217;, &#8216;custom-fields&#8217;, &#8216;revisions&#8217;),<br \/>\n&#8216;show_in_rest&#8217; =&gt; true,<br \/>\n);<br \/>\nregister_post_type(&#8216;portfolio&#8217;, $args);<br \/>\n}<br \/>\nadd_action(&#8216;init&#8217;, &#8216;crea_cpt_portfolio&#8217;);<br \/>\nQuesto codice va inserito nel file functions.php del tema. Per maggiore sicurezza e organizzazione, \u00e8 consigliabile creare un plugin site-specific (mu-plugin) anzich\u00e9 modificare il tema.<\/p>\n<h2>Argomenti di register_post_type<\/h2>\n<h3>Labels<\/h3>\n<p>L&#8217;array labels definisce tutte le etichette testuali visibili nell&#8217;interfaccia di amministrazione. Personalizzarle rende l&#8217;esperienza utente pi\u00f9 coerente e professionale, soprattutto se il sito viene gestito da clienti che non parlano inglese.<\/p>\n<h3>Supports<\/h3>\n<p>L&#8217;array supports attiva le funzionalit\u00e0 dell&#8217;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).<\/p>\n<h3>Rewrite<\/h3>\n<p>Il parametro rewrite controlla la struttura degli URL del CPT. L&#8217;opzione slug definisce la base dell&#8217;URL (es. \/portfolio\/nome-progetto). with_front gestisce la presenza della base dei permalink, e pages\/front abilitano la paginazione dell&#8217;archivio.<\/p>\n<h3>Menu icon<\/h3>\n<p>menu_icon accetta il nome di una dashicon (es. dashicons-portfolio, dashicons-cart, dashicons-testimonial) o l&#8217;URL di un&#8217;icona personalizzata. Le dashicons sono la libreria di icone integrata di WordPress e offrono centinaia di opzioni.<\/p>\n<h3>Public e show_in_rest<\/h3>\n<p>public =&gt; true rende il CPT visibile nel frontend e nel backend, con pagine pubbliche e permalink. show_in_rest =&gt; true abilita il CPT nella REST API di WordPress, permettendo l&#8217;utilizzo dell&#8217;editor a blocchi e l&#8217;accesso ai dati tramite API.<\/p>\n<h2>Tassonomie personalizzate con register_taxonomy<\/h2>\n<p>Oltre ai CPT, puoi creare tassonomie personalizzate per organizzare i contenuti in modo specifico. register_taxonomy() segue la stessa logica di register_post_type():<\/p>\n<p>function crea_tassonomia_settore() {<br \/>\n$labels = array(<br \/>\n&#8216;name&#8217; =&gt; &#8216;Settori&#8217;,<br \/>\n&#8216;singular_name&#8217; =&gt; &#8216;Settore&#8217;,<br \/>\n&#8216;search_items&#8217; =&gt; &#8216;Cerca Settori&#8217;,<br \/>\n&#8216;all_items&#8217; =&gt; &#8216;Tutti i Settori&#8217;,<br \/>\n&#8216;edit_item&#8217; =&gt; &#8216;Modifica Settore&#8217;,<br \/>\n&#8216;add_new_item&#8217; =&gt; &#8216;Aggiungi Nuovo Settore&#8217;<br \/>\n);<br \/>\nregister_taxonomy(&#8216;settore&#8217;, &#8216;portfolio&#8217;, array(<br \/>\n&#8216;labels&#8217; =&gt; $labels,<br \/>\n&#8216;hierarchical&#8217; =&gt; true,<br \/>\n&#8216;show_in_rest&#8217; =&gt; true,<br \/>\n&#8216;rewrite&#8217; =&gt; array(&#8216;slug&#8217; =&gt; &#8216;settore&#8217;)<br \/>\n));<br \/>\n}<br \/>\nadd_action(&#8216;init&#8217;, &#8216;crea_tassonomia_settore&#8217;);<br \/>\nCon hierarchical =&gt; true la tassonomia si comporta come le categorie (con padre-figlio); con false, come i tag.<\/p>\n<h2>Plugin CPT UI come alternativa<\/h2>\n<p>Se preferisci un&#8217;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&#8217;interfaccia \u00e8 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.<\/p>\n<h2>Template per CPT: single-{cpt}.php e archive-{cpt}.php<\/h2>\n<p>WordPress segue una gerarchia di template ben definita. Per un CPT chiamato &#8220;portfolio&#8221;, puoi creare:<br \/>\n&#8211; single-portfolio.php per il template del singolo progetto<br \/>\n&#8211; archive-portfolio.php per l&#8217;archivio dei progetti<br \/>\n&#8211; taxonomy-settore.php per l&#8217;archivio filtrato per tassonomia<br \/>\nSenza questi file, WordPress usa single.php e archive.php del tema. La gerarchia garantisce che il template pi\u00f9 specifico venga sempre caricato per primo.<\/p>\n<h2>CPT nella REST API per setup headless<\/h2>\n<p>Con show_in_rest =&gt; true, il CPT \u00e8 accessibile tramite REST API all&#8217;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.<\/p>\n<h2>Conclusione<\/h2>\n<p>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\u00e0 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&#8217;editor a blocchi e la REST API.<\/p>","protected":false},"excerpt":{"rendered":"<p>Cosa sono i Custom Post Type I Custom Post Type (CPT) sono uno dei meccanismi pi\u00f9 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 \u00e8 altro che un tipo di contenuto aggiuntivo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2041,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gspb_post_css":"","ai_primary_source":"Studio Immens Blog","visibility_scope":"both","ai_summary":"Cosa sono i Custom Post Type I Custom Post Type (CPT) sono uno dei meccanismi pi\u00f9 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. U...","ai_intent":"informative","ai_related_resources":"","ai_priority":5,"ai_entity_type":"Article","ai_is_based_on":"https:\/\/blog.studioimmens.com\/custom-post-type-in-wordpress\/","ai_citations":"","ai_mentions":"","ai_speakable_selector":"","ai_chunk_hints":"Custom, Post, Type, in","footnotes":""},"categories":[133],"tags":[277],"ai_visibility":[],"class_list":["post-1951","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress","tag-custom-post-type"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/comments?post=1951"}],"version-history":[{"count":1,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1951\/revisions"}],"predecessor-version":[{"id":2242,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/posts\/1951\/revisions\/2242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/media\/2041"}],"wp:attachment":[{"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/media?parent=1951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/categories?post=1951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/tags?post=1951"},{"taxonomy":"ai_visibility","embeddable":true,"href":"https:\/\/studioimmens.com\/en\/wp-json\/wp\/v2\/ai_visibility?post=1951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}