Taxonomías personalizadas en wordpress

Una taxonomía en wordpress sirve para clasificar contenido.
WordPress incluye dos taxonomías para clasificar las entradas: categorías y etiquetas.

«Las categorías permitían una agrupación amplia de temas de las entradas, pero cuando querías describir una entrada en términos más específicos necesitabas utilizar más categorías. Esto daba como resultado grandes listas de categorías dentro del blog y grandes listas en los Widgets de categorías.

Ahora tenemos etiquetas también.

Las etiquetas son similares a las categorías pero generalmente son utilizadas para describir tus publicaciones con más detalle.» – Categorías vs. Etiquetas – en.support.wordpress.com.

Las páginas se pueden clasificar con relación jerárquica – padre e hijo – por ejemplo una página llamada «programación» pueden servir como base para agrupar páginas más detalladas como «Ruby», «PHP», «JavaScript».

Dependiendo del comportamiento que queramos para el contenido es probable que necesitemos crear otras taxonomías – en particular si utilizamos tipos de entrada personalizados -.

Registrar una taxonomía

Al igual que con las entradas personalizadas es posible registrar la taxonomía en el tema utilizando el archivo functions.php o hacer un plugin.

Para mantener la flexibilidad de cambiar el tema sin perder la funcionalidad prefiero hacer un plugin.
Para registrar una taxonomía utilizamos la función register_taxonomy.

<?php
   register_taxonomy($taxonomia, $objetos, $parametros);
?>

Parámetros de register_taxonomy

El primer parámetro es el nombre de la taxonomía.
Si utilizas varias taxonomías o si crees que es probable que el nombre de tu taxonomía sea el mismo que el nombre de un plugin puedes utilizar un prefijo para prevenir este inconveniente.

<?php
   register_taxonomy('lenguaje', $objetos, $parametros);
?>

En el segundo parámetro se definen el tipo – o los tipos – de entrada donde se va a utilizar la taxonomía.
Los valores pueden ser post para las entradas, page para las páginas, attachment para los archivos adjuntos, revision para las revisiones, nav_menu_item para los menús de navegación o el nombre de una entrada personalizada – en minúsculas sin espacios en blanco – si estás utilizando entradas personalizadas.

<?php
   register_taxonomy('lenguaje', array('post', 'page'), $parametros);
?>

El tercer parámetro de register_taxonomy es donde se indica la manera en la cuál va a funcionar la taxonomía.
Los valores permitidos son:

Valor

Descripción

labels

Arreglo con etiquetas – cadenas de texto – donde se define cómo se va a visualizar la taxonomía en la sección de administración.
Si la taxonomía no es jerárquica se va a mostrar de manera parecida a las etiquetas.
Si la taxonomía es jerárquica se va a mostrar de manera similar a las categorías.
Los valores pueden ser *:
name: Nombre de la taxonomía, generalmente en plural. Ej. Categorías.
singular_name: Nombre para un elemento de la taxonomía, nombre en singular de la taxonomía. Ej. Categoría.
menu_name: Nombre del menú. Si no se establece utiliza el valor definido en name.
all_items: Texto que se utiliza para visualizar todos los términos de la taxonomía. Ej. Todas las Etiquetas.
edit_item: Texto que se utiliza para editar un término. Ej. Editar Categoría.
view_item: Texto que se utiliza para visualizar un término. Ej. Ver Categoría.
update_item: Texto que se utiliza cuando se actualiza un término. Ej. Actualizar Categoría.
add_new_item: Texto que se utiliza cuando se agrega un nuevo término. Ej. Agregar Nueva Categoría.
new_item_name: Texto para mostrar cuando se agrega un nuevo nombre de término. Ej. Nuevo Nombre de Categoría.
parent_item: Texto para mostrar el término padre (utilizado con taxonomías jerárquicas). Ej. Categoría Superior.
parent_item_colon: Texto para mostrar el término padre seguido de dos puntos (utilizado con taxonomías jerárquicas). Ej. Categoría Superior:
search_items: Texto que se utiliza para buscar elementos. Buscar Categorías.
popular_items: Encabezado para la nube de etiquetas de las más populares (utilizado con taxonomías no jerárquicas). Ej. Etiquetas Más Utilizadas.
separate_items_with_commas:Texto que indica que que se tienen que introducir elementos separados por coma en la caja meta – metabox -. Sólo se utiliza con taxonomías no jerárquicas. Ej. Separar etiquetas con comas.
add_or_remove_items: El texto para agregar o eliminar elementos que es utilizado en la caja meta – metabox – cuando JavaScript se encuentra deshabilitado. Sólo se utiliza con taxonomías no jerárquicas. Ej. Agregar o eliminar etiquetas.
choose_from_most_used: Texto que se muestra para elegir una taxonomía de los términos más utilizados. Sólo se utiliza en taxonomías no jerárquicas. Ej. Elige de las etiquetas más utilizadas.
not_found: Texto que se muestra cuando se utiliza choose_from_most_used pero no hay contenido para visualizar. Sólo se utiliza con taxonomías no jerárquicas. Ej. No se encontraron etiquetas.
* Si no se establece un valor utiliza los valores de las categorías – si la taxonomía es jerárquica – o los valores de las etiquetas – si la taxonomía no es jerárquica.

