Cómo crear custom post types en WordPress: Guía completa y avanzada
Los Custom Post Types (CPTs) son una forma poderosa de extender WordPress más allá de las páginas y entradas. Con ellos, puedes organizar contenido personalizado como portafolios, eventos o productos, ofreciendo soluciones adaptadas a tus necesidades. En este artículo exploraremos cómo crearlos con register_post_type()y aprovecharemos al máximo sus opciones avanzadas.
Creación básica de un custom post type

El siguiente código crea un CPT básico llamado «Books»:
label: Nombre que se mostrará en el backend.public: Hace que el CPT sea visible en el frontend y backend.supports: Define qué elementos estarán disponibles en el editor (título, contenido, imagen destacada).
Opciones avanzadas de register_post_type()
1. Crear un CPT que sólo exista en el backend
Si necesitas un CPT accesible únicamente desde el backend, puedes configurar public en false:
<?php
function registerTaskPostType() {
$args = [
'label' => 'Tasks',
'public' => false,
'show_ui' => true,
'supports' => ['title', 'editor'],
];
register_post_type('task', $args);
}
add_action('init', 'registerTaskPostType');
Uso: Ideal para tareas internas o datos administrativos.
2. Crear un CPT jerárquico (padres e hijos dentro del mismo CPT)
Para permitir relaciones entre entradas del mismo CPT, utiliza el argumento hierarchical:
<?php
function registerProjectPostType() {
$args = [
'label' => 'Projects',
'public' => true,
'hierarchical' => true,
'supports' => ['title', 'editor'],
];
register_post_type('project', $args);
}
add_action('init', 'registerProjectPostType');
Uso: Los «Projects» tendrán un campo en el editor para seleccionar un «Parent Project». Esto es útil para crear relaciones jerárquicas como «categorías principales» o «subproyectos».
3. Colocar el CPT en un menú específico
Para que el CPT «Books» aparezca como subopción dentro del menú «Projects», configura el argumento show_in_menu:
<?php
function registerBookPostTypeWithMenu() {
$args = [
'label' => 'Books',
'public' => true,
'show_in_menu' => 'edit.php?post_type=project', // Aparece bajo "Projects"
'supports' => ['title', 'editor'],
];
register_post_type('book', $args);
}
add_action('init', 'registerBookPostTypeWithMenu');
4. Crear un CPT con submenús personalizados
Agrega submenús al menú principal del CPT con la función add_submenu_page:
<?php
function registerEventPostType() {
$args = [
'label' => 'Events',
'public' => true,
'show_in_menu' => true,
'supports' => ['title', 'editor'],
];
register_post_type('event', $args);
add_action('admin_menu', function() {
add_submenu_page(
'edit.php?post_type=event',
'Event Settings',
'Settings',
'manage_options',
'event-settings',
'eventSettingsCallback'
);
});
}
add_action('init', 'registerEventPostType');
function eventSettingsCallback() {
echo '<h1>Event Settings</h1>';
}
Uso: Útil para agregar configuraciones o reportes relacionados con el CPT.
5. Ocultar elementos del admin para un CPT
Para un CPT accesible sólo desde el backend y no visible en búsquedas o la API REST:
<?php
function registerHiddenPostType() {
$args = [
'label' => 'Hidden Items',
'public' => true,
'show_ui' => true,
'exclude_from_search' => true,
'show_in_rest' => false,
];
register_post_type('hidden_item', $args);
}
add_action('init', 'registerHiddenPostType');
6. Agregar un CPT dentro del menú de WooCommerce
Para que el CPT aparezca como opción secundaria dentro del menú principal de WooCommerce:
<?php
function registerCouponPostType() {
$args = [
'label' => 'Coupons',
'public' => true,
'show_in_menu' => 'woocommerce', // Coloca el CPT dentro del menú WooCommerce
'supports' => ['title', 'editor', 'custom-fields'],
];
register_post_type('coupon', $args);
}
add_action('init', 'registerCouponPostType');
Uso: Organiza contenido relacionado directamente con WooCommerce, como cupones personalizados.
Los Custom Post Types son una herramienta poderosa para extender WordPress. Aprovecha las opciones avanzadas de register_post_type()para personalizar la experiencia del usuario y el flujo de trabajo. Documenta tus configuraciones para facilitar el mantenimiento y asegúrate de probar tus implementaciones en un entorno de desarrollo.




