Uso de los Custom Post Types y Taxonomías en WordPress – vertegrande ® – Marketing & Diseño Web en Puerto Madryn
Copyright © Vertegrande. 2023. Agencia de Marketing & Diseño Web en Puerto Madryn / Contanos tu Proyecto. Esto puede ser el principio de una gran aventura.
vertegrande ® – Marketing & Diseño Web en Puerto Madryn » Snippets » WordPress » Uso de los Custom Post Types y Taxonomías en WordPress

Uso de los Custom Post Types y Taxonomías en WordPress

Un custom post type es un tipo de entrada personalizada, que puedes añadir y personalizar según tus necesidades, para agregar contenido que no tenga relación añadirlo en entradas o páginas.

Publicado el 26 enero, 2023 - Categorias: Snippets, WordPress

A veces, una instalación de WordPress por defecto se puede quedar pequeña para según qué proyecto, por lo que necesitamos vitaminarlo para conseguir llevar a cabo los requisitos del mismo.

Ahí es donde entra en juego el tipo de post personalizado de WordPress. En pocas palabras, es un tipo de post adicional que creas en base a tus necesidades. Con él, podrás agrupar tus posts de forma más específica.

¿Qué son los custom post types?

Los Custom Post Types son tipos de entrada personalizados que puedes agregar a tu WordPress. Por ejemplo, WordPress por defecto trae como tipo de entrada:

  • Entradas
  • Páginas
  • Adjuntos
  • Revisión
  • Menú de navegación

A través de código

Hacer un CPT por código es muy simple. Pero para que te des una una idea, sólo bastaría con estas líneas:

add_action( 'init', 'crear_un_cpt' );
function crear_un_cpt() {
     $args = array(
     'public' => true,
     'label' => 'Propiedades'
);
register_post_type( 'propiedad', $args );
}

¿Qué es el array $args?

$args es la abreviatura de arguments y esta variable se utiliza para contener arrays. Array, por otro lado, es una estructura de datos que almacena elementos (pares de clave y valor) de un objeto (tipo de post personalizado de WordPress).

Hay muchos arrays en $args, pero vamos a enumerar sólo los más utilizados. Sin embargo, ten en cuenta que todos son opcionales.

  • labels: un array que define varios fragmentos de texto, como el nombre del menu y el nombre del tipo de post personalizado. Hablaremos más sobre este array más adelante en la sección del array $label.
  • description: un resumen breve y descriptivo del tipo de post. Este puede mostrarse en la plantilla del tipo de post, pero no se usa en ningún otro lado.
  • public: para cambiar la visibilidad del tipo de post personalizado de WordPress para autores y visitantes. Vamos a establecer el valor a TRUE para que aparezca en el panel de control de WordPress.
  • menu_position: la posición del nuevo enlace en el menú de navegación del Panel de control. El valor 5 lo coloca debajo de Entradas y 100 lo coloca debajo de Ajustes. Puedes ver la lista completa de las posiciones en la página de Código de WordPress.
  • supports: habilita de forma selectiva varias funciones de post, como imágenes destacadas, extractos, campos personalizados, etc. Si se establece en FALSO en lugar de contener un array, deshabilita el editor para este tipo de post. Esto es útil si quieres bloquear todas las publicaciones de este tipo mientras las mantienes visibles.
  • has_archive: si se establece como TRUE, define si el tipo de post tiene una página de archivo, si la url sigue tu estructura de permalinks y si el slug es el nombre que ingresaste en el parámetro 1 de register_post_types(). Por ejemplo, http://www.misitioweb.com/articulo/ muestra todas las publicaciones de Artículos Personalizados.
  • show_in_admin_bar: usar el valor TRUE hará que este tipo de post aparezca en la barra de administración superior, en el menú +Añadir.
  • show_in_nav_menus: define si las publicaciones de este tipo se pueden agregar a los menús de navegación creados a través de Apariencia -> Menús. Aquí, debemos ingresar el valor TRUE.
  • query_varTRUE o FALSE establece si una publicación se puede ver escribiendo el tipo de publicación y el nombre de la publicación como una consulta en la URL, es decir, ‘http://www.misitioweb.com/?articulo=ejemplo-articulo’.

