X

Usando Custom Post Types en WordPress

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.

Pantalla Descripcion


General Se define el nombre de la función, si la función se puede sobreescribir y el text domain para traducciones en un sitio multi idioma


Post Type Se define el nombre del post type y si irá asociado a determinadas taxonomías

Labels Se define los nombres de las distintas etiquetas que aparecerán en las pantallas de configuración y menús

Options Se define el soporte de determinas funcionalidades

Visibility En la mayoría de los caso dejaremos por defecto Public y Show UI, en este tab también podemos agregar un ícono

query Son opciones para posteriormente hacer nuestro loop personalizado, usualmente dejaremos los valores por defecto

Permalinks Si nuestro nombre de CPT es poco adecuado para la url, es aqui en donde podemos cambiarlo

Capabilities Usualmente dejaremos esto por defecto, con los permisos similares que tienen las entradas

Rest API Configuración de API Rest para nuestro CPT, podemos dejar las opciones por defecto

 

Al final obtendremos el siguiente código Custom Post Type para Recetas 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;
}

 

Puedes insertar este código en el archivo functions.php de tu theme, o usar un plugin de Snippets

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

 

Categorías: Core

Ver comentarios (32)

  • 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 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 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 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.