Ordenar términos de una taxonomía en WordPress mediante un campo personalizado

PHPWordPress

En WordPress podemos crear taxonomías personalizadas y además agregar campos personalizados a las mismas. Podríamos utilizar las taxonomías page y post de WordPres, pero como se que os gusta aprender, utilizaremos otra nueva que vamos a crear. Los que ya sepáis crear taxonomías podéis saltaros esta parte e ir hasta el último apartado del artículo para ver cómo obtener los términos ordenados mediante el campo personalizado, pero para los novatos, vamos a explicar el ejemplo en el que nos vamos a basar.

Creando una taxonomía personalizada en WordPress

Dos ejemplos de taxonomías son las etiquetas y las categorías, aunque WordPress permite crear otras nuevas, así que vamos a ver un ejemplo de taxonomía al que llamaremos «variedad».

add_action( 'init', 'crear_taxonomia_variedades' );

function crear_taxonomia_variedades() {

 $labels = array(
     'name' => 'Variedades',
     'singular_name' => 'Variedad'
 );
 $args = array(
     'public' => true,
     'hierarchical' => true,
     'labels' => $labels,
     'show_ui' => true,
     'show_admin_column' => true,
     'show_in_nav_menus' => true,
     'query_var' => true,
     'rewrite' => array( 'slug' => 'variedades' )
 );
 register_taxonomy( 'variedades', array( 'post'), $args );
}

add_action( 'init', 'crear_taxonomia_variedades');

El código es muy sencillo, primero creamos la función crear_taxonomia_variedades en la que agregaremos el código para crear la nueva taxonomía. Dentro de esta función llamamos a la función register_taxonomy, que es la función de WordPress que creará la taxonomía en sí. La función register_taxonomy tiene como primer parámetro el nombre de la nueva taxonomía, que es variedades; como segundo parámetro le pasamos a la función un array con el tipo de post o tipo de contenido al que será posible asignar los términos de la taxonomía, que en el ejemplo es solamente post; por último pasamos a la función los argumentos para configurar la taxonomía, que para simplificar los hemos definido encima mediante la variable $args.

Mediante ‘public’ definimos la visibilidad del post; mediante ‘hierarchical’ definimos si los términos de la taxonomía se podrán organizar jerárquicamente (unos dentro de otros, en varios niveles) o no. Mediante ‘labels’ definimos las etiquetas que hemos definido en el array $labels, que en este ejemplo, son ‘name’ (nombre de la taxonomía, que es Variedades) y ‘singular name’, que será el nombre en singular de la taxomía (Variedad). Mediate ‘rewrite’ definimos el slug de la taxonomía, que es la porción de url que se le asignará. Por ejemplo, si dentro de Variedades creamos Mar y Río, podremos acceder a los listados de cada término mediante las URLs http://url_de_la_web/variedades/mar y http://url_de_la_web/variedades/rio.

Finalmente hacemos que cuando WordPress cargue las taxonomías también cargue la que hemos definido y lo hacemos agregando la función que hemos creado mediante add_action( ‘init’, ‘crear_taxonomia_variedades’).

Agragar un campo personalizado a la taxonomía

Es tan sencillo como crear un campo de texto dentro del panel de edición de las taxonomías. Primero definimos la función en la que mostraremos el campo en el panel de edición de la taxonomía. Por ejemplo, vamos a crear un campo de texto llamado orden, que nos servirá para asignar una prioridad y orden a los términos de la taxonomía, aunque podemos crear cualquier otro campo. Sencillamente creamos un campo numérico para poder obtener más tarde una lista ordenada de términos en base a un campo personalizado, que es nuestro objetivo final.

function taxonomy_variedades_edit_meta_fields($term) {
  $orden = get_term_meta( $term->term_id, 'orden', true );
  ?>
  <div class="form-field">
    <label for="orden">Orden</label>
    <input type="text" name="orden" id="orden"
    value="<?php if($orden){ echo($orden); } ?>">
  </div>
  ?>
}
// Agregamos la función que hemos definido al ancla o hook de WordPress en la que se cargan las taxonomías.
// Es importante conservar el nombre de "variedades" tal y como se ha definido anteriormente.

add_action( 'variedades_add_form_fields', 'taxonomy_variedades_edit_meta_fields', 10, 2 );

Listo, ahora podremos ver un nuevo campo al editar la taxonomía, pero ahora necesitaremos guardarlo en la base de datos, así que debemos decirle a WordPress lo que ha de hacer cuando se guarde la taxonomía.

function update_taxonomy_variedades_meta( $term_id, $tt_id ){

  // Comprobamos si el campo que hemos creado está presente para
  // evitar fallos
  if( isset( $_POST['orden'] ) ){
    // Actualizamos el campo personalizado orden con el valor del campo definido en el formulario anterior
      update_term_meta( $term_id, 'orden', $_POST['orden']);
  } else {
    // Me gusta borrar los campos personalizados cuando no tengan valor, aunque es algo opcional
    delete_term_meta( $term_id, 'orden', $_POST['orden']);
  }
}

//Agregamos la acción al momento en el que se ha guardado la taxonomía

add_action( 'edited_variedades', 'update_taxonomy_variedades_meta', 10, 2 );

Vamos a ver ahora cómo obtener los términos de una taxonomía ordenados mediante el campo orden.

Obtener términos de la nueva taxonomía ordenados mediante el nuevo campo personalizado

Vamos a ver cómo obtener los términos de una taxonomía ordenados mediante un campo personalizado. Habitualmente querremos hacer ésto en una plantilla de nuestro tema. Seguiremos de nuevo con el ejemplo del campo orden que hemos definido anteriormente.

Primero obtenemos los términos de la taxonomía que hemos creado mediante la función get_terms. Lamentablemente, WordPress no permite obtener los términos ordenados mediante el valor de un campo personalidzado como ocurre con los posts, sino que tendremos que ordenarlos nosotros.

$terminos = get_terms(
              array(
                'taxonomy' => 'variedades',
                'hide_empty' => false
              )
            );

Una vez tenemos los términos en el array $terminos, lo recorremos y utilizamos la función get_term_meta para obtener el valor del campo personalizado orden de cada término. Lo que hacemos es insertar el término en un nuevo array de modo que el campo orden sea su clave dentro del array.

$terms_array = array( );
foreach ( terminos as $termino ) {
  $orden = get_term_meta( $termino->term_id, 'orden', true );
  if($orden){ $terms_array[$orden] = $termino; }
}

Finalmente ordenamos secuencialmente el array en base a la clave de sus elementos usando la función ksort.

ksort( $terms_array, SORT_NUMERIC );

Hemos finalizado. Ahora ya podremos recorrer el array y obtener cada término de la taxonomía estando ordenados en relación al campo personalizado orden.

foreach ( $terms_array as $ord=> $term ) {
  echo($termino->term_id);
}

Listo, espero que os haya sido útil.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”