¿Qué es el array $labels?

El primer array de la variable $args es $labels. La particularidad es que está hecho para contener otros arrays. Por lo tanto, es crucial crear una variable llamada $labels para mantener todos los pares de claves y valores en una sección separada. Esto reduce el riesgo de escribir código incorrecto y hace que la función esté mas limpia.

Aquí hay algunas de las claves más importantes para el array $labels:

  • name: el nombre plural general para el tipo de post.
  • singular_name: el nombre para una sola publicación de este tipo.
  • add_new: reemplaza el texto ‘Añadir nueva’.
  • add_new_item: reemplaza ‘Añadir nueva entrada’.
  • edit_item: reemplaza ‘Editar entrada’.
  • featured_image: reemplaza ‘Imagen destacada’ en el editor del post.
  • set_featured_image: reemplaza ‘Establecer imagen destacada’.
  • menu_name: cambia el texto del enlace de nivel superior (el texto predeterminado para el enlace es la clave del nombre).

¿Qué es el array ‘supports’?

Una de las claves del array $args es supports. Esta es un array simple en el que escribes la lista de funciones del editor que quieres habilitar para tu tipo de post personalizado. Por defecto, solo el título y el editor están habilitados.

También puedes escribir FALSE en lugar de un array. Al hacer esto, desactivarás todas las funciones de edición de publicaciones, incluido el título y el área de contenido. De esta manera, las publicaciones no se pueden editar, pero siguen siendo visibles.

Aquí está la lista de características del editor que puedes habilitar en el array supports:

  • title
  • editor
  • author
  • thumbnail
  • excerpt
  • trackbacks
  • custom-fields
  • comments
  • revisions
  • page-attributes
  • post-formats

Configurando las etiquetas para mostrar el Custom Post Type

Un ejemplo rápido con su explicación, todo este código irá en un plugin (método recomendado) o en el functions.php de nuestro tema (pero dejará de funcionar si cambias de tema):

add_action( 'init', 'bf_register_custom_post_type' );
/**
 * Registro un custom post type 'libro'.
 *
 * @link http://codex.wordpress.org/Function_Reference/register_post_type
 */
function bf_register_custom_post_type() {
    /* Añado las etiquetas que aparecerán en el escritorio de WordPress */
	$labels = array(
		'name'               => _x( 'Libros', 'post type general name', 'text-domain' ),
		'singular_name'      => _x( 'Libro', 'post type singular name', 'text-domain' ),
		'menu_name'          => _x( 'Libros', 'admin menu', 'text-domain' ),
		'add_new'            => _x( 'Añadir nuevo', 'libro', 'text-domain' ),
		'add_new_item'       => __( 'Añadir nuevo libro', 'text-domain' ),
		'new_item'           => __( 'Nuevo libro', 'text-domain' ),
		'edit_item'          => __( 'Editar libro', 'text-domain' ),
		'view_item'          => __( 'Ver libro', 'text-domain' ),
		'all_items'          => __( 'Todos los libros', 'text-domain' ),
		'search_items'       => __( 'Buscar libros', 'text-domain' ),
		'not_found'          => __( 'No hay libros.', 'text-domain' ),
		'not_found_in_trash' => __( 'No hay libros en la papelera.', 'text-domain' )
	);

    /* Configuro el comportamiento y funcionalidades del nuevo custom post type */
	$args = array(
		'labels'             => $labels,
		'description'        => __( 'Descripción.', 'text-domain' ),
		'public'             => true,
		'publicly_queryable' => true,
		'show_ui'            => true,
		'show_in_menu'       => true,
		'query_var'          => true,
		'rewrite'            => array( 'slug' => 'libro' ),
		'capability_type'    => 'post',
		'has_archive'        => true,
		'hierarchical'       => false,
		'menu_position'      => null,
		'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
	);

	register_post_type( 'libro', $args );
}

Es posible que veas mucho más código que en otros ejemplos de Custom Post Types, pero así es como puedes hacer tus custom post types mucho más «custom», aunque ya sean personalizados después de todo. Además, sólo te lleva un par de segundos hacer esto.

