17may
27

Esta es otra entrega del repaso que estoy haciendo en mi blog de las novedades más interesantes que nos aporta WordPress 3.1. Este último artículo ha llegado con un poco de retraso, pero bueno, aquí está, esta vez publicado en Ayuda WordPress.

Vamos a ver una novedad muy interesante que nos ofrece WordPress 3.1: la posibilidad de seleccionar a la vez múltiples taxonomías. Imaginémonos que tenemos varias taxonomías, por ejemplo (suponiendo que las entradas hacen referencia a videojuegos): Plataforma, Desarrollador, Género, Edad Recomendada, etc… Hasta ahora si queríamos obtener los resultados que pertenecieran a una taxonomía concreta no teníamos problemas. Pero si queríamos mostrar los resultados que pertenecieran a dos taxonomías a la vez (por ejemplo aquellos videojuegos cuya plataforma es Playstation 3 y su edad recomendada 18 años) no podíamos hacerlo. Hasta ahora.

Pero empecemos desde el principio. Vamos a ver primero qué es una taxonomía y dónde estábamos antes de WordPress 3.1

Qué es una Taxonomía

Sabéis que WordPress tiene Categorías y Etiquetas. Pues bien, estas son en sí mismas taxonomías, es decir, criterios para clasificar una entrada, artículo, noticia o como queráis llamarlo. Lo interesante es que además de las Categorías y de las Etiquetas WordPress te permite crear taxonomías adicionales con el fin de lograr una mejor clasificación de tus entradas.

Por ejemplo, si queremos clasificar un grupo de videojuegos podemos hacerlo de muchas maneras: según su plataforma (PC, Playstation 3, XBox 360, etc..), según la edad recomendada, el tipo de juego, el precio, etc… Es más que probable que sólo con las Categorías y las Etiquetas te quedes corto y necesites crear nuevas taxonomías.

Cómo crear una taxonomía

Vamos con un ejemplo real. Vamos a suponer que tenemos este videojuego para una web figurada que se llama “misvideojuegos.com”:

  • Título de la Entrada: Postal 2
  • Categoría: Inteligencia
  • Etiquetas: Ciencia ficción, 3D
  • Idioma: Castellano
  • Plataforma: XBox 360
  • Fabricante: Valve
  • Edad: 12 años

Lo que vamos a lograr es que se pueda adjuntar toda esta información al videojuego que vayas a crear en WordPress. Para lograrlo necesitarás crear (o “registrar” como lo llaman en WordPress) las nuevas taxonomías. Para ello abre el archivo functions.php de tu tema y escribe:

function crear_mis_taxonomias() {
  register_taxonomy('idioma', 'post', array(
  'hierarchical' => false, 'label' => 'Idioma',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('plataforma', 'post', array(
  'hierarchical' => false, 'label' => 'Plataforma',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('fabricante', 'post', array(
  'hierarchical' => false, 'label' => 'Fabricante',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('edad', 'post', array(
  'hierarchical' => false, 'label' => 'Edad',
  'query_var' => true, 'rewrite' => true));
}
add_action('init', 'crear_mis_taxonomias', 0);

Grabamos el archivo y entramos en el administrador de WordPress. Si hacemos click en añadir una nueva Entrada, veremos que en la derecha, debajo de etiquetas, tenemos las nuevas taxonomías:

Taxonomías en WordPress

Para crear o “registrar” una taxonomía utilizamos la función de WordPress register_taxonomy(). En este enlace podéis ver la gran cantidad de parámetros que podemos usar al crear nuestras taxonomías.

En el código podemos ver que el segundo parámetro es el que indica a qué objeto aplicamos las nuevas taxonomías. En el ejemplo hemos puesto “post”, lo cual indica que se añadirán a cualquier Entrada que creemos. ¿Y si queremos que aparezcan en las Páginas pero no en las Entradas? Entonces pondríamos ‘page’. ¿Y si hemos creado unas Entradas Personalizadas que se llaman “videojuegos”? (si queréis ver cómo crear entradas personalizadas podéis verlo en el artículo Nuevo en WordPress 3.1: Archivos de Entradas Personalizadas. Entonces escribiríamos ‘videojuegos’ y las taxonomías saldrían sólo en las entradas personalizadas que se llaman ‘videojuegos’. ¿Y si queremos que salgan en varios sitios? Entonces en vez de una cadena ponemos un array:

register_taxonomy('edad', array('videojuegos', 'post'), array(
  'hierarchical' => false, 'label' => 'Edad',
  'query_var' => true, 'rewrite' => true));

Si hemos añadido las taxonomías a una entrada personalizada estas aparezerán en el menú de la izquierda bajo la misma:

Taxonomías en entradas personalizadas

¿Qué URLs obtenemos?
Ahora obtendremos nuevas URLs en línea con las nuevas taxonomías. Por ejemplo:


http://www.misvideojuegos.com/edad/12-anos/

http://www.misvideojuegos.com/idioma/castellano/

http://www.misvideojuegos.com/plataforma/playstation-3/

http://www.misvideojuegos.com/fabricante/valve/

Estas URLs utilizarán el fichero archive.php de nuestro tema para mostrar todas las entradas que cumplan con la taxonomía correspondiente. Pero ¿cómo las mostramos?

Mostrar las entradas correspondientes a una etiqueta de una taxonomía concreta

Para mostrar las entradas que tengan una etiqueta concreta de una de nuestras taxonomías tenemos que poner este código antes del “loop” de nuestro tema:

<?php query_posts(array('plataforma' => 'playstation-3', 'showposts' => 15)); ?>

Se mostrarán entonces todas las entradas que pertenezcan a la etiqueta “Playstation 3″ de la Taxonomía “Plataforma”. Le hemos indicado también que muestre 15 entradas.

Nota: Cuando decimos antes del loop es antes de:

    <?php while ( have_posts() ) : the_post(); ?>

Mostrar todos los valores de una taxonomía

Si queremos mostrar todas las entradas, una a una, que correspondan a una taxonomía concreta simplemente pon este código:

<?php echo get_the_term_list($post->ID, 'plataforma', 'Plataforma: ', ', ', ''); ?>

Los tres últimos parámetros le dicen a WordPress qué es lo que tiene que poner antes de los enlaces de las etiquetas, entre cada enlace y después de cada enlace respectivamente.

Mostrar una nube de taxonomías en tu tema de WordPress

Para mostrar una nube de taxonomías que contenga todas las etiquetas de una taxonomía concreta, añade este código donde quieras que aparezca:

<?php wp_tag_cloud(array('taxonomy' => 'plataforma', 'number' => 30)); ?>

Recuerda cambiar “plataforma” por el nombre de tu taxonomía. También puedes editar el parámetro “number” que especifica cuantas etiquetas se van a mostrar. Para mostrarlas todas pon “0″.

Consultas avanzadas de Taxonomías en WordPress 3.1

Bueno, por fin estamos donde queríamos llegar: a las novedades que nos ofrece WordPress 3.1 para las Taxonomías. Las consultas avanzadas de Taxonomías usan un nuevo parámetro en las funciones de consulta que se llama “tax_query”

tax_query es un array de arrays, donde cada array describe qué criterio quieres que se cumpla a la hora de mostrar las entradas. No hay mucha documentación aún sobre tax_query, por lo que seguro que saldrán más y mejores usos de los que pongo yo aquí.

Supongamos que en nuestro blog tenemos una Categoría que se llama “Libros” y una etiqueta que se llama “Misterio” (recordad que las Categorías y las Etiquetas son Taxonomías). Si queremos mostrar todas las entradas que tengan la categoría “Libros” y la etiqueta “Misterio”, pondríamos antes del “loop”:

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
    array(
     'taxonomy' => 'category',
     'terms' => array('Libros'),
     'field' => 'slug',
   ),
  array(
  'taxonomy' => 'post_tag',
    'terms' => array('Misterio'),
    'field' => 'slug',
   ),
);
query_posts($custom_query);
query_posts($custom_query);

Como veis las entradas que se van a mostrar satisfacen los dos criterios a la vez. Se puede incluir un array de Categorías y un array de Etiquetas. Más opciones:

Si lo que queremos es que NO salgan las entradas que tengan una o varias categorías concretas (por ejemplo, que no salgan las entradas con las categorías “Libros” ni “Discos”):

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
array(
'taxonomy' => 'category',
'terms' => array('libros', 'discos'),
'field' => 'slug',
'operator' => 'NOT IN',
),
);
query_posts($custom_query);

Igualmente, esto hay que ponerlo antes del loop, para que en el loop sólo salgan las entradas que hemos seleccionado previamente. Como veis, a diferencia del anterior ahora hay un nuevo parámetro llamado “operator” que tiene como valor “NOT IN”.

Por último, podemos seleccionar que salgan las entradas que son de una Categoría (por ejemplo “Libros”) o de una etiqueta concreta (por ejemplo “Heavy”). Como veréis a continuación, la diferencia radica en el parámetro “relation”.

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'terms' => array('libros'),
'field' => 'slug',
),
array(
'taxonomy' => 'post_tag',
'terms' => array('heavy'),
'field' => 'slug',
),
);
query_posts($custom_query);

Os habréis fijado que en estos ejemplos hay un campo que se llama “field” para el que hemos dado el valor “slug”. Si en vez del “slug” queremos dar el ID de la Categoría o Etiqueta, tendriamos que poner “term_id”. También se puede poner su nombre con “name” en vez de “slug”. Por defecto es “term_id”.

Eso en cuanto a Categorías y Etiquetas, pero ¿y si quiero hacerlo con las taxonomías que he creado? Pues por ejemplo, si quiero que salgan sólo aquellos videojuegos que estén recomendados para una edad superior a los 18 años, pondría antes del loop:

$myquery['tax_query'] = array(
	array(
		'taxonomy' => 'edad',
		'terms' => array('19'),
		'field' => 'slug',
	),
);
query_posts($myquery);

Saldrían aquellos artículos en los que en el cuadro de la nueva taxonomía “Edad” haya incluido el número 18. Podría hacer igualmente combinaciones y exclusiones tal y como hicimos con las Categorías y las Etiquetas.

Pero siguiendo con el ejemplo que teníamos más arriba, en el que teníamos una entrada personalizada llamada “Videojuegos” con varias taxonomías, si suponemos que sólo queremos mostrar las entradas personalizadas “videojuegos” cuya taxonomía “Edad” sea 18 años, ponemos antes del loop:

<?php
$query = array(
tax_query => array(
array(
taxonomy => 'edad',
terms => array('18'),
field => 'slug'
)
),
'post_type' => 'videojuegos'
);
query_posts($query);
?>

Como veis hemos añadido “post-type” para poner el nombre de la entrada personalizada.

Y por último, sabed que incluso podemos combira meta_query con tax_query, como en este ejemplo:

$query = array(
'post_type' => 'ad',
'meta_query' => array(
array(
'key' => 'status',
'value' => 'Active',
'compare' => 'LIKE'
)
),
'tax_query' => array(
array(
'taxonomy' => 'size',
'terms' => array( 'box' ),
'field' => 'slug'
)
)
);

Y esto es todo, ¡espero que os sea de utilidad!

Para saber más:

  • Pingback: Artículo publicado en Ayudawordpress.com: Taxonomías avanzadas en Wordpress 3.1 | emenia.es

  • http://joseluiscruz.info/ José Luis

    ¡Orale! muchas gracias :3

  • Anónimo

     Muchas gracias, está todo perfectamente explicado.

  • Anónimo

    Excelente artículo, la verdad es que me ha ayudado bastante para la planificación de un nuevo proyecto.saludos

  • http://www.metrobarcelona.es/ Ismael (Metro Barcelona)

    Gracias. No sabía que se podia ampliar tanto el abanico de wordpress. No deja de sorprenderme. 

  • http://evzek.net/ evZek

    Increíble guía, nunca había visto una tan completa en español, de mucha utilidad y sirve como una gran referencia con un excelente ejemplo.

  • http://www.emenia.es Juan Diaz-Bustamante

    Gracias por vuestros comentarios!

  • http://www.ecualia.com.ar juani

     Muy buen articulo! solo un comentario:
    Cuando pones la función get_the_term_list(… es para mostrar los “Terms” de un post y no las entradas (yo lo entiendo como los post de un blog). Corregime si me equivoco en la observación. 
    Saludos

    • http://www.emenia.es Juan Diaz-Bustamante

      Si, tienes razón juani

  • http://www.evitalacrisis.com/ Evita la Crisis

    Hola

    Cuando hablas de mostrar los post te refieres en el blog?? Es decir, si no añado ese codigo los post de una determinada taxonomia no se veran??

    Salu2

  • Snake_eyes

    Existe un buscador por taxonomias?, por ejemplo poder elegir que busque solo titulo, genero, año, idioma, etc ??

    • Kanodmnt

       misma duda

  • byhanzo

    Te puedo decir que es la única vez que he comprendido bien lo que son las taxonomías y también he aprendido a la perfección como implantarlas, además de todas las opciones que tienen. Muy bien redactado y explicado. Felicidades!!!

    Saludos!!!

    • http://www.rockrknight.host22.com/ Rockrknight

      Lo mismo digo. Muy bien explicado el artículo.

      • http://www.emenia.es Juan Diaz-Bustamante

        Muchas gracias por vuestros comentarios!

    • http://www.rockrknight.host22.com/ Rockrknight

      Lo mismo digo. Muy bien explicado el artículo.

    • http://www.rockrknight.host22.com/ Rockrknight

      Lo mismo digo. Muy bien explicado el artículo.

  • Xavierlight

    Excelente post, felicitaciones porque esta super bien redactado, me gustaria saber como poner una taxonomia en el home de la pagina, reemplazando el index tradicional,  y que esta taxonomia preserve la paginacion, como si fuese en si la misma taxonomia (Categorias) que trae wordpress por defecto.

  • http://lurkide.wordpress.com Restaurante Lurkide

    Un magnifico post y una gran ayuda.
    Como comentario, diré que las etiquetas no son taxonomías, son folksonomías. La principal diferencia, sin entrar en términos académicos, es que ni son jerárquicas, ni excluyentes, ni objetivas, entre otras características.
    Una taxonomía debería ser creada y mantenida por el creador de la web, mientras que una folksonomía debería ser alimentada, directa o indirectamente, por el usuario, empleando su lenguaje y preferencias.

  • Daniel Perez

    Que lastima, tenia que haber leido esto antes, ahora tengo una media de tres categorias por post y no puedo ni hacer busquedas avanzadas, ni mostrar por url los post de tres categorias a la vez…
    De todas formas, el articulo esta muy bien explicado, gracias Fernando

  • Javier

    Una pregunta, ¿no se puede hacer una taxonomía para almacenar una fecha?

  • Daniel Perez

    Hola

  • Dariver74

    Hola,
    Creo que se adapta a lo que estoy preparando pero con otro tipo de productos en lugar de con videojuegos. ¿hay alguna manera para que la gente añada los productos que más le gusten a una lista (lo tengo, quiero comprarlo…?
    Gracias
    Darío

  • Alex

    Gracias por explicar las cosas para humanos… He seguido los pasos tanto para crear entradas personalizadas como nuevas taxonomias. He creado tres entradas personalizadas y todo funciona perfecto. Los problemas los tengo con las taxonomias que las he creado (
    hierarchical’ => true) para ordenarlas jerárquicamente. El tema es que cuando relaciono la entrada con la categoria creada me muestra una pag sin contenido y un mensaje en la pestaña del navegador ‘No se encuentra la pag’. He actualizado los enlaces permanentes y nada. Algo se me escapa pero no logro ver cual es el problema. Agradecería alguna sugerencia u orientación.

    Gracias
    Alex

  • Macgrafic

    Crea una página y aplicale una plantilla de página. Y allí pones el código del looping con la consulta al custom post!

  • http://conexionradio.net/ Radio Pachuca

    Eres un genio esta perfecto todo esto, de verdad que lo voy a usar :D muy bueno gracias :D

  • http://www.facebook.com/javierjimenezmontero Javier Jiménez Montero

    He de decir que sin tener ninguna idea de PHP y cogiendo retales de tu código y alguno suelto de por ahí he conseguido algo que hasta ahora consideraba imposible para mi nivel de programación que es cero.

    Dicho esto necesito poder solucionar el punto en el que me he quedado clavado: En el nuevo tipo de contenido aparecen las nuevas taxonomías pero… ¿Cómo puedo meter el nuevo tipo de contenido en las categorías que ya tenía definidas en “Entradas”? Actualmente el nuevo tipo de contenido no aparece en ninguna parte a pesar de que está creado.

    Muchas gracias por adelantado!