WordPress, a primera vista, para mostrar contenido tiene entradas y páginas. Y si quieres organizar tu información en otros apartados adicionales, es allí en donde puedes usar la funcionalidad de Custom Post Types o Tipo de Entradas Personalizadas.
1- Generalidades
De manera resumida, usar Custom Post Types te permite crear tu propio tipo de entradas, tal como se ve en la imagen adjunta, verás que se ha creado una sección de recetas, adicional a las que vienen por defecto.

La información que ingreses en recetas, se almacenará igualmente en la base de datos, en la tabla wp_posts, y se diferenciará con un campo llamado post_type, tal como se ve en la siguiente imagen.

Al revisar los registros de esta tabla no sólo encontrarás registros con el post_type : entrada, página y recetas (en el caso en que hayamos creado contenido para receta) sino que hay otros tipos por defecto.
Tipos de Custom Post Types por defecto:
- Post (post) : Contenido de las entradas.
- Page (page) : Contenido de las páginas
- Attachment (attachment) : Contenido de las imágenes subidas.
- Revision (revision): Borrador, auto guardado cuando creamos contenido.
- Navigation Menu (nav_menu_item): Almacena información de items de menú.
- Custom CSS (custom_css): Contenido CSS en la personalización de un theme.
- Changesets (customize_changeset): Contenido de auto guardado pero para los cambios en la personalización de un theme.
2- ¿Cuando usar Cutom Post Types?
De acuerdo al ejemplo anterior, pude haber creado una categoría llamada Recetas y el contenido de las recetas como entradas; sin embargo algunas de las razones por las que se utilizan Custom Post Types son:
- Organizar contenido distinto e independiente.
- Configurar distintas opciones en la pantalla de creación/edición de contenido.
- Estructura de enlaces independiente, beneficioso para SEO.
- Integración con Taxonomías adicionales.
3- Creación de Custom Post Types
Para la creación de CPT puedes usar un plugin como Custom Post Types UI, sin embargo en este artículo vamos a ver cómo generar nuestro código de CPT con una herramienta online en GenerateWP.
4- ¿En donde inserto este código?
Usualmente un CPT forma parte de un plugin, sin embargo si quieres esta funcionalidad de manera independiente puedes evaluar usar el functions.php de tu theme actual, aunque mejor es usar un plugin para insertar snippets, te recomiendo revisar el artículo: Agregar código sin usar functions.php
5- Mostrando el Custom Post Type en tu sitio
Para mostrar el Custom Post Type de Recetas en el Front-end de tu sitio web, será necesario hacer algunas modificaciones a los archivos de tu theme.
Sin embargo una opción rápida es usar los archivos que hay actualmente como parte del theme y agregar el Custom Post Type a la consulta, es decir usar el siguiente código:
add_action( 'pre_get_posts', 'add_my_post_types_to_query' );
function add_my_post_types_to_query( $query ) {
if ( (is_single() || is_home() || is_category() ) && $query->is_main_query() )
$query->set( 'post_type', array( 'post', 'recetas_post_type' ) );
return $query;
}
En el código anterior:
- Se ha usado el hook pre_get_posts.
- El hook hace referencia a la función add_my_post_types_to_query
- Dentro de la función comprobamos main_query, es decir la consulta principal.
- También comprobamos que se encuentre en una entrada individual, en el inicio o en una categoría.
- Establecemos $query->set, pasando como parte de los argumentos el Custom Post Type Recetas
- Lo que hace $query->set es agregar a la consulta los registros de los Post Types indicados
¿Aún con dudas?, en el siguiente video se explican cada uno de los puntos tratados anteriormente.
Hola Jhon:
Muy buenos tus tutoriales, me sirven de gran ayuda.
Estoy haciendo un sitio web para la coral de mi pueblo (Zegama-Gipuzkoa-España) y he añadido como CPT “Partituras”.
He añadido todas las entradas de mi CPT “Partituras” a una Página, con lo que están todas las partituras seguidas una detrás de otra; el problema es que no puedo paginar esta Página y no se porqué, añado diferentes paginaciones y siempre me da el mismo error al paginar:
¡Vaya! Esa página no se puede encontrar.
Parece que no se encontró nada en este lugar. ¿Tal vez pueda intentar buscar?
Quizás puedas echarme una mano, te estaría muy agradecido.
Saludos
Imanol
Hola, lo que te puedo sugerir es que evalúes hacerlo con la funcionalidad de Jerarquía de Themes, en tu caso por ejemplo tener un archivo similar a: archive-partituras.php, sin embargo tendrías que programar en este archivo el bucle y la paginación, revisa: https://decodecms.com/jerarquia-de-archivos-de-plantilla-en-wordpress/
Hola qué tal amigo, muy interesante tu blog. Con respecto al tema de la publicación yo recomendaría el juego de plugins de toolset WP-TYPES, muy completo y una maravilla para expandir las funcionalidades de manejo de contenido avanzado.
Hola,
Creé un Custom Post Type para la sección de servicios de mi web. El detalle que no logro corregir es que tiene la apariencia de una entrada del blog, y no quiero eso. Quiero que los CPT tengan la apariencia de las páginas; full width y sin barra lateral.
¿Cómo logro modificar eso?
Por si sirve de algo… En las páginas está la opción para habilitar o deshabilitar el FULL WIDTH. En los CPT, no.
Si tienes otra entrada que hable sobre estos temas de CPT, pero más avanzados, te lo agradecería. Pienso crear otras secciones de mi web sin valerme de theme o plugins; como el portafolio.
Hola Jhon, muy buen tutorial, pude crear mi CPT personalizado gracias a tus pasos, solo quiero resolver un par de dudas, la primera esta relacionada a que tengo instalado el pluging de Jetpack, para mostrar el contenido relacionado de los posts, pero este solo se muestra en los posts por defecto de WordPress, no en los CPT adicionales que creemos para realizar posts.
Lo mismo sucede con el pluging YoastSeo, no esta activo para los posts que creemos en los CPT adicionales.
Te agradezco si tienes la solución para activar estos plugins en los CPT que creemos.
Feliz día.
Hola, esto depende de los plugins que usas, algunas de los plugins son gratuitos hasta cierto punto, por ejemplo leyendo entradas y páginas, pero si quieres que reconozcan otros CPT tienen funcionalidad adicional de pago. En el caso de los posts relacionados podrías evaluar: https://decodecms.com/posts-relacionados-sin-plugins-en-wordpress/ , tendrías que hacer algunas variaciones a la consulta. En el caso de SEO Yoast, tienes que activar public para que lo reconozca, revisa: https://kb.yoast.com/kb/does-yoast-seo-work-with-custom-post-types/
Hola John
¿Necesito un hosting especial para publicar miles de tipos de publicaciones con Custom Post Types?
Estoy planeando crear un catálogo de productos (no se requieren opciones de compra,no woocommerce)
Tengo como 200,000 Productos. Estoy tratando de encontrar una solución en usar tablas HTML , pero las tablas son más para páginas estáticas o usar publicaciones personalizadas (CPT) que son dinámicos y con mejores opciones para organizar el contenido
Agradeceré Cualquier consejo sobre esto.
Hola, la mayoría de hosting de pago podrían soportar la cantidad de datos que comentas como CPT en tu base de datos, sin embargo igual puedes consultar al propio hosting. De manera general te recomendaría igual Woocommerce, que te crea CPT de productos y adicionales que podrían servirte en el futuro, puedes usar Woocommerce en modo catálogo.
Hola Jhon. Gracias por tus tutos.
Necesito crear en WP dos tipos de usuarios en los que recoger datos tipo, nombre, descripción, url, redes sociales y galeria de fotos. La diferencia entre ambos es la cantidad de fotos, rrss y tamaño de descripción. La idea es poder mostrar esos datos al pinchar en un mapa donde sale un icono de cada usuario. ¿Sería posible hacerlo mediante CPT? ¿Alguna base de cómo crearlo y acceder a esos datos para mostrarlos en una ventana?
Gracias.
Hola, entiendo que quieres que los usuarios se registren con campos adicionales, no creo que sea un CPT la solución, más parece ser que requieres algún plugin de formularios, por ejemplo: https://www.gravityforms.com/ , además posiblemente tengas que programar algo para mostrar estos datos en un mapa.
Hola, una pregunta, despuès de creado un CPT como le indico a wordpress que muestras esas entradas personalizadas en una determinada pàgina?. Gracias
Hola
Una opción sería que crees un archivo archivo-xxx, en donde xxx es el slug de tu CPT, revisa la gráfica y el artículo en: https://decodecms.com/jerarquia-de-archivos-de-plantilla-en-wordpress/
Saludos.
Hola tengo un error al ejecutar el código que muestra el CPT en el sitio, el error me da al tener 2 CPT en uno se ejecuta correctamente pero el otro me manda al 404
Es posible que tengas que refrescar las urls amigables, desde Ajustes > Enlaces Permanentes, prueba grabar nuevamente.
Hola, pues ya probe lo de enlaces permanentes y nada, me percate que es en el codigo que muestra el CTP en el sitio, según en la posición que muestre se mostrara uno o el otro, ya verifique las variables y todo esta bien. Pero me sigue enviando a 404
Hola, prueba deshabilitar temporalmente urls amigables y verifica si asi se muestra. Saludos.
Hola jhon,
necesito que esta entrada sea diferente hice otro (single.php) ej: (single-tv.php) pero no se como hacer que se muestre en este codigo:
add_action( ‘pre_get_posts’, ‘add_my_post_types_to_query’ );
function add_my_post_types_to_query( $query ) {
if ( (is_single() || is_home() || is_category() ) && $query->is_main_query() )
$query->set( ‘post_type’, array( ‘post’, ‘recetas_post_type’ ) );
return $query;
}
me prodrías ayudar muchas gracias.
Hola entiendo que “tv” es el custom post type, el código que envías se basa en hooks por lo que podrías ponerlo en el functions.php directamente, es decir no necesitas crear un archivo para esto, sólo validarías en el if que corresponda a ese custom post type.
Hola, gracias por tu post, soy nuevo en WP, y estaba tratando de hacer algo para dar acceso a los post solo a usuarios que pertenecen a un grupo en particular, encontré un plugin llamado Profilegrid pero es muy engorroso su uso para muchos usuario(incluye una procedimiento manual por usuario), hasta que encontré tu post, es por ello que te pido si puedes darme algunas pautas para empezar.
Hola, no tiene que ver con Custom Post Types. Para lo que comentas podrías probar un plugin de membresía, por ejemplo: https://es.wordpress.org/plugins/restrict-user-access/
Buenas, ¿tienes algun tutorial para hacer algo similar pero mostrando el formulario a los usuarios? yo he creado una sección de post nueva con custom posts type, pero me gustaría mostrar ese formulario en una pagina especifica, también le he creado campos personalizados con ACF, como me llevaria todo ese formulario creado a una pagina para mostrarlo para que los usuarios puedan rellenar ese formulario? un saludo y gracias.
Hola
No me queda claro a qué formulario te refieres, supongo que quieres ingresar datos a tu CPT desde el front-end con un formulario. Puedes revisar: https://wordpress.org/support/topic/acf-cpt-form-widget/
cómo puedo mostrar lo campo de mi cpt en forma de tabla sin utilizar plugin porque todos lo que lo hacen son de pago, gracias.
Hola, posiblemente tengas que usar un archivo para mostrar las entradas de tu CPT a nivel de tu theme, revisa especialmente archive-$posttype, en el siguiente enlace: https://decodecms.com/jerarquia-de-archivos-de-plantilla-en-wordpress/ , debes basarte en un archivo que ya exista y luego hacer las modificaciones en tabla.
Hola Jhon,
Muchas gracias como siempre, es excelente la explicación, desde generar el codigo, usar el snipet, y luego visibilizar en el Theme.
El error que encontré fue en esta línea y que es la que te preguntan: $query->set( ‘post_type’, array( ‘post’, ‘recetas_post_type’ ) );
hay que quitar el “_post_type” donde dice recetas para que visualice, como indica, ‘post”, ‘recetas’ <—o el nombre que le den su CPT. y así ya se visualiza en el Theme y menú, y su propia entrada.
Hola, en mi ejemplo lo he registrado con ese id es por eso que lo uso así en el código: https://generatewp.com/snippet/nkklpyl/
Hola Jhon!
Gracias por tus post, me han aclarado muchas cosas. He creado un CPT de proyectos, quisiera saber cómo agregarle los enlaces de navegación de anterior y próximo.
Hola, posiblemente tengas que agregar un archivo para el CPT para listar el contenido ( revisa: https://decodecms.com/jerarquia-de-archivos-de-plantilla-en-wordpress/ ), y luego usar las funciones previous_post_link() y next_post_link()
Hola Jhon,
Esta muy interesante tus videos, quisiera preguntarte, quiero hacer un sistema de egresados, en los cuales inicien sesion y vean su información como sus diplomados realizados, es posible que esto me funcione, o que me recomiendas?
Hola, podrías evaluar usar un plugin de restricción de contenido, podrías restringir el contenido por usuario o rol de usuario.
Hola John, es posible usar la base de datos de un CPT en un subdominio? dominio y subdominio están en el mismo CPanel. Se le puede decir al subdominio que tabla agarrar?
Hola, no lo tengo del todo claro que quieres lograr, pero si, puedes leer otras Bases de Datos, independiente del dominio o subdominio en el que estes.