Otros complementos para los Custom Post Types

Si te fijas en la última imagen, la de las etiquetas del custom post type personalizadas, no tiene categorías ni etiquetas… Un gran fallo para según qué tipo de producto o contenido vayamos a tratar.

También está documentado en el codex, pero vamos a aplicarlo al ejemplo anterior:

// Lo enganchamos en la acción init y llamamos a la función create_book_taxonomies() cuando arranque
add_action( 'init', 'create_book_taxonomies', 0 );  

// Creamos dos taxonomías, género y autor para el custom post type "libro"
function create_book_taxonomies() {
  /* Configuramos las etiquetas que mostraremos en el escritorio de WordPress */
  $labels = array(
    'name'             => _x( 'Géneros', 'taxonomy general name' ),
    'singular_name'    => _x( 'Género', 'taxonomy singular name' ),
    'search_items'     =>  __( 'Buscar por Género' ),
    'all_items'        => __( 'Todos los Géneros' ),
    'parent_item'      => __( 'Género padre' ),
    'parent_item_colon'=> __( 'Género padre:' ),
    'edit_item'        => __( 'Editar Género' ),
    'update_item'      => __( 'Actualizar Género' ),
    'add_new_item'     => __( 'Añadir nuevo Género' ),
    'new_item_name'    => __( 'Nombre del nuevo Género' ),
  );
  
  /* Registramos la taxonomía y la configuramos como jerárquica (al estilo de las categorías) */
  register_taxonomy( 'genero', array( 'libro' ), array(
    'hierarchical'       => true,
    'labels'             => $labels,
    'show_ui'            => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'genero' ),
  ));
  
  /* Si quieres añadir la siguiente taxonomía del ejemplo, sustituye esta línea por la del código correspondiente */
  
}

Con esto ya tenemos la primera taxonomía, a continuación vamos con la segunda:

// Añado otra taxonomía, esta vez no es jerárquica, como las etiquetas.
  $labels = array(
    'name'          => _x( 'Escritores', 'taxonomy general name' ),
    'singular_name' => _x( 'Escritor', 'taxonomy singular name' ),
    'search_items'  =>  __( 'Buscar Escritores' ),
    'popular_items' => __( 'Escritores populares' ),
    'all_items'     => __( 'Todos los escritores' ),
    'parent_item'   => null,
    'parent_item_colon' => null,
    'edit_item'     => __( 'Editar Escritor' ),
    'update_item'   => __( 'Actualizar Escritor' ),
    'add_new_item'  => __( 'Añadir nuevo Escritor' ),
    'new_item_name' => __( 'Nombre del nuevo Escritor' ),
    'separate_items_with_commas' => __( 'Separar Escritores por comas' ),
    'add_or_remove_items' => __( 'Añadir o eliminar Escritores' ),
    'choose_from_most_used' => __( 'Escoger entre los Escritores más utilizados' )
  );

  register_taxonomy( 'escritor', 'libro', array(
    'hierarchical'  => false,
    'labels'        => $labels, /* ADVERTENCIA: Aquí es donde se utiliza la variable $labels */
    'show_ui'       => true,
    'query_var'     => true,
    'rewrite'       => array( 'slug' => 'escritor' ),
  ));

Ejemplo visual

Algunas funciones útiles para administrar las taxonomías

Al igual que con los custom post types, existen funciones que nos permiten manejar nuestras taxonomías (sean personalizadas o no):

  • get_taxonomies() – Obtienes una lista de las taxonomías registradas.
  • get_object_taxonomies($object_type) – Retorna todas las taxonomías que pertenecen al $object_type especificado.
  • get_taxonomy() – Recupera la taxonomia especificada.
  • taxonomy_exists() – Comprueba que la taxonomía existe. Falso si no existe.
  • is_taxonomy_hierarchical() – Nos dice si una taxonomía es jerárquica. Falso en caso negativo.
  • register_taxonomy – Crea o modifica un objeto de taxonomía. No usar antes del init.

Personalizar el nuevo tipo de post

