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.