WP_Query en WordPress: qué es y cómo se usa (Parte 4)

En esta cuarta parte de WP_Query en WordPress aprenderemos a ordenar los resultados de una consulta utilizando los parámetros de ordenación. También veremos cómo modificar consultas mediante el hook pre_get_posts y algunos ejemplos prácticos de uso.

Los parámetros de ordenación en WP_Query nos permiten controlar el orden en el que WordPress devuelve los resultados de una consulta.

Gracias a ellos podemos ordenar publicaciones:

  • por fecha,
  • por título,
  • por autor,
  • por precio,
  • por número de comentarios,
  • por campos personalizados,
  • aleatoriamente,
  • etc.

Los dos parámetros más importantes son:

  • orderby
  • order

orderby

Indica el criterio utilizado para ordenar los resultados.

‘orderby’ => ‘title’,

order

Indica la dirección de la ordenación.

‘order’ => ‘ASC’,

Puede que algunos ejemplos os resulten familiares porque ya los hemos visto anteriormente, pero debido a la importancia de la ordenación en WP_Query merece la pena repasarlos nuevamente. Así que haremos un breve resumen.


   $args = [
      'post_type' => 'post',
      'orderby' => 'date',
      'order' => 'DESC',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'title',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'author',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'comment_count',
      'order' => 'DESC',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'rand',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'ID',
      'order' => 'DESC',
   ];

   $args = [
      'post_type' => 'post',
      'orderby' => 'name del slug',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => ['post', 'page'],
      'orderby' => 'type',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => 'libros',
      'meta_key' => 'book_languages',
      'orderby' => 'meta_value',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => 'libros',
      'meta_key' => 'book_preci',
      'orderby' => 'meta_value_num',
      'order' => 'ASC',
   ];

   $args = [
      'post_type' => 'libros',
      'orderby' => [
         'meta_value_num' => 'DESC',
         'title' => 'ASC',
      ],
      'meta_key'  => 'book_preci',
   ];

   $args = [
      'post_type' => 'page',
      'orderby' => 'menu_order',
      'order' => 'ASC',
   ];

Dominar estos parámetros resulta muy importante, ya que en proyectos reales necesitaremos mostrar el contenido de formas muy diferentes dependiendo de las necesidades de cada sitio web.

Una vez comprendidos los parámetros de ordenación, ya estamos preparados para comenzar a trabajar con consultas más complejas y personalizadas en nuestros propios sitios webs.

Imaginemos que estamos trabajando en un proyecto donde no tenemos acceso al código del tema activo, pero necesitamos modificar el contenido que aparece en la home del sitio.

Por ejemplo, podrían pedirnos que durante un día concreto solo se muestren publicaciones de la categoría “ofertas”.

Como no podemos modificar directamente la consulta principal del tema, necesitaremos utilizar una herramienta capaz de alterar esa query antes de que WordPress la ejecute.

Ahí es donde entra en acción el hook pre_get_posts.

La imagen superior corresponde a la home de nuestro sitio. Intentad dejarla igual que aparece en la captura, ya que he eliminado las entradas que utilizamos en ejercicios anteriores.

Lo primero que haremos dentro de pre_get_posts será indicarle a WordPress que no muestre las entradas destacadas.

Todos los fragmentos de código que veremos a continuación deberán añadirse al final del fichero functions.php de nuestro tema en WordPress.

Dicho esto, vamos a comenzar.


   /** pre_get_posts */
   add_action( 'pre_get_posts', function( $query ) {
	if ( ! is_admin() && $query->is_main_query() ) {
           if( $query->is_home() ) <---
	}

   } );

Primero añadimos la acción pre_get_posts y creamos una función anónima que recibe como parámetro el objeto $query.

Después verificamos con un if que no estamos dentro del panel de administración de WordPress y que únicamente vamos a modificar la query principal.

Una vez realizadas las comprobaciones, dentro del bloque if – endif añadiremos las condiciones necesarias según la plantilla que deseemos modificar.

En este ejemplo modificaremos la página principal del sitio web.

Después de comprobar que no estamos en el panel de administración y que nos encontramos en la query principal, verificamos que la consulta corresponde a la página de inicio.

A continuación añadiremos dentro del bloque if – endif los parámetros necesarios para modificar su comportamiento.


   /** pre_get_posts */
   add_action( 'pre_get_posts', function( $query ) {
      if ( ! is_admin() && $query->is_main_query() ) :

         if ( $query->is_home() ) :
            $query->set( 'ignore_sticky_posts', 1 );
	 endif;

      endif;
   } );

Se han eliminado las entradas destacadas.

Si deseamos modificar la query principal para que la home muestre publicaciones del CPT libro, deberíamos añadir el siguiente parámetro.



   add_action( 'pre_get_posts', function( $query ) {
	if ( ! is_admin() && $query->is_main_query() ) :

           if ( $query->is_home() ) :
	      $query->set( 'ignore_sticky_posts', 1 );
	      $query->set( 'posts_per_page', 2 );
	      $query->set( 'post_type', 'libro' );
	   endif;

	endif;
   } );

Si queremos limitar las búsquedas del sitio para que solo se realicen sobre el CPT libro, podemos añadir la siguiente condición dentro de pre_get_posts.



   add_action( 'pre_get_posts', function( $query ) {
	if ( ! is_admin() && $query->is_main_query() ) :

           if ( $query->is_home() ) :
	      $query->set( 'ignore_sticky_posts', 1 );
	      $query->set( 'posts_per_page', 2 );
	      $query->set( 'post_type', 'libro' );
	   endif;
        
           if( $query->is_search() ): 
              $query->set( 'post_type', 'libro' ); 
	   endif;

	endif;
   } );

Si realizamos una búsqueda utilizando la palabra “sangre”, WordPress únicamente buscará coincidencias dentro del CPT libro.

Por tanto, cualquier entrada, página o contenido perteneciente a otro tipo de publicación quedará excluido de los resultados aunque contenga dicha palabra.

Por otra parte, cualquiera de los ejemplos vistos anteriormente podemos utilizarlos en este Action Hook. Simplemente tendremos que colocar el código dentro de la función que acompaña a la acción pre_get_post.

Puedes ampliar conocimientos visitando