Skip to content

Todo para WordPress, el desarrollo web — y mucho más

💡 Cómo crear un custom post type en WordPress: código y plugin

💡 Cómo crear un custom post type en WordPress: código y plugin

Publicaciones y Páginas estándar cubren la mayoría de las tareas de un sitio web típico. Pero cuando entra en juego un catálogo de productos, una base de datos inmobiliaria o un portafolio de proyectos, estos dos tipos de contenido ya no son suficientes. Mezclar productos con borradores de blog es incómodo y sobrecargar las páginas con campos personalizados es un camino directo al caos en el panel de administración.

WordPress resuelve este problema mediante los Custom Post Types, Custom Post Types (CPT). Usted crea una sección separada en el menú lateral con sus propios campos, categorías y plantillas de visualización. Los productos viven separados de los artículos. Los eventos no se mezclan con las páginas. Los datos permanecen donde corresponde.

A continuación, se presentan dos métodos probados: mediante código usando register_post_type() (flexible, sin plugins adicionales) y mediante el plugin gratuito CPT UI (no requiere PHP). Ambos funcionan en WordPress 6.7+ y han sido probados en sitios en producción.

💡 Resumen rápido:

  • Registre un nuevo tipo de contenido mediante la función principal register_post_type(), sin plugins, con control total sobre los parámetros.
  • Alternativa sin código: el plugin Custom Post Type UI proporciona una interfaz visual, reduce la barrera de entrada y elimina los errores de sintaxis.
  • Tras el registro, el tipo aparece en el menú lateral. Toques finales: taxonomías, campos y vaciado de enlaces permanentes.

Qué es un custom post type

Cualquier contenido en WordPress es un registro con un campo post_type en la tabla wp_posts. Para las entradas del blog, es post. Para las páginas, es page. Para los archivos adjuntos, es attachment. Un tipo personalizado añade otro valor: product para productos, event para eventos, portfolio para proyectos. Lo que mejor se adapte a las necesidades de su sitio.

Cada CPT obtiene su propio elemento de menú en el panel de administración, una estructura de URL (/events/webinar-2026/), sus propias taxonomías y soporte para los bloques del editor que necesite: miniaturas, extractos, editor, comentarios. Todo esto se habilita mediante casillas de verificación en el array supports, sin magia alguna.

El principal beneficio es la organización. Los productos no flotan en el feed del blog. Los eventos no necesitan ser filtrados de un montón general. La administración se acelera y la búsqueda del sitio funciona con mayor precisión.

Método 1: registro mediante código, register_post_type()

El método básico que funciona desde WordPress 3.0. No se necesitan plugins de terceros. El código se coloca en el archivo functions.php de su tema hijo o, de forma más segura, mediante el plugin Code Snippets: un error de código no bloqueará el sitio, sino que simplemente desactivará ese fragmento específico.

Paso 1: función en el hook init

La función se engancha a init. Antes no funcionará porque el núcleo aún no está listo para aceptar registros. Después significa que el tipo no se recogerá hasta la siguiente solicitud. Aquí tiene una plantilla mínima funcional:

1/**
2 * Registers a custom post type 'Books'.
3 * Place in functions.php of the child theme or via Code Snippets.
4 */
5function myprefix_register_book_post_type() {
6 register_post_type( 'book', array(
7 'labels' => array(
8 'name' => 'Books',
9 'singular_name' => 'Book',
10 'add_new_item' => 'Add New Book',
11 'edit_item' => 'Edit Book',
12 'view_item' => 'View Book',
13 'search_items' => 'Search Books',
14 'not_found' => 'No books found',
15 ),
16 'public' => true,
17 'has_archive' => true,
18 'rewrite' => array( 'slug' => 'books' ),
19 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
20 'show_in_rest' => true,
21 'menu_icon' => 'dashicons-book-alt',
22 ) );
23}
24add_action( 'init', 'myprefix_register_book_post_type' );

