
I custom post type sono la risposta alla domanda: e se mi servisse qualcosa di più di un semplice Articolo o di una semplice Pagina? Se volessi creare articoli che riguardano libri, ad esempio, di cosa avrei bisogno? Un libro ha il titolo, spesso il sottotitolo, un’immagine di copertine, la descrizione dietro (conosciuta come “quarta di copertina”) il codice ISBN, uno o più autori e una casa editrice.
Potrei inserire tutte queste informazioni nel campo standard di un Articolo o di una Pagina in WordPress, ma avere la voce di menu Articolo proprio sotto le Pagine, è molto più comodo, potrei facilmente distinguere i Libri dagli Articoli e dalle Pagine.
Con i Custom Post Type è possibile creare delle tipologie di articoli personalizzati, come i Libri, Vini, Scarpe o Vestiti come nell’immagine:

Come dicevamo, ogni tipologia di articolo (Libri, Vini o qualsiasi altra cosa) avrà probabilmente bisogno di campi personalizzati (IBAN, autore, etc) come descritto in questo articolo, che spiega come creare i box con campi personalizzati da agganciare ad Articoli, Pagine o Custom post type.
Di seguito invece il codice per creare il Custom Post Type “Libri” con due campi di esempio (ISBN e sottotitolo), per aggiungere altri campi basterà poco più di un copia/incolla.
<?php
function gdcf_cpt_Libro() {
$labels = array(
'name' => _x( 'Libri', 'cpt_libri' ),
'singular_name' => _x( 'Libro', 'cpt_libro' ),
'add_new' => _x( 'Nuovo', 'Libro' ),
'add_new_item' => __( 'Nuovo Libro' ),
'edit_item' => __( 'Edit Libro' ),
'new_item' => __( 'Nuovo Libro' ),
'all_items' => __( 'Tutti i Libri' ),
'view_item' => __( 'Vedi Libro' ),
'search_items' => __( 'Cerca libri' ),
'not_found' => __( 'Nessun libro trovato' ),
'not_found_in_trash' => __( 'Nessun libro trovato nel cestino' ),
'parent_item_colon' => '',
'menu_name' => 'Libri'
);
$args = array(
'labels' => $labels,
'description' => '',
'public' => true,
'menu_position' => $menu_position,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt'),
'has_archive' => true,
);
register_post_type( 'libri', $args );
}
add_action( 'init', 'gdcf_cpt_Libro' );
function gdcf_Libro_save_post_meta_boxes(){
global $post;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if(isset($post)){
if ( get_post_status( $post->ID ) === 'auto-draft' ) {
return;
}
}
if(isset($_POST[ "_gdcf_post_Libro_ISBN" ])){
update_post_meta( $post->ID, "_gdcf_post_Libro_ISBN", sanitize_text_field( $_POST[ "_gdcf_post_Libro_ISBN" ] ) );
}
if(isset($_POST[ "_gdcf_post_Libro_sottotitolo" ])){
update_post_meta( $post->ID, "_gdcf_post_Libro_sottotitolo", sanitize_text_field( $_POST[ "_gdcf_post_Libro_sottotitolo" ] ) );
}
}
add_action( 'save_post', 'gdcf_Libro_save_post_meta_boxes' );
function gdcf_cpfield_metabox_Libro(){?>
<fieldset><?php
global $post;
$ISBN = $sottotitolo = '';
$custom = get_post_custom( $post->ID );
if(isset($custom[ "_gdcf_post_Libro_ISBN" ][ 0 ])){
$ISBN = $custom[ "_gdcf_post_Libro_ISBN" ][ 0 ];
}
if(isset($custom[ "_gdcf_post_Libro_sottotitolo" ][ 0 ])){
$sottotitolo = $custom[ "_gdcf_post_Libro_sottotitolo" ][ 0 ];
}
?><div for="_gdcf_post_Libro_ISBN "><?php _e( 'ISBN', 'events' )?></div>
<textarea name="_gdcf_post_Libro_ISBN" id="_gdcf_post_Libro_ISBN"><?php echo htmlspecialchars_decode( $ISBN );?></textarea>
</fieldset>
<?php
wp_nonce_field( 'libri_form_metabox_nonce', 'libri_form_metabox_process' );
}
La variabile $menu_position può avere solo alcuni valori specifici, che vale la pena guardare direttamente sul sito ufficiale di WordPress https://developer.wordpress.org/reference/functions/register_post_type/#menu_position
Se hai bisogno di inserire un custom post type via codice, puoi utilizzare la stessa funzione (wp_insert_post) normalmente utilizzata per inserire un post o una page.
$custompost = array(
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'publish',
'post_author' => 1, //#ID dell'utente WordPress
'post_category' => 1, //#ID della categoria
'post_type' => 'libri'
);
$post_ID = wp_insert_post($custompost);
Per avere le Categorie nel custom post type basta registrarle:
add_action( 'init', 'libri_category', 0 );
function libri_category() {
register_taxonomy( 'libri_categories', 'libri', array( 'hierarchical' => true, 'label' => 'categorie', 'query_var' => true, 'rewrite' => true ) );
}