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 Loopif ( $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 $postwp_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 serpost,page, o cualquier Custom Post Type (ej.producto,evento).post_status: Por defecto espublish, pero puedes buscardraft,future(programados), etc.
C. Orden y Cantidad
posts_per_page: Cuántos resultados mostrar (usa-1para mostrar todos).orderby: Ordenar pordate,title,rand(aleatorio), ometa_value_num.order:DESC(descendente, por defecto) oASC(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.
- Limita los resultados: No pidas más posts de los que vas a mostrar.
- Usa
no_found_rows: Si no necesitas paginación, añade'no_found_rows' => truea tus argumentos. Esto acelera la consulta porque WordPress no cuenta el total de posts que coinciden. - 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.