Cuándo registras un custom post type (tipo de post personalizado, abreviado CPT) en WordPress, puedes tener toda la interfaz para su gestión sin mover un dedo. Para acceder a esta interfaz WordPress crea un menú de nivel superior en el área de administración. Todo lo que hace falta para esto es registrar el CPT con el parámetro show_in_menu = true. Por ejemplo:

add_action('init', 'cyb_custom_post_type');
function cyb_custom_post_type() {
    $args = array(
        'show_in_menu' => true,
        'label'        => 'Mi CPT',
        'public'       => true
    );
    register_post_type( 'cpt', $args );
}

Y tendremos el menú:

CPT menú nivel superior
CPT menú nivel superior

Hoy me llamó la atención pregunta en WPSE (Custom Post Type Nav to Subpage) acerca de como mostrar este menú bajo la sección «Ajustes» del área de administración de WordPress. El usuario decía conocer el parámetro show_in_menu para la función register_post_type(), pero obviamente no lo conocía del todo. Si leemos la documentación de resgister_post_type() podemos ver que el parámetro show_in_menu acepta tres posibles valores:

  • false – no mostrar el menú
  • true – mostrar el menú en nivel superior
  • 'some string' – Cadena de otra página de nivel superior, como ‘tools.php’, ‘plugins.php, ‘options-general.php’, ‘edit.php’, ‘edit.php?post_type=page’, etc. El menú del CPT se pondrá como submenú de esta página.

Por tanto, podemos poner el menú de nuestro CPT dónde queramos, tan sólo necesitamos conocer el «string» de la página bajo la cuál queremos que aparezca. Por ejemplo, como submenu de «Ajustes» se utilizará la cadena options-general.php:

add_action('init', 'cyb_custom_post_type');
function cyb_custom_post_type() {
    $args = array(
        'show_in_menu' => 'options-general.php',
        'label'        => 'Mi CPT',
        'public'       => true
    );
    register_post_type( 'cpt', $args );
}
CPT como submenu de "Ajustes"
CPT como submenu de «Ajustes»

Incluso podríamos ponerlo bajo el menú «Plugins»:

add_action('init', 'cyb_custom_post_type');
function cyb_custom_post_type() {
    $args = array(
        'show_in_menu' => 'plugins.php',
        'label'        => 'Mi CPT',
        'public'       => true
    );
    register_post_type( 'cpt', $args );
}
Menu del CPT bajo la sección "Plugins"
Menu del CPT bajo la sección «Plugins

Fácil, ¿verdad? Una vez más la flexibilidad de WordPress no defrauda.