Tras insertar el código, aparece una sección «Libros» en el panel de administración. Las URL de los registros se convierten en site.ru/books/book-name/. Funciona de inmediato.

Paso 2: parámetros clave

La función acepta dos argumentos: una cadena de clave de tipo (hasta 20 caracteres, letras latinas y guiones) y un array de configuración. Estos son los parámetros que vale la pena configurar deliberadamente:

Parámetro

Qué hace

Recomendación

public

Visibilidad en administración y frontend

true para la mayoría de los casos

has_archive

Página de archivo para todos los registros de este tipo

true para catálogos y colecciones

rewrite

Estructura de URL (slug)

Establecer explícitamente, sin caracteres especiales

supports

Bloques del editor

Mínimo: title editor thumbnail

show_in_rest

Disponibilidad en el editor de bloques

true es obligatorio, de lo contrario Gutenberg no se abrirá

menu_icon

Icono en el menú lateral

Elija entre Dashicons

Paso 3: taxonomías

Las categorías y etiquetas de las entradas no se adjuntan a su CPT por defecto. Cree las suyas propias:

1function myprefix_register_book_taxonomies() {
2 register_taxonomy( 'genre', 'book', array(
3 'label' => 'Genres',
4 'rewrite' => array( 'slug' => 'genre' ),
5 'hierarchical' => true,
6 'show_in_rest' => true,
7 ) );
8
9 register_taxonomy( 'book_tag', 'book', array(
10 'label' => 'Book Tags',
11 'rewrite' => array( 'slug' => 'book-tag' ),
12 'hierarchical' => false,
13 'show_in_rest' => true,
14 ) );
15}
16add_action( 'init', 'myprefix_register_book_taxonomies' );

Las taxonomías se registran mediante register_taxonomy() con un enlace explícito al post_type como segundo parámetro. hierarchical => true proporciona una estructura de árbol como las categorías. false da una lista plana como las etiquetas.

Paso 4: vaciar los enlaces permanentes

Después del registro, vaya a Ajustes → Enlaces permanentes y haga clic en «Guardar cambios», incluso si no ha cambiado nada. WordPress reconstruirá las reglas de enrutamiento. Sin este paso, las URL como /books/ devolverán un error 404.

Cuándo es suficiente el código

Este método funciona bien para uno o dos tipos personalizados cuando la estructura no cambia a menudo. Ventaja: cero plugins adicionales y control total sobre cada parámetro. Desventaja: para relaciones complejas entre múltiples CPT y formularios de envío en el frontend, el código crece rápidamente.

Método 2: sin código, plugin Custom Post Type UI

Si no desea tocar functions.php, instale Custom Post Type UI. Un plugin gratuito de WebDevStudios: un millón de instalaciones activas, calificación de 4.6 en WordPress.org. Actualizado en mayo de 2026, probado hasta WP 7.0.

Interfaz para añadir un tipo de contenido personalizado en el plugin CPT UI

Cómo crear un CPT a través de la interfaz

  • Instale el plugin: Plugins → Añadir nuevo → «Custom Post Type UI» → Instalar → Activar.
  • Vaya a CPT UI → Añadir/Editar tipos de contenido.
  • Rellene los campos: Post Type Slug (letras latinas, por ejemplo event), Plural Label («Events»), Singular Label («Event»).
  • En el bloque Settings, marque: Public (True), Has Archive (True), Show in REST API (True).
  • En el bloque Supports, marque como mínimo: Title, Editor, Thumbnail, Excerpt.
  • Haga clic en Add Post Type.

Las taxonomías se crean en el mismo lugar, en la pestaña Añadir/Editar taxonomías. Especifique el enlace a su tipo de contenido y las categorías aparecerán en el menú lateral.

Puntos fuertes

