WP_Query personalizada con paginación
WP_Query es la clase principal de WordPress para consultar la base de datos de posts. Permite construir cualquier consulta imaginable: filtrar por tipo de contenido, taxonomía, metadatos, fecha, autor y más. A diferencia de get_posts(), WP_Query soporta paginación nativa con paginate_links().
Casos de uso: listado de proyectos de una categoría específica, páginas de archivo personalizadas, widgets de contenido relacionado con paginación.
<?php
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
'post_type' => 'proyecto',
'posts_per_page' => 6,
'paged' => $paged,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'tecnologia',
'field' => 'slug',
'terms' => 'php',
),
),
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title( '', '
' );
}
echo paginate_links( array(
'total' => $query->max_num_pages,
'current' => $paged,
) );
wp_reset_postdata();
}
¿Qué hace cada parte?
- get_query_var( ‘paged’ ): obtiene el número de página actual de la URL. El ternario asegura que valga al menos 1 en la primera página.
- tax_query: filtra por taxonomía. El array anidado permite combinar múltiples filtros con
relation => 'AND'o'OR'. - posts_per_page: número de resultados por página. Con
-1devuelve todos (usar con precaución en sitios grandes). - have_posts() / the_post(): el bucle estándar de WordPress.
the_post()avanza el puntero y prepara las funciones de plantilla comothe_title(). - paginate_links(): genera los enlaces de paginación.
max_num_pagesse calcula automáticamente según el total de resultados y los posts por página. - wp_reset_postdata(): obligatorio después de un WP_Query secundario para restaurar el post global al post principal de la página.
