¿Cómo gestionar tus propios CPT o Custom Post Types?

Por defecto WordPress te facilita dos tipos de contenido llamados post y páginas para insertar el contenido en tu web, y en muchos casos esto es suficiente.

Pero… si necesitas mostrar y estructurar en tu web un contenido diferente, o sencillamente diferentes tipos de contenido que no quieres que vayan todos juntos como un blog, es importante que aprendas a gestionar tus propios CPT o Custom Post Types o contenido personalizado.

Si usas plugins es probable que ya tengas algunos nuevos CPT en tu web, como por ejemplo productos si instalas Woocommerce o el CPT portfolio si instalas un plugin de portfolio.

En realidad todo lo que tiene que ver con contenido gira alrededor de los post, todo son diferentes tipos de post, y es bueno que aprendas a crearlos, ya que es muy fácil.

Si no quieres tocar nada de código, pero quieres gestionar tus propios CPT o Custom Post Types te recomiendo probar el plugin Custom Post Type UI el cual te permite crearlos en un periquete. 😉

Ten en cuenta que si creas CPT con este plugin o cualquier otro dependerás de tener siempre instalado ese plugin si no quieres perder todo tu nuevo contenido… bueno en realidad seguirá en la base de datos pero no podrás verlo.

Antes de perderlo puedes migrarlo. Hay formas sencillas de pasar un contenido de un tipo de post o CPT a otro, como por ejemplo el plugin Post Type Switcher que te permite hacerlo de modo manual uno a uno.

Si necesitas cambiar muchos CPT de golpe puedes probar con el plugin Convert Post Types, aunque no lo recomiendo porque lleva tiempo sin actualizarse y porqué no gestiona los custom fields asociados a los CPT, por lo que tendrás que gestionarlo de otro modo como tocando directamente la base de datos.

¿que te recomiendo entonces?

Que NO instales temas, plantillas, themes,.. o como lo quieras llamar… que añadan CPT a tu WordPress porque acabarás si o si teniendo problemas.

¡Hazlo con código o con plugins!

Lo mejor para gestionar tus propios CPT o Custom Post Types es hacerlo tu mismo con código. Te dejo un par de ejemplos, más simple y más completo, para que los modifiques y adaptes a tu gusto. El primero tiene lo mínimo y el segundo permite una mayor personalización.

<?php
add_action( 'init', 'pc_crear_cpt_recetas' );
/**
 * Crear CPT 'recetas'
 */
function pc_crear_cpt_recetas() {
     $args = array(
     'public' => true,
     'label' => 'Recetas'
        );
 
        register_post_type( 'recetas', $args );
}
<?php
 
if ( ! function_exists('pc_crear_cpt_recetas') ) {
/**
 * Crear CPT 'recetas'
 */
function pc_crear_cpt_recetas() {
 
        $labels = array(
                'name'                  => _x( 'Recetas', 'Post Type General Name', 'text_domain' ),
                'singular_name'         => _x( 'Receta', 'Post Type Singular Name', 'text_domain' ),
                'menu_name'             => __( 'Recetas', 'text_domain' ),
                'name_admin_bar'        => __( 'Recetas', 'text_domain' ),
                'archives'              => __( 'Recetas', 'text_domain' ),
                'attributes'            => __( 'Recetas', 'text_domain' ),
                'parent_item_colon'     => __( 'Padre Recetas', 'text_domain' ),
                'all_items'             => __( 'Todas las recetas', 'text_domain' ),
                'add_new_item'          => __( 'Añadir nueva receta', 'text_domain' ),
                'add_new'               => __( 'Añadir nueva', 'text_domain' ),
                'new_item'              => __( 'Nueva receta', 'text_domain' ),
                'edit_item'             => __( 'Editar receta', 'text_domain' ),
                'update_item'           => __( 'Actualizar receta', 'text_domain' ),
                'view_item'             => __( 'Ver receta', 'text_domain' ),
                'view_items'            => __( 'Ver recetas', 'text_domain' ),
                'search_items'          => __( 'Buscar recetas', 'text_domain' ),
                'not_found'             => __( 'Recetas no encontradas', 'text_domain' ),
                'not_found_in_trash'    => __( 'No encontradas en la papelera', 'text_domain' ),
                'featured_image'        => __( 'Imagen destacada receta', 'text_domain' ),
                'set_featured_image'    => __( 'Establecer imagen receta', 'text_domain' ),
                'remove_featured_image' => __( 'Borrar imagen receta', 'text_domain' ),
                'use_featured_image'    => __( 'Usar como imagen destacada', 'text_domain' ),
                'insert_into_item'      => __( 'Insertar en receta', 'text_domain' ),
                'uploaded_to_this_item' => __( 'Subir a recetas', 'text_domain' ),
                'items_list'            => __( 'Listado recetas', 'text_domain' ),
                'items_list_navigation' => __( 'Listado recetas', 'text_domain' ),
                'filter_items_list'     => __( 'Listado filtrado recetas', 'text_domain' ),
        );
        $args = array(
                'label'                 => __( 'Receta', 'text_domain' ),
                'description'           => __( 'CPT Recetas', 'text_domain' ),
                'labels'                => $labels,
                'supports'              => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'trackbacks', 'revisions', 'custom-fields', 'page-attributes', 'post-formats', ),
                'taxonomies'            => array( 'category', 'post_tag' ),
                'hierarchical'          => false,
                'public'                => true,
                'show_ui'               => true,
                'show_in_menu'          => true,
                'menu_position'         => 5,
                'menu_icon'             => 'dashicons-welcome-write-blog',
                'show_in_admin_bar'     => true,
                'show_in_nav_menus'     => true,
                'can_export'            => true,
                'has_archive'           => true,                
                'exclude_from_search'   => false,
                'publicly_queryable'    => true,
                'capability_type'       => 'page',
        );
        register_post_type( 'recetas', $args );
 
}
add_action( 'init', 'pc_crear_cpt_recetas', 0 );
 
}

Recuerda incorporar tu código en tu propio plugin, ya que es más fácil de lo que imaginas: ¿Cómo crear un plugin de personalizaciones para WordPress?