Registro rápido sin riesgo de errores de sintaxis: el plugin ensambla un array $args correcto por sí mismo. La pestaña Tools permite la migración de tipos entre sitios mediante exportación e importación de código. CPT UI Pro añade bloques para la salida en el frontend y columnas de arrastrar y soltar en el panel de administración, pero la versión gratuita cubre completamente la tarea de registro.

Tenga en cuenta que el plugin solo registra tipos y taxonomías. Para la visualización en el frontend, necesitará plantillas de tema, CPT UI Pro o una combinación con Advanced Custom Fields o Elementor.

Comparación: código versus plugin

Criterio

Código (register_post_type)

Plugin (CPT UI)

Barrera de entrada

Requiere comprensión de arrays PHP

Interfaz similar a los ajustes estándar de WP

Número de CPTs

Ilimitado

Ilimitado

Transferencia entre sitios

Copiar el código

Exportar/importar a través de Tools

Código extra en el sitio

Ninguno

Un plugin adicional

Dependencia del plugin

Ninguna

Sí, CPT UI debe estar activo

Documentación

developer.wordpress.org

docs.pluginize.com

En la práctica, a menudo se usa una combinación: registrar tipos a través de CPT UI por rapidez y añadir campos mediante Advanced Custom Fields. Esto le proporciona una interfaz de configuración visual sin una sola línea de PHP.

⁉️🤔 Preguntas frecuentes

¿Necesito vaciar los enlaces permanentes después de crear un CPT?

Sí, siempre. Vaya a Ajustes → Enlaces permanentes y haga clic en «Guardar». WordPress reconstruirá las reglas de enrutamiento. Sin esto, las nuevas URL como /books/ devolverán un error 404.

¿En qué se diferencia CPT UI de ACF en el registro de tipos?

CPT UI solo registra tipos de contenido y taxonomías. ACF, a partir de la versión 6.1, también puede registrar CPT, pero su principal fortaleza son los campos personalizados. La combinación CPT UI + ACF le da una interfaz para tipos y campos flexibles. No queda atado a un único proveedor.

¿Puedo renombrar un tipo de contenido existente?

No existe un mecanismo directo. Cuando cambia el post_type en la base de datos, los registros antiguos desaparecen del panel de administración. El enfoque adecuado: cree un nuevo tipo con el nombre deseado, migre los registros con una consulta SQL UPDATE wp_posts SET post_type = 'new_type' WHERE post_type = 'old_type' y solo entonces elimine el registro antiguo. Es obligatorio realizar una copia de seguridad completa de la base de datos antes de la migración.

¿Desaparecerán los tipos personalizados al cambiar de tema?

Si los tipos están registrados en el functions.php del tema, sí, al cambiar de tema desaparecerán del panel de administración. Los registros permanecerán en la base de datos pero no serán visibles. Registre los CPT en un plugin separado o mediante Code Snippets, y los tipos sobrevivirán a cualquier cambio de tema.

¿Cómo muestro un CPT en la página de inicio en el feed general?

Añada un filtro en Code Snippets: add_filter( 'pre_get_posts', function( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } );. Sustituya su post_type en el array y los registros aparecerán en el feed junto a las entradas normales.

Qué método elegir: resumen final

Ambos métodos conducen al mismo resultado: aparece una nueva sección en el menú lateral, lista para ser llenada con contenido. La diferencia está solo en la herramienta.

Si trabaja con el sitio de forma práctica y no le teme a functions.php, use código. Una función register_post_type(), cero plugins adicionales. Adecuado para páginas de aterrizaje, catálogos pequeños y proyectos con soporte de desarrollador.

Si va a entregar el sitio a un cliente o está construyendo un proyecto de contenido con una docena de tipos, instale CPT UI. La interfaz visual reduce la barrera de entrada y la exportación de configuración ahorra horas al migrar entre plataformas.

En cualquier caso, después del registro, configure la visualización: plantillas single y archive en el tema o maquetación visual a través de CPT UI Pro / Elementor Pro. Sin este paso, el contenido permanecerá solo en el panel de administración.