public

Determina si la taxonomía se puede consultar de manera publica o únicamente en el área de administración.
Los valores pueden ser true o false.

show_ui

Indica si la taxonomía es visible en la interfaz de administración
Si no se establece el valor utiliza el valor definido en public.

show_tagcloud

Indica si la taxonomía se puede seleccionar en el widget de la etiqueta de nubes.
Si no se establece utiliza el valor definido en show_ui.

meta_box_cb

Nombre para una función callback para la visualización en la caja meta – metabox -.
De manera predefinida utiliza post_categories_meta_box() para las taxonomías jerárquicas y post_tags_meta_box() para las taxonomías no jerárquicas. No se muestra la caja meta si se establece un valor false.

show_in_nav_menus

Indica si permite que los términos de la taxonomía se utilicen en los menús de navegación.
Si no se establece utiliza el valor definido en public.

hierarchical

Define si la taxonomía es jerárquica (como las categorías)- true – o no (como las etiquetas) – false -.

update_count_callback

Permite asociar una función callback que se manda llamar cada vez que modifica el número de términos.

query_var

De manera predeterminada va a utilizar el nombre de la taxonomía, pero se puede establecer como falso para prevenir consultas (utilizando WP_Query).

rewrite

Permite ajustar la estructura de los enlaces permanentes – permalinks – en las plantillas que utilizan los términos de la taxonomía.

Puede ser true, false o un arreglo de valores. Los valores del arreglo son:
slug: El término (slug) que quieres como prefijo en las plantillas de los términos de la taxonomía.
with_front: Si quieres que los términos utilicen el nombre en las preferencias de los permalinks (true o false).
hierarchical: Si quieres que se puedan implementar URLs jerárquicos (true o false).
ep_mask: Asigna una máscara de punto final a la taxonomía. De manera predefinida es EP_NONE.
Si no se asigna la máscara de punto final – EP_MASK – los permalinks no van a funcionar. – Resumen de los puntos finales en wordpress.

capabilities

Permite definir el rol del usuario que tiene acceso a utilizarlo.
De manera predeterminada los usuarios que tengan la capacidad manage_categories pueden crear editar y eliminar términos
Los usuarios que tengan la capacidad edit_posts pueden asignar los términos a una publicación
manage_terms: Capacidad para visualizar los términos en el área de administracion.
edit_terms: Permite crear y editar términos
delete_terms: Permite eliminar términos.
assign_terms: Permite asignar términos a una publicación (al crear y / o editar).

sort

Define si la taxonomía debe recordar el orden en el cuál los elementos – de la taxonomía – fueron asociados a los objetos – entradas -.

Para poder utilizar la taxonomía definida, tenemos que enganchar – crear un gancho / hook – register_taxonomy cuando el evento init suceda.

El siguiente ejemplo funciona para clasificar páginas y / o entradas con distintos lenguajes.
La taxonomía lenguajes se va a comportar como etiquetas – no va a utilizar jerarquías – y, si se habilita en los enlaces permanentes, la taxonomía se va a visualizar como lenguaje en el URL.

<?php

/*
  Definimos la función que se va a encadenar al evento init. 
*/