Para personalizar tus nuevos tipos de post, solo tienes que cargar dos archivos de plantillas correspondientes en el directorio principal de tu tema. Los nombres de estos archivos de plantillas deberían verse así:

  • Plantilla para un post individual: single-{post-type}.php
  • Plantilla para una página de archivo: archive-{post-type}.php.

La parte {post-type} de los nombres de los archivos debe ser el nombre del parámetro 1 de register_post_type(). En este ejemplo, los nombres de los archivos son single-article.php y archive-article.php.

Si no creas plantillas, WordPress usará single.php y archive.php, manteniendo todos tus posts y archivos idénticos.

Dicho esto, la mejor manera de comenzar es duplicando single.php o archive.php y cambiarles el nombre como se muestra arriba. De esta manera, la estructura general es idéntica al resto de tu tema y ​​todas las etiquetas de plantilla requeridas ya están en su lugar. Por lo tanto, te será más fácil estilizar la plantilla más adelante.

Mostrar tipos de post personalizados en la página principal

Los tipos de post personalizados no se muestran en la página principal por defecto. Por eso, debes escribir una nueva función que invoque el método set del objeto WP_Query de WordPress. Veamos primero la estructura del código:

add_action( 'pre_get_posts', 'add_my_post_types_to_query' );
  
function add_my_post_types_to_query( $query ) {
    if ( is_home() && $query->is_main_query() )
        $query->set( 'post_type', array( 'post', 'libros' ) );
    return $query;
}

No olvides reemplazar ‘libros‘ con tu tipo de publicación personalizada.

Consulta de tipos de publicaciones personalizadas

Si está familiarizado con la codificación y le gustaría ejecutar consultas de bucle en sus plantillas, aquí le mostramos cómo hacerlo. Al consultar la base de datos, puede recuperar elementos de un tipo de publicación personalizada.

Deberá copiar el siguiente fragmento de código en la plantilla donde desea mostrar el tipo de publicación personalizada.

<?php 
$args = array( 'post_type' => 'movies', 'posts_per_page' => 10 );
$the_query = new WP_Query( $args ); 
?>
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h2><?php the_title(); ?></h2>
<div class="entry-content">
<?php the_content(); ?> 
</div>
<?php endwhile;
wp_reset_postdata(); ?>
<?php else:  ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

Este código define el tipo de publicación y la cantidad de publicaciones por página en los argumentos de nuestra nueva clase WP_Query. Luego ejecuta la consulta, recupera las publicaciones y las muestra dentro del ciclo.

Mostrar campos personalizados

Para mostrar los campo personalizados necesitamos meternos en el código fuente de WordPress e implementar las funciones que nos ofrece la API del plugin Advanced Custom Fields.

Las funciones get_field() y the_field()

La función get_field() devuelve el valor de un campo específico y la función the_field() muestra el valor de un campo específico. A ambas funciones se les pasa el nombre del campo. Este sería un ejemplo de uso para mostrar un campo llamado precio.

<?php if(get_field('precio'))?>
   <p><?php the_field('precio');?></p>
<?php endif; ?>

Si queremos mostrar estos campos cuando vemos la entrada, tendriamos que editar el fichero single.php. En el caso que he explicado en este post, en el que solo quiero mostrar estos campos para las entradas de categoría inmueble, tengo que añadir también una condición en el fichero single.php

<?php if ( in_category('inmueble') ) {
  //muestro la entrada personalizada
}
else{
  //muestro normal
}?>

Fuentes de referencia para el post

boluda.com/tutorial/uso-de-los-custom-post-types-en-wordpress/

wpmudev.com/blog/add-custom-post-types-to-tags-and-categories-in-wordpress

wpbeginner.com/wp-tutorials/how-to-create-custom-post-types-in-wordpress/

hostinger.com.ar/tutoriales/custom-post-types-wordpress

dariobf.com/custom-post-types-wordpress/

esthersola.com/wp-basicos-custom-post-type/

conchaalviz.com/blog/anadir-custom-post-types-a-categorias-y-etiquetas-en-wordpress/


Blog

Instagram @holavertegrande