Come inserire un Custom Post Type menù sotto un custom menù

Sebbene il titolo di questo post possa essere un po’ complesso, questa è una di quelle “chicche” che ogni sviluppatore WordPress farebbe bene a tenere a mente.

Durante lo sviluppo di un plugin si ha spesso la necessità di creare dei Custom Post Type utilizzando la funzione register_post_type(). WordPress inserirà pertanto una nuova voce nel menù laterale del nostro pannello di amministrazione per poter gestire tramite CRUD i nostri CPT:

Questo è il tipo di menù che WordPress inserirà nella barra laterale del pannello di amministrazione non appena verrà registrato il Custom Post Type.
Questo è il tipo di menù che WordPress inserirà nella barra laterale del pannello di amministrazione non appena verrà registrato il Custom Post Type.

Ma come fare per inserire l’intero set di voci di gestione del CPT direttamente sotto un altro menu custom, magari creato appositamente per il nostro plugin, come nell’esempio qui sotto?

LA voce di gestione CRUD del nostro CPT è stata spostata come voce di sub-menu di un menù principale custom.
La voce di gestione CRUD del nostro CPT è stata spostata come voce di sub-menu di un menù principale custom.

Il trucco è abbastanza semplice, e ci mostra tutta la flessibilità e la potenza di WordPress:

  1. Al momento della registrazione del CPT tramite la funzine register_post_type(), è necessario impostare il parametro show_in_menu a false;
  2. Al momento della registrazione di una voce di sotto menù, del nostro menù custom, dobbiamo impostare la voce relativa alla callback a null e lo slug all’url di modifica del CPT, che apparirà nel seguente formato:
    edit.php?post_type=your_custom_post_type_name_goes_here

Andiamo quindi subito dritti al codice per capire come funziona il tutto:

/**
 * Al momento della registrazione del vostro Custom Post Type
 * impostate il parametro set show_in_menu a false.
 *
 * @return void
 */
function register_my_custom_post_type() {
 
    $args = array(
        'labels'             => array(), // Tutte le vostre labels. 
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => false, // <-- Impostate questo parametro a false.
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'miei-cpt' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
    );
 
    register_post_type( 'miei-cpt', $args );
}

// La funzione di registrazione dei CPT va sempre agganciata all'hook init.
add_action( 'init', 'register_my_custom_post_type' );
 
 
// 2. Quando andiamo a registrare una voce di sotto menu del nostro custom menu, impostate a NULL il valore del Callback e come slug inserite la url del vostro Custom Post Type.
add_submenu_page( 'miei-cpt', 'Tutti i miei CPT', 'Tutti i miei CPT', 'manage_options', 'edit.php?post_type=miei-cpt', NULL );

Questo è tutto. Ricordate però che la voce “Aggiungi nuovo” verrà implicitamente omessa all’interno del vostro custom menù, a meno che non la ricreiate agganciando il relativo URL di modifica del vostro Custom Post Type.