function registrar_taxonomia() {
/*
  Utilizamos un arreglo para almacenar las etiquetas 
  que se van a visualizar en la interfaz.
*/

 $etiquetas = array(
   'name' => __( 'Lenguajes' ),
   'singular_name' => __( 'Lenguaje' ),
   'add_new' => __( 'Nuevo lenguaje' ),
   'all_items' => __('Todos los lenguajes'),
   'add_new_item' => __( 'Agregar lenguaje' ),    
   'edit_item' => __( 'Editar lenguaje' ),
   'new_item' => __( 'Nuevo lenguaje' ),
   'view_item' => __( 'Ver lenguajes' ),
   'search_items' => __( 'Buscar lenguajes' ),
   'update_item' => __('Actualizar lenguaje'),
   'separate_items_with_commas' => __('Separa los lenguajes con comas'),
   'popular_items' => __('Lenguajes más utilizados'),
   'choose_from_most_used' => __('Elige entre los lenguajes más utilizados'),
   'add_or_remove_items' => __( 'Agregar o quitar lenguajes'),
   'not_found' => __('No se encontraron lenguajes'),
   'not_found_in_trash' => __('No se encontraron lenguajes en la basura'), 
   'menu_name' => __("Lenguajes")
 );

/*
  Definimos las propiedades de comportamiento. 
  Para asignar las etiquetas utilizamos el nombre del arreglo. 
  De esta manera queda un poco más legible el código. 
*/  
  $opciones = array(
      'public' => true,
      'labels' => $etiquetas,
      'hierarchical' => false,
      'rewrite' => array( 'slug' => 'lenguaje', 'with_front' => true )      
);

/*
  Registramos el nombre de la taxonomía, lo asociamos
  a los tipos de entrada donde queramos utilizar la taxonomía
  y establecemos las opciones. 
*/

  	register_taxonomy('lenguaje', array( 'page', 'post' ), $opciones);
}

/*
  Creamos el hook para mandar registrar la taxonomía.
*/
add_action('init', 'registrar_taxonomia', 0);

?>

Plantilla

Si queremos una plantilla para visualizar las publicaciones que están clasificadas con esta taxonomía necesitamos crear el archivo: taxonomy-{nombre-taxonomia}.php
En este caso utilicé taxonomy-lenguaje.php para visualizar las entradas que están clasificadas con la taxonomía.
Si vas a utilizar la plantilla, ve a la sección de ajustes > enlaces permanentes – permalinks – y vuelve a guardar la configuración que tienes – para que se actualicen las reglas de rescritura / rewrite rules -.

<?php get_header(); ?>
<div class='row'>
      <h2>Lenguajes</h2>
      <!-- Loop -->
      <div class='post-group default row'>
      	<div class='nine columns post-group-content'>
        	<?php
        	if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
            <!-- Visualización del resumen de la entrada -->
            <article <?php post_class( 'leftaside' ); ?>>
            	<header class="post-header">
            		<h1 class="post-title entry-title">
            			<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
            		</h1>
            	</header>
            	<div class="row">

            		<section class="post-content">
            			<p class="hatom-meta meta date updated"> <time datetime="<?php echo the_time('Y-m-d'); ?>" ><?php the_time('m/d/Y'); ?></time>
            			<?php the_post_thumbnail( 'medium-thumbnail' ); ?>
            			<?php the_excerpt('Leer Más...'); ?>
            		</section>
            	</div>              
              <div class='lenguajes'>
                <?php echo get_the_term_list( $post->ID, 'lenguaje', '', ', ', '' ); ?>
              </div>
            </article>        		
            <!-- Visualización del resumen de la entrada -->
        	<?php endwhile; ?>
        	<?php endif; ?>
      	</div>
      </div>
      <!-- Loop -->      
  </div>
  <?php get_sidebar(); ?>
<?php get_footer(); ?>

get_the_term_list se va a encargar de visualizar las taxonomías – en este caso cada lenguaje – con las que está asociada cada entrada.

Uso

Una vez que se tiene definido el archivo de la taxonomía se incluye en la página de plugins de wordpress.

Habilitar la taxonomía personalizada desde el menú de plugins

Una vez hecho esto la taxonomía debe de estar disponible en los tipos de publicación para los cuáles se habilitó.

Taxonomía personalizada en el menú de páginas

Taxonomía personalizada en el menú de entradas

Dependiendo de cómo se habilitó el comportamiento (como categorías o etiquetas) se va a visualizar en el menú de creación / edición de los tipos de entrada asociados.

Asociar taxonomías con una entrada.

Puedes descargar la taxonomía y la plantilla, además de archivos que pueden funcionar como base para que hagas tus taxonomías de github o bitbucket.