[Tutorial] Gestire i Custom Post Type (CPT) in WordPress

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

Questo sito web non offre alcun cookie perchè non ho interesse a tracciare le attività di nessun utente attraverso i cookie e quindi non ne ho inseriti.
Il tema e i plugin sono realizzati da me e quindi nessun altro è autorizzato ad inserire cookie su questo sito web.
Se qualcuno dovesse individuare un cookie da qualche parte su questo sito web, non ce l'ho messo io,
ed è pregato di farmelo sapere, così potrò cercare e distruggere il cookie eventualmente individuato.
I software e i pezzi di codice condivisi su questo sito web sono da considerarsi a scopo educativo e senza alcuna garanzia
© 2021