{"id":233604,"date":"2023-02-17T13:08:00","date_gmt":"2023-02-17T10:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233604"},"modified":"2022-11-11T00:35:46","modified_gmt":"2022-11-10T21:35:46","slug":"crea-tipi-di-post-personalizzati-e-tassonomie-personalizzate-in-wordpress-per-codice","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-tipi-di-post-personalizzati-e-tassonomie-personalizzate-in-wordpress-per-codice\/","title":{"rendered":"Crea tipi di post personalizzati e tassonomie personalizzate in WordPress per codice"},"content":{"rendered":"\n<p>Questo \u00e8 un tutorial su come creare un tipo di post personalizzato e una tassonomia personalizzata in WordPress per codice. Esamineremo le insidie \u200b\u200bcomuni e gli argomenti da utilizzare per una creazione minima ma sufficiente. Esempio completo incluso alla fine.<\/p>\n<h2>Dove aggiungere il codice<\/h2>\n<p>La creazione di tipi di post personalizzati (CPT) e tassonomie personalizzate in WordPress pu\u00f2 essere eseguita all&#8217;interno del file di un tema <code>functions.php<\/code>o all&#8217;interno di un plug-in. Tieni presente che il tipo di post personalizzato e la tassonomia personalizzata scompaiono se cambi tema o disattivi il plug-in. Quindi \u00e8 sicuro rimuovere temporaneamente la registrazione CPT dal tema e spostarla in un plug-in, purch\u00e9 si mantenga lo stesso tipo di post personalizzato o lo stesso identificatore di tassonomia slug\/ID.<\/p>\n<p>Per creare (e modificare) un CPT o una tassonomia, <strong>utilizzare sempre<\/strong> l&#8217; <code>init<\/code>hook. Posizionarlo nella radice di <code>functions.php<\/code>(fuori da un gancio) o qualsiasi altro gancio causer\u00e0 problemi.<\/p>\n<h2>Creazione di un tipo di post personalizzato<\/h2>\n<p>Per creare un tipo di post personalizzato si utilizza la <code>register_post_type<\/code>funzione. Accetta due parametri; prima l&#8217;identificatore del tipo di post e poi un array con tutti gli argomenti.<\/p>\n<p>L&#8217;identificatore del tipo di post \u00e8 un nome di versione slug del tuo tipo di post. Ad esempio, i post e le pagine dei tipi di post integrati in WordPress sono identificati come &#8216; <code>post<\/code>&#8216; e &#8216; <code>page<\/code>&#8216;. L&#8217;identificatore deve essere univoco, deve seguire una serie di regole (minuscole, niente spazi ecc.) e non essere uno slug riservato di WordPress.<\/p>\n<p>Questo \u00e8 ci\u00f2 che ho imparato ad essere l&#8217;argomento minimo ma perfettamente sufficientemente buono per registrare un tipo di post; considerando che si tratta di un normale CPT pubblico e desideri sovrascrivere qualsiasi etichetta che dice &quot;post&quot; o &quot;pagina&quot; con il nome effettivo del tuo CPT:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n});<\/code><\/pre>\n<h3>Una panoramica delle argomentazioni<\/h3>\n<p>Tieni presente che alcuni argomenti ereditano valori da altri argomenti. A meno che non siano impostati in modo esplicito, potrebbero avere lo stesso valore predefinito o l&#8217;opposto di un altro. Diversi argomenti ereditano lo stesso valore o il valore opposto dell&#8217;argomento <code>public<\/code>. Leggi <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentazione<\/a> per vedere qual \u00e8 il valore predefinito per ogni argomento e se \u00e8 necessario sovrascriverlo.<\/p>\n<p>Se ti va bene avere testi in admin che si riferiscono al tuo tipo di post come &quot;post&quot; o &quot;pagina&quot;, puoi saltare la definizione degli argomenti dell&#8217;etichetta. Probabilmente starai bene solo con <code>label<\/code>(nome plurale) e <code>labels<\/code>solo all&#8217;interno dell&#8217;array <code>singular_name<\/code>(nome singolare).<\/p>\n<p>Se non imposti esplicitamente <code>show_in_rest<\/code>true, il tuo tipo di pos personalizzato utilizzer\u00e0 il vecchio editor classico. <strong>Se desideri utilizzare l&#8217;editor Gutenberg per il tuo tipo di post personalizzato, devi impostare <code>show_in_rest<\/code>su true<\/strong>.<\/p>\n<p>L&#8217; <code>supports<\/code>argomento indica quali elementi sono disponibili quando si modifica un post nel tipo di post. Come minimo probabilmente vuoi il titolo, l&#8217;editor e l&#8217;immagine del post in primo piano.<\/p>\n<p>L&#8217; <code>rewrite<\/code>argomento con il minimo di elemento array <code>slug<\/code>dice a WordPress di riscrivere tutti i post singolari del tuo tipo di post per usare questo prefisso slug. Nell&#8217;esempio sopra, un singolo post di un libro otterrebbe un URL come; &#8221; <a href=\"http:\/\/example.com\/book\/i-robot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http:\/\/example.com\/book\/i-robot\/<\/a> &#8220;. Se sei interessato a come aggiungere un&#8217;impostazione di regola permalink nell&#8217;amministratore per consentire agli utenti del tema di decidere da soli questo slug, dai un&#8217;occhiata a <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-a-custom-permalink-setting-for-your-custom-post-type\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo post<\/a>.<\/p>\n<p>L&#8217;argomento per l&#8217;icona del menu (<code>menu_icon<\/code>) pu\u00f2 essere uno dei seguenti <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dashicon<\/a>, oppure puoi lasciarlo vuoto per mantenere l&#8217;impostazione predefinita. L&#8217;impostazione predefinita \u00e8 la stessa icona di Post. \u00c8 comunque una buona idea separare chiaramente i tipi di post personalizzati.<\/p>\n<p>Posizione menu (<code>menu_position<\/code>) ti consente di decidere la posizione del tuo tipo di post personalizzato nel menu di amministrazione. La documentazione elenca tutte le posizioni del menu di amministrazione, quindi puoi regolare; la posizione 5 \u00e8 subito dopo &quot;Post&quot;.<\/p>\n<p>C&#8217;\u00e8 un altro argomento (<code>taxonomies<\/code>) per allegare una tassonomia al tipo di post. Vedremo come aggiungere una tassonomia personalizzata pi\u00f9 avanti in questo post. Per aggiungere tassonomie al tuo tipo di post, aggiungi questo argomento all&#8217;array sopra;<\/p>\n<pre><code>'taxonomies' =&gt; ['book_author'],<\/code><\/pre>\n<h3>Una nota sui permalink e 404 errori non trovati<\/h3>\n<p>Dopo aver aggiunto il codice per la registrazione di un tipo di post personalizzato, noterai che la visualizzazione di un singolo post restituir\u00e0 l&#8217;errore &quot;404 non trovato&quot;. Questo perch\u00e9 \u00e8 necessario &quot;aggiornare i permalink&quot;.<\/p>\n<p>Vai su Impostazioni&gt; Permalink e fai semplicemente clic sul pulsante &quot;Salva modifiche&quot; (non \u00e8 necessario modificare nulla).<\/p>\n<p>Tieni presente che ogni volta che modifichi l&#8217; <code>rewrite<\/code>attributo dovrai aggiornare nuovamente i permalink.<\/p>\n<h2>Creazione di una tassonomia personalizzata<\/h2>\n<p>Una tassonomia personalizzata pu\u00f2 essere allegata a uno dei tipi di post di WordPress (post, pagine) o a un tipo di post personalizzato. Puoi anche allegare pi\u00f9 tassonomie a un tipo di post. Quando registri una tassonomia, devi fornire i tipi di post a cui desideri allegarla.<\/p>\n<p>Una tassonomia pu\u00f2 essere gerarchica (come le categorie di post in cui puoi creare una struttura ad albero) o basata su tag (come i tag di post). Questa \u00e8 davvero l&#8217;unica considerazione che devi sapere in anticipo, ad eccezione del suo identificatore slug. Come con i CPT, lo slug identificativo di una tassonomia deve essere unico e seguire una serie di regole.<\/p>\n<p>Per registrare una tassonomia personalizzata si utilizza la <code>register_taxonomy<\/code>funzione. Accetta lo <code>register_taxonomy<\/code>slug dell&#8217;identificatore univoco della tassonomia come primo argomento, un array di tipi di post a cui collegarlo come secondo e infine un array con tutto il resto degli argomenti. Ci sono molti argomenti, ma questo \u00e8 quello che ho sperimentato per essere il minimo ma sufficiente per registrare una tassonomia personalizzata (questo aggiunge una tassonomia tag-type\/non gerarchica):<\/p>\n<pre><code>add_action('init', function() {\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Si consiglia di aggiungere una chiamata di funzione subito dopo il <code>register_taxonomy<\/code>, per assicurarsi che venga &quot;collegato&quot; correttamente al CPT: <code>register_taxonomy_for_object_type<\/code>. Definisci la tua tassonomia come primo argomento e il CPT come secondo:<\/p>\n<pre><code>register_taxonomy_for_object_type('book_author', 'book');<\/code><\/pre>\n<p>Allo stesso modo del tipo di post sopra, <code>register_taxonomy<\/code>accetta molti pi\u00f9 argomenti e molti di questi ereditano o dipendono dal valore di altri argomenti. Leggi <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_taxonomy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentazione<\/a> per vedere qual \u00e8 il valore predefinito per ogni argomento e se \u00e8 necessario sovrascriverlo.<\/p>\n<h3>Una panoramica delle argomentazioni<\/h3>\n<p>Se ti va bene avere testi che si riferiscono alla tua tassonomia come &quot;tag&quot; (se gerarchico \u00e8 falso) o &quot;categoria&quot; (se gerarchico \u00e8 vero), probabilmente puoi saltare tutto l&#8217; <code>labels<\/code>array ad eccezione di forse <code>singular_name<\/code>.<\/p>\n<p>\u00c8 <code>show_admin_column<\/code>utile per aggiungere una colonna che mostra i termini associati nella tua tassonomia nella schermata di amministrazione CPT. Proprio come in Post, vedi una colonna che mostra le categorie associate. Questo argomento \u00e8 impostato di default su <code>false<\/code>(non mostrare la colonna), quindi mi piace sovrascriverlo.<\/p>\n<p>L&#8217;impostazione <code>show_in_rest<\/code>su true \u00e8 necessaria per avere la tua tassonomia visibile in Modifica post nell&#8217;editor Gutenberg, poich\u00e9 Gutenberg si basa sull&#8217;API REST.<\/p>\n<p>Allo stesso modo, come con i tipi di post personalizzati, probabilmente riceverai gli errori &quot;404 non trovati&quot; sulla tua tassonomia personalizzata. Vai su Impostazioni&gt; Permalink e fai semplicemente clic sul pulsante &quot;Salva modifiche&quot;.<\/p>\n<h2>Codice di esempio completo<\/h2>\n<p>Ecco un esempio completo di creazione di un CPT per i libri e di allegare due tassonomie personalizzate; genere (gerarchico) e autore del libro (tag).<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_author', 'book_genre'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n\u00a0\n    register_taxonomy('book_genre', ['book'], [\n        'label' =&gt; __('Genres', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-genre'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Genre', 'txtdomain'),\n            'all_items' =&gt; __('All Genres', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Genre', 'txtdomain'),\n            'view_item' =&gt; __('View Genre', 'txtdomain'),\n            'update_item' =&gt; __('Update Genre', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Genre', 'txtdomain'),\n            'new_item_name' =&gt; __('New Genre Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Genres', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Genre', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Genre:', 'txtdomain'),\n            'not_found' =&gt; __('No Genres found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_genre', 'book');\n\u00a0\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used Authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_author', 'book');\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una guida alla creazione di tipi di post personalizzati e tassonomie personalizzate in WordPress per codice. Copre gli argomenti da utilizzare per una creazione minima ma sufficiente.<\/p>\n","protected":false},"author":1,"featured_media":152888,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,896,720,918,1110,804,804,928,720,928,844,844,865,865],"tags":[1168],"class_list":["post-233604","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-sviluppatore","category-n-a","category-php-6","category-soggetti","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233604","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233604"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233604\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152888"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}