LucusHost, el mejor hosting

Guía fácil para dominar los Custom Post Types en WordPress (con y sin código)

Publicado el 26 de mayo de 2025
Actualizado el 7 de julio de 2025

Te traigo un tema que te abrirá un mundo de posibilidades en tu web de WordPress: ¡los «Custom Post Types»! Si alguna vez has sentido que las entradas y las páginas se te quedan cortas para organizar el contenido, ¡este artículo es para ti!

    Vamos a descubrir qué son estas maravillas y cómo puedes crearlas para tener tu sitio web de WordPress como un pincel. Prepárate, que empezamos.

    🤖 Haz un resumen de este contenido con Inteligencia Artificial 🤖

    ¿Qué son los «Custom Post Types» en WordPress y por qué los necesitas?

    Imagina tu web de WordPress como una casa. Por defecto, tienes habitaciones para «entradas» (tu blog, noticias) y «páginas» (quiénes somos, contacto). Pero, ¿qué pasa si quieres tener una habitación para «recetas», otra para «proyectos» o incluso una para «testimonios»? Si metes todo en entradas, ¡se vuelve un lío monumental!

    Aquí es donde entran en juego los «Custom Post Types» (CPT), que en español traducimos como «tipos de contenido personalizado». Son, ni más ni menos, que nuevas «categorías» o «tipos» de contenido que puedes añadir a tu WordPress, más allá de las entradas y páginas que ya conoces.

    Piensa en ellos como un lienzo en blanco donde puedes definir exactamente qué tipo de información vas a guardar. ¿Tienes un blog de recetas? Podrías crear un CPT llamado «recetas» con campos específicos para ingredientes, tiempo de preparación, nivel de dificultad, etc. ¡Las posibilidades son infinitas!

    ¿Por qué te van a hacer la vida más fácil?

    1. Organización: ¡Adiós al caos! Cada tipo de contenido tiene su propio lugar, facilitando tus visitantes encuentren lo que buscan.
    2. Flexibilidad: Puedes adaptar WordPress a tus necesidades, no al revés. Si tienes algo muy específico que mostrar, un CPT es la solución.
    3. Mejor SEO (si los usas bien): Al tener una estructura de contenido más lógica y específica, Google puede entender mejor de qué va tu web, lo que puede ayudarte a posicionarte.
    4. Diseño a medida: Una vez que tienes tu CPT, puedes diseñar plantillas específicas para mostrar ese contenido de forma única y atractiva.
    5. Gestión eficiente: Olvídate de añadir campos extraños a tus entradas o páginas. Con los CPT, cada cosa va en su sitio.

    En resumen, los Custom Post Types son esa herramienta secreta que te permite llevar tu WordPress al siguiente nivel, transformándolo de un simple blog en una plataforma a medida para cualquier tipo de proyecto. ¡Son la leche, vamos!

    ¿Cómo crear tus propios «Custom Post Types»?

    Ahora que ya sabes lo chulos que son, seguro que te estás preguntando: «Vale, Jose Ramón, ¿Y cómo los creo?» Pues mira, tienes tres caminos principales, cada uno con sus pros y sus contras. ¡Tú eliges el que mejor te venga!

    Opción 1: El camino fácil (con un plugin)

    Si eso de meter mano al código te da un poco de respeto o simplemente quieres ir al grano sin complicaciones, los plugins son tu mejor amigo. Hay varios, pero te voy a recomendar uno que es una maravilla y muy intuitivo: Custom Post Type UI (CPT UI).

    ¡Es como tener un mago que hace el trabajo sucio por ti!

    Paso a paso con Custom Post Type UI:

    1. Instala y activa el plugin: Ve a tu escritorio de WordPress, a «Plugins» > «Añadir nuevo», busca «Custom Post Type UI» e instálalo y actívalo. ¡Fácil, eh!
    2. Añadir un nuevo tipo de contenido: Una vez activado, verás una nueva opción en tu menú de WordPress llamada «CPT UI». Haz clic en «Añadir/Editar tipos de contenido». Aquí te va a pedir un montón de cosas, pero no te agobies, la mayoría son opciones avanzadas. ¡Vamos a lo básico!
      • Slug de tipo de contenido: Este es el identificador único de tu CPT, como su DNI. Por ejemplo, si vas a crear un CPT para recetas, podrías poner receta o recetas. ¡Importante que sea en minúsculas y sin espacios!
      • Etiqueta plural: ¿Cómo quieres que aparezca en el menú de WordPress? Por ejemplo, «Recetas».
      • Etiqueta singular: ¿Y en singular? Por ejemplo, «Receta».
      Con esos tres ya tienes la base. ¡El resto es opcional pero te recomiendo echarle un vistazo! Por ejemplo, en la sección de «etiquetas», puedes personalizar los textos que aparecen en el administrador de WordPress (añadir nueva receta, editar receta, etc.). Y lo más importante para que funcione como una entrada o una página, en la sección de «soporte», asegúrate de marcar opciones como título, editor, revisones, imagen destacada y campos personalizados. Esto te permitirá tener todas las funcionalidades que ya conoces.
    3. ¡A crear contenido!: Una vez que guardes los cambios, verás que aparece una nueva opción en tu menú lateral de WordPress con el nombre que le has puesto a tu CPT (por ejemplo, «Recetas»). Ya puedes empezar a añadir tu contenido personalizado como si fuera una entrada normal.

    Ventajas de usar un plugin:

    • Súper rápido y fácil: No necesitas saber ni una pizca de código.
    • Interfaz amigable: Todo es visual, con opciones claras.
    • Ideal para principiantes: Si estás empezando, es la mejor opción para no complicarte la vida.

    Desventajas:

    • Dependencia del plugin: Si en algún momento desactivas el plugin, tus CPT desaparecerán (aunque el contenido seguirá en la base de datos).
    • Posible «inflado» de código: Algunos plugins pueden añadir código que no necesitas, aunque CPT UI es bastante ligero.

    Opción 2: La vía pro (con código)

    Si te gusta trastear con el código y quieres tener un control total, crear tus CPT a mano es la opción ideal. ¡Es más robusto y no dependes de plugins externos!

    Esto lo haremos añadiendo un poco de código en el archivo functions.php de tu tema hijo.

    ¡Ojo! Siempre, siempre, siempre en un tema hijo para no perder tus cambios cuando actualices el tema principal.

    Aquí te dejo un ejemplo de código para crear un CPT llamado «Proyectos»:

    <?php
    /**
     * Registra un custom post type 'proyecto'.
     */
    function jrb_register_proyecto_cpt() {
    
        $labels = array(
            'name'                  => _x( 'Proyectos', 'Post Type General Name', 'text_domain' ),
            'singular_name'         => _x( 'Proyecto', 'Post Type Singular Name', 'text_domain' ),
            'menu_name'             => __( 'Proyectos', 'text_domain' ),
            'name_admin_bar'        => __( 'Proyecto', 'text_domain' ),
            'archives'              => __( 'Archivo de Proyectos', 'text_domain' ),
            'attributes'            => __( 'Atributos del Proyecto', 'text_domain' ),
            'parent_item_colon'     => __( 'Proyecto Padre:', 'text_domain' ),
            'all_items'             => __( 'Todos los Proyectos', 'text_domain' ),
            'add_new_item'          => __( 'Añadir Nuevo Proyecto', 'text_domain' ),
            'add_new'               => __( 'Añadir Nuevo', 'text_domain' ),
            'new_item'              => __( 'Nuevo Proyecto', 'text_domain' ),
            'edit_item'             => __( 'Editar Proyecto', 'text_domain' ),
            'update_item'           => __( 'Actualizar Proyecto', 'text_domain' ),
            'view_item'             => __( 'Ver Proyecto', 'text_domain' ),
            'view_items'            => __( 'Ver Proyectos', 'text_domain' ),
            'search_items'          => __( 'Buscar Proyecto', 'text_domain' ),
            'not_found'             => __( 'No encontrado', 'text_domain' ),
            'not_found_in_trash'    => __( 'No encontrado en la Papelera', 'text_domain' ),
            'featured_image'        => __( 'Imagen destacada', 'text_domain' ),
            'set_featured_image'    => __( 'Establecer imagen destacada', 'text_domain' ),
            'remove_featured_image' => __( 'Quitar imagen destacada', 'text_domain' ),
            'use_featured_image'    => __( 'Usar como imagen destacada', 'text_domain' ),
            'insert_into_item'      => __( 'Insertar en proyecto', 'text_domain' ),
            'uploaded_to_this_item' => __( 'Subido a este proyecto', 'text_domain' ),
            'items_list'            => __( 'Lista de Proyectos', 'text_domain' ),
            'items_list_navigation' => __( 'Navegación de lista de proyectos', 'text_domain' ),
            'filter_items_list'     => __( 'Filtrar lista de proyectos', 'text_domain' ),
        );
        $args = array(
            'label'                 => __( 'Proyecto', 'text_domain' ),
            'description'           => __( 'Tipos de contenido para proyectos', 'text_domain' ),
            'labels'                => $labels,
            'supports'              => array( 'title', 'editor', 'thumbnail', 'revisions' ), // lo que soporta (título, editor, imagen destacada, etc.)
            'taxonomies'            => array( 'category', 'post_tag' ), // puedes añadir taxonomías existentes o personalizadas
            'hierarchical'          => false, // ¿se comportan como páginas (true) o como entradas (false)?
            'public'                => true, // ¿es público en el frontend?
            'show_ui'               => true, // ¿aparece en el admin?
            'show_in_menu'          => true, // ¿aparece en el menú principal del admin?
            'menu_position'         => 5, // posición en el menú (5 es debajo de 'entradas')
            'menu_icon'             => 'dashicons-hammer', // icono para el menú (puedes buscar en 'dashicons')
            'show_in_admin_bar'     => true,
            'show_in_nav_menus'     => true,
            'can_export'            => true,
            'has_archive'           => true, // ¿tiene una página de archivo para todos los proyectos?
            'exclude_from_search'   => false, // ¿se excluye de la búsqueda de wordpress?
            'publicly_queryable'    => true,
            'capability_type'       => 'post',
        );
        register_post_type( 'proyecto', $args );
    
    }
    add_action( 'init', 'jrb_register_proyecto_cpt', 0 );

    Cosas importantes del código:

    • jrb_register_project_cpt: Este es el nombre de la función. Puedes ponerle el nombre que quieras, pero siempre con un prefijo (como jrb_ en este caso) para evitar conflictos con otros plugins o temas.
    • register_post_type( 'proyecto', $args ): Aquí es donde registramos el CPT. 'proyecto' es el «slug» que le damos, el identificador único.
    • 'labels': Aquí defines todas las etiquetas que WordPress usará para mostrar tu CPT en el panel de administración. ¡Personalízalas a tu gusto!
    • 'supports': Esto es fundamental. Aquí le dices a WordPress qué funcionalidades quieres que tenga tu CPT (título, editor de texto, imagen destacada, etc.).
    • 'taxonomies': Si quieres asociar tu CPT a categorías o etiquetas existentes, o incluso a tus propias taxonomías personalizadas, lo defines aquí.
    • 'hierarchical': Si lo pones a true, tu CPT se comportará como las páginas (puedes tener jerarquía, como página padre e hija). Si lo pones a false, como las entradas (sin jerarquía).
    • 'has_archive': Si lo pones a true, WordPress creará una página de archivo donde se listarán todos los elementos de este CPT (por ejemplo, tudominio.com/proyectos/).
    • 'menu_icon': ¿Quieres un icono chulo en el menú lateral? Puedes usar los «Dashicons» de WordPress. ¡Búscalo en Google y elige el que más te guste!
    • add_action( 'init', 'jrb_register_project_cpt', 0 ): Esta línea es la que activa la función cuando WordPress se inicializa.

    Paso a paso con código:

    1. Accede al archivo functions.php de tu tema hijo: Esto lo puedes hacer de varias maneras:
      • A través de FTP: Conéctate a tu servidor y ve a wp-content/themes/nombre-de-tu-tema-hijo/functions.php.
      • Desde el panel de administración de WordPress: Ve a «apariencia» > «editor de archivos de tema» (siempre con cuidado, un error aquí puede tumbar tu web). Selecciona tu tema hijo y busca functions.php.
    2. Pega el código: Copia el código que te he dado y pégalo al final del archivo functions.php.
    3. Guarda los cambios: ¡Y ya está! Refresca tu panel de administración de WordPress y verás el nuevo CPT aparecer.

    Ventajas de usar código:

    • Control total: Tienes la flexibilidad de personalizar cada aspecto de tu CPT.
    • Rendimiento optimizado: No añades código extra de un plugin que quizás no necesitas.
    • Independencia de plugins: Tus CPT vivirán felices aunque desactives otros plugins.
    • Más «limpio» para desarrolladores: Es el camino preferido por los que se dedican al desarrollo.

    Desventajas:

    • Requiere conocimientos de código: Un error puede darte un dolor de cabeza.
    • Más tiempo: Tienes que escribir el código manualmente.

    Opción 3: Con un plugin de funciones (el punto medio)

    Si la idea de tocar el functions.php te da un poco de yuyu (¡que es normal, eh!) pero tampoco quieres depender de un plugin específico para cada CPT, la solución perfecta es usar un plugin de funciones. Estos plugins te permiten añadir fragmentos de código personalizados a tu WordPress de forma segura, sin modificar los archivos de tu tema.

    Si no quieres crear uno propio, el más conocido y recomendado es Code Snippets.

    Paso a paso con Code Snippets:

    1. Instala y activa el plugin: Ve a tu escritorio de WordPress, a «Plugins» > «Añadir nuevo», busca «Code Snippets» e instálalo y actívalo.
    2. Añade un nuevo «snippet» (fragmento de código): Una vez activado, verás una nueva opción en tu menú de WordPress llamada «Snippets». Haz clic en «Añadir nuevo».
    3. Copia y pega el código del CPT: En la pantalla de creación del snippet, verás un editor de código. Aquí es donde debes pegar el mismo código PHP que te di en la opción 2 (el de jrb_register_proyecto_cpt).
    4. Dale un nombre y activa el snippet: Ponle un título descriptivo a tu snippet (por ejemplo, «Registro CPT Proyectos»). Asegúrate de que la opción «Run snippet everywhere» (ejecutar el fragmento en todas partes) esté marcada y luego haz clic en «Guardar cambios y activar».

    Ventajas de usar un plugin de funciones:

    • Seguridad: El código se aísla de tu tema, así que si hay un error en el snippet, no se te cae la web entera. Simplemente puedes desactivarlo desde el panel de administración.
    • Organización: Puedes tener todos tus fragmentos de código personalizados en un solo lugar, bien organizados.
    • Facilidad de gestión: Activar o desactivar un CPT es tan sencillo como activar o desactivar el snippet correspondiente.
    • Menos dependencia de plugins específicos: Aunque usas un plugin para gestionar el código, no dependes de él para que el CPT exista (una vez creado, el código estará ahí).

    Desventajas:

    • Necesitas el plugin de funciones: Aunque es una dependencia menor, sigue siendo un plugin extra en tu instalación.
    • Requiere copiar el código: Aún necesitas entender qué copiar del código PHP.

    ¡Consejos extra!

    Después de crear un Custom Post Type (ya sea con plugin o con código), es MUY IMPORTANTE que vayas a «Ajustes» > «Enlaces permanentes» en tu panel de administración de WordPress y simplemente hagas clic en «Guardar cambios» (aunque no cambies nada).

    Esto «refresca» las reglas de reescritura de WordPress y asegura que las URLs de tus nuevos CPT funcionen correctamente. ¡No te olvides de este paso, es un clásico!

    Si vas a crear tu CPT con código, te recomiendo usar GenerateWP, un sitio web genial para generar CPTs, taxonomías y otras cosas guapas para usar en tu sitio.

    Y si crees que te vas a meter en un bancal que no vas a saber labrar, ¡pide ayuda!

    Y ahora, ¿Qué hago con mis «Custom Post Types»?

    Una vez que tienes tus CPT creados, el siguiente paso es mostrar ese contenido en tu web. Aquí es donde la cosa se pone interesante:

    • Plantillas personalizadas: Puedes crear archivos de plantilla específicos en tu tema para que tus CPT se muestren de forma diferente. Por ejemplo, un single-receta.php para mostrar cada receta de forma única, o un archive-receta.php para listar todas las recetas.
    • Maquetadors visuales: Si usas Elementor, Divi o un constructor similar, la mayoría te permiten diseñar plantillas para CPTs o mostrar contenido de CPTs con sus módulos.
    • Plugins de campos personalizados: Para ir más allá, te recomiendo plugins como Advanced Custom Fields (ACF). Con ACF, puedes añadir campos personalizados a tus CPT (como «ingredientes» para tus recetas, «cliente» para tus proyectos, etc.) y así hacer que cada tipo de contenido sea superespecífico. ¡Es la combinación perfecta!

    En resumen: ¡Dale rienda suelta a tu creatividad!

    Los Custom Post Types son una herramienta superpoderosa en WordPress que te permite organizar tu contenido de una manera mucho más eficiente. Ya sea que te decantes por la comodidad de un plugin o por el control que te da el código, lo importante es que empieces a usarlos.

    Verás cómo tu web cobra una nueva vida y se adapta perfectamente a todo lo que quieres mostrar, sin líos ni quebraderos de cabeza. Así que, ¡a darle caña a esos CPTs y a crear una web que sea la envidia de todos!

    ¿Te animas a crear tu primer Custom Post Type? ¿Qué tipo de contenido te gustaría organizar en tu web? ¿Crees que he metido la pata en algo? Deja tu comentario 🙂

    Si creees que esto puede ser de utilidad a alguien más, pues... compártelo que es gratis 🙂

    Te recomiendo

    Libros que me ayudan

    Donde alojo mis sitios web

    LucusHost, el mejor hosting

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    He leído y acepto el Aviso legal y la Política de Privacidad.

    Los datos de tus comentarios están seguros, según la política de privacidad.
    Responsable » Jose Ramón Bernabeu Guillem
    Finalidad » Moderar los comentarios
    Legitimación » Tu consentimiento al marcar la casilla verificación
    Destinatarios » Los datos que proporciones estarán ubicados en los servidores de LucusHost, proveedor de hosting de este sitio
    Derechos » por supuesto tendrás derecho, entre otros, a acceder, rectificar, limitar y suprimir tus datos
    Sitio alojado en un servidor verde según The Green Web Foundation

    LucusHost, el mejor hosting

    Aviso legal | Condiciones de contratación | Política de privacidad | Política de cookies
    © 2017-2025 · Jose R. Bernabeu ·
    linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram