En éste artículo vamos a ver que son los Custom Post Type, para que sirven y cómo podemos crearlos y utilizarlos en WordPress.

¿Qué es un Custom Post Type o CPT?

Los custom post type son tipos de contenido, como las páginas o los post típicos en WordPress. El término CPT o Custom post type significa “Tipo de Post personalizado”, nombre que puede dar lugar a confusión ya que por post entendemos entrada de blog. Pero desde que WordPress pasó de ser una plataforma de blogging a convertirse en un CMS más potente, en este caso podemos entender el término Post como cualquier tipo de contenido.

Un CPT o custom post type no es nada mas que un tipo de contenido. Por lo general todos solemos conocer los Post y las páginas en WordPress, pero en ocasiones es necesario crear otro tipo de contenido en una web, con diferente estructura o funcionamiento que los típicos post o páginas.

Al principio WordPress solo tenía un post type, que eran los post, pero luego vinieron las páginas que funcionan de otra forma diferente, abriendo el abanico de posibilidades en WordPress. Con la llegada de las páginas ya teníamos mas posibilidades de crear otros contenidos.

En ocasiones se necesitan “posts” o “contenidos” que funcionen de otra forma diferente a las páginas o a las entradas. Por ejemplo, imaginaros si quisiéramos crear en una web una sección de recetas. Por eso surgieron los custom post type.

¿Para que sirven los custom post types?

Los CPT sirven para organizar el contenido de un sitio web. Si quisiéramos hacer una web de reviews de productos, sería interesante crear un CPT llamado “Reviews”, en lugar de crearlo como posts o páginas.

De esta manera en el panel de administración de WordPress tendíamos nuestro apartado de reviews, aislado de las páginas y de las entradas.

De esta forma podríamos darle a este custom post type un diseño y estructura diferente a los otros tipos de contenido de la web, y prepararlo para que muestre nuestra reviews con los datos que queramos.

¿Por qué crear un CPT en lugar de usar taxonomías (categorías y etiquetas)?

Teóricamente se podría crear cualquier tipo de contenido como un post y filtrarlos u organizarlos usando categorías y etiquetas, pero esta solución no es siempre la mejor.

Estas son algunas de las razones por las que conviene usar un CPT en lugar de categorías o tags:

  • Cuando el contenido no queremos que tenga el mismo diseño que un post o una página.
  • Cuando no queremos que se muestre de una forma cronológica como en un blog.
  • Cuando necesitamos campos personalizados adicionales (custom fields) para mostrar información.
  • Cuando no debe formar parte de las “páginas”, sino ir a parte.
  • Cuando el contenido a mostrar es diferente al resto.

La organización y diseño del contenido web con categorías y etiquetas de la manera tradicional se puede quedar corta, por eso también se pueden crear taxonomías personalizadas dentro de los CPT.

Los Custom Post Type mas típicos

Dos ejemplos clarísimos de CPT son los productos y el portfolio. Al instalar el plugin Woocommerce para crear una tienda online se crea el custom post type “productos”. Y en cuanto al portfolio, es otro custom post type típico que nos sirve para mostrar otro tipos de contenidos, como imágenes o vídeos, y ambos tienen sus propias categorías aisladas para organizarlos.

Otros post type que suele ser común en muchos Themes es el de “Testimonios”. No obstante, podremos crear cualquier custom post type. De echo su propio nombre quiere decir “tipo de post personalizado”. No hay límites, podremos crear custom post type para nuestros servicios, productos, películas, libros, eventos, recetas, equipos, etc.

Será necesario crear un custom post type cuando tengamos la necesidad de tener diferentes diseños para cada contenido de la web.

Cómo crear Custom Post Types en WordPress – La forma fácil

La forma mas sencilla de crear un CPT es con un plugin llamado Custom Post Type UI. Esta forma es la mas sencilla y segura para usuarios de nivel principiante en WordPress ya que no hay que entrar a tocar código.

Para crear un custom post type con este plugin debes instalarlo y activarlo desde Plugins – Añadir nuevo. Aparecerá un nuevo enlace en el menú lateral del panel de administración de tu WordPress llamado CPT UI. 

Ahora podrás añadir y configurar desde ahí tu nuevo CPT haciendo click en CPT UI – Añadir/Editar post types. Como comentábamos antes, el plugin también permite crear/editar custom taxonomies, pero no vamos a tratar este asunto ahora.

Lo primero que debemos hacer es ponerle un nombre a tu nuevo CPT, por ejemplo recetas, servicios, libros, reviews… lo que necesites.  Ese es el nombre que aparecerá en WordPress, de la misma forma que ahora aparecen Entradas y Páginas.Te pedirá que lo escribas en singular y en plural.

A continuación puedes ir rellenando el formulario que aparece con el fin de completar la configuración de tu CPT.

Es importante tener en cuenta que si desactivas o eliminas el plugin “Custom Post Type UI”, todos tus CPT creados desaparecerán. Por lo que es necesario mantenerlo activo para poder usar los CPT creados a través de el.

Crear Custom Post Types de forma manual

Esta es la opción preferida por desarrolladores y usuarios de WordPress más familiarizados con el código y con la gestión de los archivos en WordPress.

Esta es la mejor forma de hacerlo porque, como comentábamos antes, si hemos creado CPTs con un plugin como Custom Post Type UI, al desactivarlo todos los CPT creados desaparecerían. Realmente el CPT quedaría registrado pero no estaría disponible desde el panel de administración de WordPress.

Por lo tanto, si estás trabajando en la web de un cliente, lo mejor es crear los CPT de forma manual, para evitar que los administradores posteriores de la página eliminen algo por error.

Para crear un CPT de forma manual sólo se debe añadir el código requerido:

// Register Custom Post Type
function crear_cpt_servicios() {

  register_post_type( 'Servicios', 
    array(
      'labels' => array( 
        'name' => __( 'Servicios' ),
        'singular_name' => __( 'Servicio' ) 
       ), 
       'public' => true, 
       'has_archive' => true, 
     ) 
   ); 
} 
add_action( 'init', 'crear_cpt_servicios' );

 

Éste código se puede añadir de varias formas:

  1. En el archivo functions.php: Copiando y pegando el código en el archivo functions.php de tu plantilla quedaría creado el nuevo custom post type “Servicios”. Pero en mi opinión ésta no es la mejor forma de hacerlo, porque si cambiamos de plantilla, el functions.php que hemos editado se actualizaría y se perdería todo.
  2. Crear un plugin específico para ello: Personalmente estoy a favor de hacerlo en un plugin dedicado ya que los plugins permanecen activos sin importar que plantilla se use y qué personalizaciones se hagan en la web. No vamos a entrar en detalle sobre cómo hacerlo, de momento. Si quieres indagar, te recomiendo ojear el plugin “Pluginception”.
  3. Con ayuda de Generatewp.com: Esta herramienta online es muy cómoda ya que te proporciona el código necesario para crear tu CPT a medida y que puedas configurarlo sin saber nada de código. No sólo sirve para generar el código de creación de tus CPT, tiene muchas mas opciones.

El código anterior es el básico, pero en la práctica puede ser necesaria una configuración más detallada. Por ejemplo podremos definir si queremos que nuestro CPT tenga página de archivos (estilo Blog) o no la tenga, definir en que posición del menú aparecerá el CPT, si es público o no… y más detalles.

Échale un vistazo al siguiente código que permite añadir funciones al custom post type “Servicios”.

// Register Custom Post Type
function crear_cpt_servicios() {

	$labels = array(
		'name'                  => _x( 'Servicios', 'Post Type General Name', 'text_domain' ),
		'singular_name'         => _x( 'Servicio', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'             => __( 'Servicios', 'text_domain' ),
		'name_admin_bar'        => __( 'Servicios', 'text_domain' ),
		'archives'              => __( 'Item Archives', 'text_domain' ),
		'attributes'            => __( 'Item Attributes', 'text_domain' ),
		'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
		'all_items'             => __( 'All Items', 'text_domain' ),
		'add_new_item'          => __( 'Add New Item', 'text_domain' ),
		'add_new'               => __( 'Añadir nuevo', 'text_domain' ),
		'new_item'              => __( 'Nuevo servicio', 'text_domain' ),
		'edit_item'             => __( 'Editar servicio', 'text_domain' ),
		'update_item'           => __( 'Update Item', 'text_domain' ),
		'view_item'             => __( 'View Item', 'text_domain' ),
		'view_items'            => __( 'View Items', 'text_domain' ),
		'search_items'          => __( 'Search Item', 'text_domain' ),
		'not_found'             => __( 'Not found', 'text_domain' ),
		'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
		'featured_image'        => __( 'Featured Image', 'text_domain' ),
		'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
		'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
		'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
		'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
		'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
		'items_list'            => __( 'Items list', 'text_domain' ),
		'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
		'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
	);
	$args = array(
		'label'                 => __( 'Servicio', 'text_domain' ),
		'description'           => __( 'Post type para crear servicios en mi web', 'text_domain' ),
		'labels'                => $labels,
		'supports'              => array( 'title', 'editor' ),
		'taxonomies'            => array( 'category', 'post_tag' ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'menu_position'         => 5,
		'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( 'Servicios', $args );

}
add_action( 'init', 'crear_cpt_servicios', 0 );


 

Si observas detenidamente el código puede ver que se puede configurar el CPT de varias maneras, pudiendo añadir soporte para revisiones, imagen destacada, hacer que se comporte como una página y no como posts, etc.

También se pueden crear taxonomías personalizadas (custom taxonomies) asociadas al post type.

Si vas a traducir tu página web y quieres traducir también tus custom post type será necesario que en el código sustituyas el texto  “text domain” por el propio text domain usado por tu plantilla, de la siguiente forma:

$labels = array(
        'name'                => _x( 'Servicios', 'Post Type General Name', 'twentyseventeen' ),
        'singular_name'       => _x( 'Servicio', 'Post Type Singular Name', 'twentyseventeen' ),
...

 

Cambiar la apariencia de tus custom post types

En muchas ocasiones creamos un nuevo CPT con el fin de crear un diseño diferenciado para mostrar un contenido diferente o con unas características especiales. Entonces podremos necesitar que la página de archivos del nuevo CPT sea diferente a la que viene por defecto, que es la que podeos ver, por ejemplo en el archivo de entradas.

Si queremos modificar su apariencia es necesario crear un nuevo archivo en el directorio de la plantilla llamado archivo-nombre-de-tu-cpt.php, pero poniendo el nombre de tu CPT.

Después una opción es copiar todo el código del archivo archive.php de tu tema e ir editándolo a tu gusto para lograr el funcionamiento y diseño deseado.

Si además quisieras editar la apariencia y diseño con el que se van a mostrar los nuevos contenidos de tu custom post type debes crear un nuevo archivo llamado single-nombre-de-tu-cpt.php , sustituyendo de nuevo nombre-de-tu-cpt por el nombre real de tu CPT. En éste archivo puedes pegar el contenido del single.php de tu plantilla y editarlo a tu gusto.

Siempre podrás crear custom fields (campos personalizados) para mostrar la información que quieras en tus CPT, dentro de este nuevo archivo.

 

Es muy importante que estos nuevos archivos los crees en un Child Theme o Tema hijo para evitar que se pierdan cuando actualices tu plantilla a una versión más reciente.

 

Comenta