>

Tipos de contenido personalizados en WordPress paso a paso

Fernan Díez     Colaboraciones    23/10/2017

WordPress permite gestionar diferentes tipos de contenido. Hablamos de post o entrada como cuando nos referimos al tipo de contenido más habitual con el que trabajamos, aunque también se trata de un tipo de contenido o post type. La tabla wp_posts es la encargada de almacenar todos estos tipos de contenido personalizados.

tipos-contenido-personalizado-wordpress-betabeers

Seguramente estés familiarizado con los diferentes tipos de contenido que aparecen por defecto en el núcleo de WordPress. Estos son los siguientes:

  • Entradas 'post'
  • Páginas ‘page’
  • Adjuntos ‘attachment'
  • Revisiones 'revision'
  • Menú de navegación 'nav_menu_item'
  • CSS personalizado
  • Cambios de ajusts ‘customize_changeset’

¿Qué son los tipos de contenido personalizados en WordPress?

Los Custom Post Types o tipos de contenido personalizados son nuevos tipos de contenido que pueden ser creados desde WordPress utilizando para ello la función register_post_type(). Esta función permite definir un nuevo tipo de contenido con etiquetas determinadas, funcionalidades soportadas, disponibilidad y otra serie de especificaciones.

De este modo los tipos de contenido personalizado pueden soportar funcionalidades incluídas en el core tales como meta boxes, campos personalizados, miniaturas de imágenes destacadas, estados de publicación o comentarios.

Parámetros de la función register_post_types()

$post_type

Clave del tipo de contenido que no debe exceder de los 20 caracteres y debe contener caracteres alfanuméricos en minúsculas, guiones o guiones bajos.

$args

Array o cadena de argumentos para registrar un tipo de contenido.

'label'

Nombre del tipo de contenido mostrado en el menú, habitualmente en plural.

'labels'

Array de etiquetas para el tipo de contenido.

'description'

Descripción corta que resumen el objetivo del tipo de contenido.

'public'

Define si un tipo de contenido se ha creado con intención de ser usado de manera visible tanto desde el panel de administraciòn como desde el frontend.

'hierarchical'

Define si un contenido personalizado podrá tener una relación de jerarquía con otros contenidos del mismo tipo como por ejemplo sucede con las páginas que sí tienen esa capacidad o con las entradas que no la tienen.

'exclude_from_search'

Define si se excluyen los contenidos de este tipo de los resultados de búsqueda en el frontend.

'publicly_queryable'

Define si se pueden realizar consultas en el frontend como parte de una petición parse_request() mostrándose como resultado.

'show_ui'

Define si es posible generar una interfaz para gestionar este tipo de contenido en el panel de administración.

'show_in_menu'

Define si se podrá mostrar este tipo de contenido en el menú del panel de administración en un menú de nivel superior.

'show_in_nav_menus'

Define si este tipo de contenido estará disponible para su selección en la configuración de los menús de navegación

'show_in_admin_bar'

Define si es disponible desde la barra de administración.

'show_in_rest'

Permite que el tipo de contenido personalizado sea consultado a través de la REST API.

'rest_base'

Modifica la URL base para el enrutado a través d ela REST API.

'rest_controller_class'

Nombre de la clase controladora de la REST API.

'menu_position'

Controla la posición en la que debe aaprecer el tipo de contenido personalizado en el menú de administración.

'menu_icon'

Definición del icono utilizado para el elemento del menú que muestra el tipo de contenido.

'capability_type'

Esta cadena se utilizar para construir las capacidades de lectura, escritura y borrado. Es posible ofrecer un array con plurarles alternativos cuando se utiliza este argumento para construir las capacidades. Por defecto ‘post’ es las capacidad asignada.

'capabilities'

Array de capacidades de este tipo de contenido.

'map_meta_cap'

Define la posibilidad de gestionar capacidades internas por defecto.

'supports'

Funcionalidades del núcleo de WordPress que soporta el tipo de contenido personalizado.

Las funcionalidades incluídas son título, editor, comentarios, revisiones, trackbacks, autor, extracto, atributos de página, imagen destacada, campos personalizados y formatos de entrada.

'register_meta_box_cb'

Permite una función de llamada que ajusta los campos meta boxes para el formulario de edición.

'taxonomies'

Array de identificadores de taxonomías serán registradas para este tipo de contenido.

'has_archive'

Define si habrá archivos de este tipo de contenio y, si lo hay, el término utilizado para generar el slug de ese archivo.

'rewrite'

Gestiona las opciones de reescritura para este tipo de contenido. Por defecto se permitirá la reescritura teniendo en cuenta el post_type como variable para el slug. Para especificar las reglas de reescritura un array puede ofrecer diferentes claves:

'slug'

Personaliza la estructura de permalinks mediante el slug.

'with_front'

Define si la estrucutra ser antecedida con WP_Rewrite::$front

'feeds'

Define si la estructura de permalinks para el feed debe ser construída para este contenido.

'pages'

Define si la estructura de URLs debería estar preparada la para paginación.

'ep_mask'

Máscara endpoint que puede ser asignada, a menos que no esté definida y se heredada de las estructura de enlaces.

'query_var'

Ajusta el valor de la consulta para este tipo de contenido personalzado. Por defecto se aplica el propio término del tipo de contenido.

'can_export'

Define si este tipo de contenido puede ser exportado. El valor por defecto es verdadero.

'delete_with_user'

Define si estos contenidos pueden ser eliminados cuando se borra un usuario. Si se define como verdadero los contenidos publicados por el usuario serán enviados a la papelera cuando el usuario sea eliminado.

'_builtin'

Tiene un uso exclusivamente interno. Si es verdadero define el tipo de contenido como una construcción nativa. Por defecto, es falso.

'_edit_link'

Tiene un uso exclusivamente interno. Define el segmento de la URL a usar para editar el enlace de este tipo de contenido personalizado. Por defecto el valor es 'post.php?post=%d'.

Una vez que hemos podido llegar a definir todos los parámetros posibles que podemos utilizar para la función register_post_type() que nos permite crear un nuevo tipo de contenido personalizado en WordPress, es decir un nuevo Custom Post Type, vamos a ponerlo en práctica con un ejemplo.

Crear un Custom Post Type en el archivo functions.php

A continuación podemos ver un ejemplo del código que deberíamos añadir en el archivo de funciones functions.php de nuestro tema. Si cotejamos el código mostrado con las líneas explicativas anteriores podremos comprobar los valores asignados a este tipo de contenido personalizado.

