1. Code
  2. PHP

Dominando WP_Query: Introducción

Por defecto, WordPress ejecutará una petición en cada página que muestre tu sitio, cuya naturaleza será determinada por el tipo de página que se esté viendo. Por lo tanto si se está viendo una página estática, WordPress ejecuta una consulta para mostrar la página con el ID correspondiente, mientras que si es una página de archivo la consulta recuperará todos los posts de ese archivo.
Scroll to top
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: Using the Loop

Spanish (Español) translation by Oscar Abad Folgueira (you can also view the original English article)

Por defecto, WordPress ejecutará una petición en cada página que muestre tu sitio, cuya naturaleza será determinada por el tipo de página que se esté viendo. Por lo tanto si se está viendo una página estática, WordPress ejecuta una consulta para mostrar la página con el ID correspondiente, mientras que si es una página de archivo la consulta recuperará todos los posts de ese archivo.

Pero a veces quieres hacer las cosas de manera algo diferente. Si en el contenido principal de tu página o en otra parte de tu página (como en la barra lateral o en el pie), puedes querer mostrar algún contenido específico que no se muestra con una consulta estándar.

La buena noticia es que WordPress hace esto posible con la clase WP_Query. Esta clase te proporciona con un buen número de parámetros que puedes utilizar para definir qué contenido quieres (que no está limitado a los posts) y entonces escribir un bucle que mostrará el contenido exactamente como quieres.

En esta serie de 10 tutoriales de Dominando WP_Query, Baris Unver y yo, te guiaremos por los entresijos de WP_Query para que una vez completada la serie de tutoriales seas capaz de usarlo en una variedad de escenarios y afinar el modo en que WordPress realiza las consultas de datos en la base de datos de tu sitio web.

En esta introducción veremos lo siguiente:

  • ¿Qué es WP_Query?
  • ¿Por qué usar WP_Query?
  • Problemas potenciales / de qué ser concientes.

¿Qué es WP_Query?

WP_Query es una clase que proporciona WordPress. Al decir que es una clase estamos diciendo que mediante su uso podemos acceder rápidamente a las variables, comprobaciones y funciones que han sido codificadas in esta clase en el core de WordPress, sin tener que preocuparnos de escribir nosotros mismos el código. Esto hace tu código más eficiente y seguro.

Si quieres entender como funciona exactamente WP_Query por dentro, puedes ver su código en el fichero includes/query.php.

WP_Query consta de 4 elementos principales:

  • los argumentos de la consulta, utilizando parámetros que veremos en detalle en esta serie de tutoriales
  • la consulta en si misma
  • el bucle, que mostrará el contenido del post, títulos o lo que quieras mostrar
  • para terminar: cerrar las etiquetas if y while y reseteando los datos del post.

En la práctica esto será algo parecido a lo siguiente:

1
<?php
2
$args = array(
3
    // arguments for your query

4
);
5
6
// the query

7
$query = new WP_Query( $args );
8
9
// The Loop

10
if ( $query->have_posts() ) :  while ( $query->have_posts() ) : $query->the_post() ;
11
  // contents of the Loop go here

12
13
endwhile : endif;
14
/* Restore original Post Data */
15
wp_reset_postdata();
16
?>

Podrías definir tus argumentos cuando estás escribiendo la consulta, pero yo prefiero definirlos antes, ya que mantiene las cosas ordenadas.

Reseteando los Datos del Post

En el ejemplo anterior he añadido wp_reset_postdata() después de cada consulta. Esto es importante debido a que resetea la consulta a la consulta principal que es ejecuta en esta página.

Por ejemplo, si estás usando WP_Query para ejecutar una consulta en la barra lateral, usando wp_reset_postdata() le dices a WordPress que todavía estamos en cualquier página que se está viendo y que tiene que trabajar con la consulta por defecto para esa página.

Si no haces esto, cualquier otra consulta que sea ejecutada en la página (incluyendo la consulta por defecto) puede fallar, y cualquier etiqueta condicional que compruebe el tipo de página que se está viendo, no funcionará.

¿Por qué usar WP_Query?

Si no has usado la clase WP_Query antes, te estarás preguntando por qué deberías empezar. Aquí voy a centrarme en dos aspectos sobre esto: por qué usar WP_Query sobre otros métodos de escritura de consultas personalizadas, y escenarios por donde debes empezar a usar WP_Query.

¿Por qué usar WP_Query en lugar de otros métodos?

