1. ¿Qué es WP_Query?

Es una clase definida en el núcleo de WordPress que permite realizar consultas personalizadas a la base de datos (tabla wp_posts) de forma segura y eficiente. Se utiliza cuando el «Loop principal» no es suficiente; por ejemplo, para mostrar:

  • Un carrusel de posts destacados en la Home.
  • Una lista de «Productos Relacionados» en un eCommerce.
  • Testimonios aleatorios en el footer.

2. Estructura Básica de una Consulta

Para trabajar con WP_Query, siempre debemos seguir un ciclo de cuatro pasos para evitar errores de memoria o conflictos con la consulta global.

PHP

// 1. Definir los argumentos (qué queremos buscar)
$args = array(
'post_type' => 'post',
'posts_per_page' => 3,
'category_name' => 'noticias'
);
// 2. Crear la instancia de la clase
$query_personalizada = new WP_Query( $args );
// 3. El Loop
if ( $query_personalizada->have_posts() ) {
while ( $query_personalizada->have_posts() ) {
$query_personalizada->the_post();
// Aquí va tu HTML y Template Tags
echo '<h2>' . get_the_title() . '</h2>';
}
} else {
echo '<p>No se encontraron resultados.</p>';
}
// 4. Restaurar el estado original de la global $post
wp_reset_postdata();

3. Parámetros Más Comunes

La potencia de WP_Query reside en la variedad de filtros que puedes aplicar en el array de argumentos ($args):

A. Autor, Categorías y Etiquetas

  • author / author_name: Filtrar por ID o por «slug».
  • cat / category_name: Filtrar por ID de categoría o slug.
  • tag: Filtrar por etiquetas.

B. Post Type y Estado

  • post_type: Puede ser post, page, o cualquier Custom Post Type (ej. producto, evento).
  • post_status: Por defecto es publish, pero puedes buscar draft, future (programados), etc.

C. Orden y Cantidad

  • posts_per_page: Cuántos resultados mostrar (usa -1 para mostrar todos).
  • orderby: Ordenar por date, title, rand (aleatorio), o meta_value_num.
  • order: DESC (descendente, por defecto) o ASC (ascendente).

4. Consultas Avanzadas (Taxonomías y Meta Data)

Aquí es donde WP_Query brilla. Puedes cruzar datos complejos:

Tax_Query (Filtros de Taxonomías)

Si tienes un Custom Post Type «Libros» y quieres filtrar por la taxonomía «Género» que sea «Aventura»:

PHP

'tax_query' => array(
array(
'taxonomy' => 'genero',
'field' => 'slug',
'terms' => 'aventura',
),
),

Meta_Query (Campos Personalizados)

Si quieres mostrar solo los eventos cuya fecha (un Custom Field) sea mayor a hoy:

PHP

'meta_query' => array(
array(
'key' => 'fecha_evento',
'value' => date('Ymd'),
'compare' => '>',
'type' => 'DATE'
),
),

5. Buenas Prácticas y Rendimiento

Regla de Oro: Siempre usa wp_reset_postdata(). Si no lo haces, WordPress creerá que el post actual es el último de tu consulta personalizada, rompiendo funciones como los comentarios, el sidebar o el footer de la página.

  1. Limita los resultados: No pidas más posts de los que vas a mostrar.
  2. Usa no_found_rows: Si no necesitas paginación, añade 'no_found_rows' => true a tus argumentos. Esto acelera la consulta porque WordPress no cuenta el total de posts que coinciden.
  3. Cuidado con las Meta Queries: Filtrar por campos personalizados es costoso para el servidor. Si el sitio tiene miles de registros, intenta optimizar usando taxonomías en su lugar.