// Ejemplo de CPT Tutoriales - Custom Post Types
function tutoriales_custom_post_type() {

	$labels = array(
		'name'                  => 'Tutoriales',
		'singular_name'         => 'Tutorial',
		'menu_name'             => 'Tutoriales',
		'name_admin_bar'        => 'Tutoriales',
		'archives'              => 'Archivos de Tutoriales',
		'attributes'            => 'Atributos de Tutoriales',
		'parent_item_colon'     => 'Elemento padre:',
		'all_items'             => 'Todos los Tutoriales',
		'add_new_item'          => 'Añadir nuevo Tutorial',
		'add_new'               => 'Añadir nuevo',
		'new_item'              => 'Nuevo Tutorial',
		'edit_item'             => 'Editar Tutorial',
		'update_item'           => 'Actualizar Tutorial',
		'view_item'             => 'Ver Tutorial',
		'view_items'            => 'Ver Tutoriales',
		'search_items'          => 'Buscar Tutoriales',
		'not_found'             => 'Tutoriales No Encontrados',
		'not_found_in_trash'    => 'Tutoriales No Encontrados en la Papelera',
		'featured_image'        => 'Imagen destacada',
		'set_featured_image'    => 'Seleccionar imagen destacada',
		'remove_featured_image' => 'Eliminar imagen destacada',
		'use_featured_image'    => 'Usar como imagen destacada',
		'insert_into_item'      => 'Inserter en Tutorial',
		'uploaded_to_this_item' => 'Subir a este Tutorial',
		'items_list'            => 'Listado de Tutoriales',
		'items_list_navigation' => 'Navegación de Tutoriales',
		'filter_items_list'     => 'Filstrar listado de Tutoriales',
	);
	$args = array(
		'label'                 => 'Tutorial',
		'description'           => 'Contenidos de tutoriales',
		'labels'                => $labels,
		'supports'              => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'trackbacks', 'revisions', 'custom-fields', 'page-attributes', 'post-formats', ),
		'taxonomies'            => array( 'category', 'post_tag' ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'menu_position'         => 5,
		'menu_icon'             => 'dashicons-media-document',
		'show_in_admin_bar'     => true,
		'show_in_nav_menus'     => true,
		'can_export'            => true,
		'has_archive'           => 'slug-tutoriales',
		'exclude_from_search'   => false,
		'publicly_queryable'    => true,
		'capability_type'       => 'post',
		'show_in_rest'          => true,
	);
	register_post_type( 'tutoriales', $args );

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

Registrar un nuevo Custom Post Type como plugin

Si queremos que el tipo de contenido personalizado perdure en el tiempo, independientemente del tema que estemos utilizando una buena práctica es empaquetar ese mismo código en formato plugin. De ese modo conseguiremos preservar los contenidos independientemente de que el tema instalado pueda ser sustituido por uno nuevo.

Basándonos en el mismo ejemplo deberíamos crear un archivo de este tipo y subirlo a la carpeta plugins de nuestra instalación de WordPress.

/**
* Plugin Name: Plugin CPT Tutoriales
* Plugin URI: https://www.fernan.com.es/plugins/
* Description: Un plugin para crear un CPT para Tutoriales
* Version: 1.0
* Author: Fernan Díez
* Author URI: https://www.fernan.com.es/
* License: GPL2
*/

// Plugin CPT Tutoriales - Custom Post Types
function tutoriales_custom_post_type() {

	$labels = array(
		'name'                  =--> 'Tutoriales',
		'singular_name'         => 'Tutorial',
		'menu_name'             => 'Tutoriales',
		'name_admin_bar'        => 'Tutoriales',
		'archives'              => 'Archivos de Tutoriales',
		'attributes'            => 'Atributos de Tutoriales',
		'parent_item_colon'     => 'Elemento padre:',
		'all_items'             => 'Todos los Tutoriales',
		'add_new_item'          => 'Añadir nuevo Tutorial',
		'add_new'               => 'Añadir nuevo',
		'new_item'              => 'Nuevo Tutorial',
		'edit_item'             => 'Editar Tutorial',
		'update_item'           => 'Actualizar Tutorial',
		'view_item'             => 'Ver Tutorial',
		'view_items'            => 'Ver Tutoriales',
		'search_items'          => 'Buscar Tutoriales',
		'not_found'             => 'Tutoriales No Encontrados',
		'not_found_in_trash'    => 'Tutoriales No Encontrados en la Papelera',
		'featured_image'        => 'Imagen destacada',
		'set_featured_image'    => 'Seleccionar imagen destacada',
		'remove_featured_image' => 'Eliminar imagen destacada',
		'use_featured_image'    => 'Usar como imagen destacada',
		'insert_into_item'      => 'Inserter en Tutorial',
		'uploaded_to_this_item' => 'Subir a este Tutorial',
		'items_list'            => 'Listado de Tutoriales',
		'items_list_navigation' => 'Navegación de Tutoriales',
		'filter_items_list'     => 'Filstrar listado de Tutoriales',
	);
	$args = array(
		'label'                 => 'Tutorial',
		'description'           => 'Contenidos de tutoriales',
		'labels'                => $labels,
		'supports'              => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'trackbacks', 'revisions', 'custom-fields', 'page-attributes', 'post-formats', ),
		'taxonomies'            => array( 'category', 'post_tag' ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'menu_position'         => 5,
		'menu_icon'             => 'dashicons-media-document',
		'show_in_admin_bar'     => true,
		'show_in_nav_menus'     => true,
		'can_export'            => true,
		'has_archive'           => 'slug-tutoriales',
		'exclude_from_search'   => false,
		'publicly_queryable'    => true,
		'capability_type'       => 'post',
		'show_in_rest'          => true,
	);
	register_post_type( 'tutoriales', $args );

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

Gracias a la comunidad de WordPress, podemos encontrarnos con multitud de herramientas y plugins que nos permiten agilizar el proceso de creación de tipos de contenido personalizados sin ni siquiera utilizar una línea de código.

GenerateWP

Generate WP es un servicio online que nos permite generar tipos de contenido personalizados completando a través de un formulario todos los campos necesarios para su creación. Sencillo, intuitivo y generando como resultado un código limpio que podemos usar en nuestro sitio web.

Custom Post Type UI

Custom Post Type UI es el plugin más utilizado para crear tipos de contenido personalizado desde el panel de administración de WordPress. Tiene como ventaja que además nos permitirá crear taxonomías personalizadas nuevas o vincular el tipo de contenido con las existentes, creando de este modo un conjunto completo de funcionalidades.

Completando al anterior, existen otros plugins como Pods o Toolset Types que se basan en el mismo fundamento de creación de Custom Post Types y Custom Taxonomies, pero que inciden más en la parte relacionada con mostrar esos datos de manera personalizada en el frontend.

En cualquier caso, debemos indicar, que independientemente de las herramientas que utilicemos, es importante conocer las bases para poder trabajar con la seguridad de saber lo que estamos haciendo.

Esperamos que de tal modo, este artículo haya servido para conocer a fondo esta funcionalidad que nos brinda WordPress para organizar y clasificar el contenido de nuestros proyectos.


Sobre el autor

Fernan Díez   

Desarrollo Web WordPress & Marketing Online Publico 'WordPress Diario', un podcast sobre desarrollo web con WordPress y marketing online donde encontrarás consejos, herramientas y recomendaciones sobre todo lo que te puede interesar acerca del mundo del diseño web con WordPress, y el marketing digital.