WP_Query no es el único método para crear una consulta personalizada. Hay cuatro más:

  • pre_get_posts
  • get_posts()
  • get_pages()
  • query_posts() (que debes evitar, como explicaré)

No voy a detallar en cómo funciona cada una de ellas, pero está bien saber cuando son usadas:

  • pre_get_posts es un hook que modifica la consulta principal. Puedes usarla con una etiqueta condicional para comprobar si un cierto tipo de página se está viendo (por ejemplo la página de inicio) y en ese caso usarla para corregir la consulta que se está ejecutando (por ejemplo para eliminar los tres posts más recientes, si los estás mostrando en cualquier sitio de la página). Es una forma eficiente de modificar la consulta principal y debe ser tu primer puerto de llamada si eso es lo que quieres hacer. Sin embargo no puedes usarla para crear completamente una nueva consulta.
  • get_posts() y get_pages() son muy similares, con la principal diferencia obvia de sus nombres. Estas etiquetas de plantilla utilizan la clase WP_Query, por lo tanto son otra manera de hacer la misma cosa pero añadiendo un paso extra puesto que ellas llaman a la clase WP_Query en luga de hacerlo tu directamente. Sólo puedes usarlas para consultar posts o páginas, mientras que WP_Query es más potente y te deja consultar cualquier cosa que esté en tu base de datos.
  • query_posts() modifica la consulta principal pero no puede usarse en plugins o temas. Esto es porque lanza la consulta principal y vuelve a empezar, reemplazando la consulta principal con una nueva consulta. Además es propensa a errores, en particular con la paginación, y es ineficiente y afectará a los tiempos de carga de tu página. Si necesitas modificar la consulta principal, utiliza pre_get_posts, y si necesitas crear una nueva consulta, usa WP_Query.

El siguiente diagrama, publicado por Andrey "Rast" Savchenko bajo licencia Creative Commons, le da sentido a esto:

Make Sense of WP_Query FunctionsMake Sense of WP_Query FunctionsMake Sense of WP_Query Functions

Cuando podrías usar WP_Query

Hay varios escenarios en los que WP_Query es útil y no puedo explicarlos todos aquí, pero aquí tienes un resumen:

  • Para añadir una lista de posts relacionados debajo del post actual - por ejemplo una lista de todos los posts de la misma categoría.
  • Para crear dos bucles en la misma página: por ejemplo en una página de FAQ con los títulos de las preguntas arriba y el contenido debajo.
  • Para crear listas personalizadas de posts recientes en la barra lateral o en el pié de tu sitio web, cuando el widget de Posts Recientes no hace lo que tu necesitas (o quieres codificarlo tú mismo).
  • Para crear consultas personalizadas para taxonomías, utilizando más de una taxonomía para definir qué es lo que se muestra.
  • Para realizar consultas de tipos de post que no se muestran con la consulta por defecto, como los adjuntos.
  • Para crear páginas personalizadas con un número de consultas por diferentes tipos de datos, como he hecho en este ejemplo para un cliente.

Algunas Advertencias

La clase WP_Query es magnífica. He creado un montón de sitios web que necesitaban consultas personalizadas, por lo tanto yo la uso frecuentemente. Pero no viene sin desventajas. Aquí hay algunas cosas que debes tener en cuenta:

  • Si todo lo que necesitas hacer es cambiar la forma en que los posts se muestran para un tipo de contenido en concreto o un archivo, no utilices WP_Query. En su lugar, simplemente crea un fichero de plantilla para ese archivo o tipo de contenido, y modifica el bucle en este fichero de plantilla.
  • Si quieres mostrar más o menos posts de los que se muestran normalmente en una página de archivo (por ejemplo no mostrando una categoría en particular), no utilices WP_Query para crear una nueva consulta. En su lugar utiliza pre_get_posts para modificar la consulta principal, junto con una etiqueta condicional para simplemente mostrar dónde quieres hacerlo.
  • Cuidado con ejecutar demasiadas consultas en una página. Teóricamente podrías crear una página con un ciento de consultas pero piensa en la carga del servidor. Si necesitas más de cuatro o cinco consultas en una página, podrías querer considerar crear páginas extra.

Sumario

La clase WP_Query es una herramienta potente y extremadamente útil para crear consultas personalizadas y hacer que un sitio WordPress haga exactamente lo que tu quieres. Como hemos visto, hay veces en las que deberías usar otros métodos para crear consultas personalizadas, pero tiene una amplia gama de usos.

En el resto de tutoriales de esta serie, te mostraré los detalles de cómo usar WP_Query y como sacarle el máximo partido.

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!