Usando WP_Query con Categorías y Etiquetas

WP_Query tiene un gran n√ļmero de argumentos, que lo hacen muy flexible. Lo puedes usar para consultar cualquier dato contenido en la tabla wp_posts.

A continuación veremos los argumentos para las Categorías y las Etiquetas.

Los argumentos para estas dos taxonomías son similares pero presentan algunas diferencias que debes conocer si quieres usarlas de forma eficaz.

Recordando cómo funcionan los argumentos en WP_Query

Antes de empezar, repasamos c√≥mo funcionan los argumentos en WP_Query. Se debe incluir cuatro elementos principales:

  • Los argumentos para la consulta, usando los par√°metros que veremos a los puntos desarrollados.
  • La consulta en s√≠.
  • El loop.
  • El restablecimiento de los datos del post

Tendría que parecerse a esto:

<?php $args = array(    
// Arguments for your query.
	); 
// Custom query.
$query = new WP_Query( $args ); 
	// Check that we have query results.
	if ( $query->have_posts() ) {     
		// Start looping over the query results.    
		while ( $query->have_posts() ) {         
			$query->the_post();         
		// Contents of the queried post results go here.     
	} } 
		// Restore original post data.
	wp_reset_postdata(); ?>

Los argumentos son lo que le indicará a WordPress qué datos extraer de la base de datos, que es lo que vamos a ver ahora. Aquí nos vamos a centrar en la primera parte del código:

$args = array(
    // Arguments for your query.
);

Como puedes ver, los argumentos están contenidos dentro de una cadena. Verás más ejemplos a lo largo del artículo.

Creando el Código Para Tus Argumentos

Existe una forma concreta de crear el código para los argumentos y es la siguiente:

$args = array(
    'parameter1' => 'value',
    'parameter2' => 'value',
    'parameter3' => 'value'
	);

Debes colocar los par√°metros y sus valores entre par√©ntesis, usa => entre ellos, y sep√°ralos mediante comas. Si cometes aqu√≠ un fallo, WordPress podr√≠a no a√Īadir todos tus argumentos en la consulta o podr√≠as acabar con la conocida pantalla en blanco.

Parámetros de Categoría

Tenemos las siguientes opciones:

  • cat (int): usa el id de la categor√≠a.
  • category_name (string): usa el slug de la categor√≠a.
  • categori__and (array): usa el id de la categor√≠a.
  • category__in (array): usa el id de la categor√≠a.
  • category__not_in (array): usa el id de la categor√≠a.

F√≠jate que en ninguno de ellos usamos el nombre de la categor√≠a. Hasta el par√°metro category_name toma el slug de la misma como valor. Yo suelo usarlo en lugar del ID ya que cuando vuelvo al c√≥digo pasado un tiempo, los slugs son m√°s f√°ciles de identificar que los IDs. Sin embargo, quiz√° los usuarios de la web vayan a cambiar el slug de una o varias categor√≠as, por lo que recomiendo usar el ID para evitar cualquier problema futuro.

Repasemos cada uno:

El Par√°metro cat

El par√°metro cat es bastante sencillo: usa el ID de una categor√≠a o una cadena de IDs de varias categor√≠as.

La consulta de una categoría tendría el siguiente aspecto:

$args = array(
    'cat' => '2'
);

La consulta de varias categorías tendría este aspecto:

$args = array(
    'cat' => '2, 3, 4'
);

Lo anterior le indicar√° a WordPress que debe consultar los post existentes en cualquiera de las categor√≠as listadas. Si quieres encontrar post pertenecientes a una cadena de categor√≠as, usa el par√°metro category_and, veremos esto m√°s adelante.

También puedes usar el parámetro cat para encontrar posts que pertenezcan a una categoría pero no a otra, usando el signo de restar justo antes del ID de la categoría, como en el siguiente ejemplo:

$args = array(
    'cat' => '2, -3'
);

Lo anterior consultar√° los posts de la categor√≠a 2, pero solo aquellos que no pertenezcan a su vez a la categor√≠a 3.

El Par√°metro category_name

El par√°metro category_name usa el slug de la categor√≠a, no su nombre (por aquello de las e√Īez, tildes, etc).

Para consultar posts pertenecientes a una √ļnica categor√≠a a√Īades lo siguiente:

$args = array(    
    'category_name' => 'nombre-slug'
    );

Y para encontrar las entradas pertenecientes a una o más categorías, usa esto:

$args = array(    
    'category_name' => 'nombre-slug, provincia-slug, empresa-slug'
    );

Al igual que ocurre con el par√°metro cat, esto no encontrar√° los posts existentes en todas las categor√≠as, sino los posts de cualquiera de las categor√≠as.

El Par√°metro category_and

Si quieres encontrar posts presentes en todas las categorías de una cadena, este es el parámetro que debes usar. Se necesitan los IDs de la categoría para su valor. Por tanto, para encontrar los posts pertenecientes a todas las tres categorías, usarías lo siguiente:

$args = array(    
    'category__and' => array(        
        '12', '13', '14' 
        )
    );

Observa que esto hace uso de un array, no de una cadena, por eso el código es distinto. El parámetro tiene dos guiones bajos en su nombre: si usas solo uno no funcionará.

El Par√°metro category_in

El siguiente parámetro busca los posts pertenecientes a una o más de una de las categorías de un array. Realmente funciona de la misma manera que el parámetro cat, y además toma el ID de la categoría como su valor.

Por tanto, para consultar posts pertenecientes a una o más categorías de un array, usarías lo siguiente:

$args = array(    
    'category__in' => array(        
        '2', '3', '4' 
        )
    );

El ejemplo de arriba devolverá los posts pertenecientes a una o más de una de esas categorías.

El Par√°metro category_not_in

El par√°metro category_not_in sirve para lo que te est√°s imaginando: consulta los posts que no pertenecen a una cierta categor√≠a o a un array de categor√≠as.

Para excluir posts de una categoría, usarías el siguiente código:

$args = array(    
    'category__not_in' => array(        
        '2' 
        )
    );

Y para excluir posts de un array de categorías:

$args = array(    
    'category__not_in' => array(        
        '2', '3', '4' 
        )
    );

Esto excluirá los posts de cualquiera de estas categorías.

Par√°metros de Etiqueta

Los par√°metros de etiqueta son:

  • tag (string): usa el slug de la etiqueta.
  • tag_id (int): usa el id de la etiqueta.
  • tag__and (array): usa los ids de las etiquetas.
  • tag__in (array): usa ids de etiquetas.
  • tag__not_in (array): usa ids de etiquetas.
  • tag_slug__and (array): usa el slug de la etiqueta.
  • tag_slug__in (array): usa el slug de la etiqueta.

Veamos cada uno de ellos.

El Par√°metro tag

El par√°metro tag usa el slug de la etiqueta como valor y puede usarse para encontrar posts que tengan asignada una determinada etiqueta o cualquier etiqueta que definas mediante una cadena.

Por tanto, para encontrar posts con una determinada etiqueta, usarías lo siguiente:

$args = array(    
    'tag' => 'mi-etiqueta'
    );

Y para encontrar posts con etiquetas presentes en un array de etiquetas:

$args = array(    
    'tag' => 'mi-etiqueta, mi-otra-etiqueta, otra-etiqueta'
    );

Observa que la anterior consulta localiza los posts con cualquiera de las etiquetas presentes en el array, no necesariamente todas.

El Par√°metro tag_id

El par√°metro tag_id funciona de forma similar a como lo hace el par√°metro cat: toma el ID de la etiqueta y puede usarse con una sola etiqueta o con varias.

Para encontrar posts con una √ļnica etiqueta usa esto:

$args = array(    
    'tag_id' => '2'
    );
123$args = array(    'tag_id' => '21');

Para encontrar posts con una o m√°s etiquetas definidas en una cadena de IDs de etiquetas:

$args = array(    
    'tag_id' => '2, 3, 4'
    );

Tambi√©n puedes utilizar tag_id para excluir etiquetas, tanto para etiquetas individuales o como para varias.

Por tanto para consultar posts excluyendo aquellos con una determinada etiqueta, usarías lo siguiente:

$args = array(    
    'tag_id' => '-20'
    );

Mientras que para encontrar posts con una de entre dos etiquetas pero además excluir otra, usarías lo siguiente:

$args = array(    
    'tag_id' => '19, -20, 22'
    );

Es decir, lo anterior localizar√≠a los posts con alguna o ambas de las siguientes etiquetas, 21 o 23, pero que en ning√ļn caso tengan asignada la etiqueta 22.

El Par√°metro tag_in

Este par√°metro le permite buscar mensajes con uno o m√°s de un conjunto de etiquetas. Funciona de la misma manera que tag cuando se utiliza con un array:

$args = array(    
    'tag_in' => array ( '19', '-20, '22')
    );

Para consultar los posts con cualquiera o todas las etiquetas enumeradas. Si deseas buscar posts con todas las etiquetas, usa tag__and, lo explicar√© en un momento.

El Par√°metro tag__not_in

El par√°metro tag__not_in te permite consultar los posts que no tienen asignada una determinada etiqueta o ninguna de las etiquetas presentes en un array.

√ösalo para excluir una etiqueta: 

$args = array(    
    'tag__not_in' => array ( '22')
    );

Observa que todavía necesitas usar un array, aunque solo estés usando una etiqueta. Para usar más etiquetas, usa:

$args = array(    
    'tag__not_in' => array ( '22', '23', '24' )
    );

Esto consultar√° los posts que no tengan asignada ninguna de las etiquetas de arriba.

Los Par√°metros tag_slug__and y tag_slug__in

Estos dos par√°metros se comportan en la misma forma que los par√°metros tag__and y tag__in, salvo que utilices ese slug de etiqueta en tus arrays en lugar del ID de etiqueta.

As√≠ que por ejemplo, para encontrar posts que tengan ambos pares de etiquetas, usar√≠as tag__slug_in:

$args = array(
    'tag_slug__in' => array(
        'mi-etiqueta',
        'tu-etiqueta',
        'otra-etiqueta'
    ));

Esto localizará los posts pertenecientes a cualquiera de estas etiquetas. También podrías usar el parámetro de la etiqueta con una cadena slugs de etiquetas para conseguir el mismo resultado.

Para incluir los posts con todas las etiquetas de un grupo, usa tag_slug__and:

$args = array(    
	'tag_slug__and' => array(
	        'mi-etiqueta',
	        'tu-etiqueta',
	        'otra-etiqueta'
	    ));

En lugar de consultar los posts con cualquiera de estas etiquetas, esto consultar√° solo los posts que tienen asignadas todas estas etiquetas.

Resumen

Consultar tus posts por categoría y/o etiqueta es algo que muy probablemente con WP_Query. Usando los argumentos anteriores y combinándolos, se puede crear consultas poderosas para extraer exactamente los datos que necesitas de la base de datos.

Un artículo de Rachel McCollinWordPress Developer and Writer, Birmingham UK