WP_Query personalizada con paginación

Php marzo 10, 2026

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 -1 devuelve 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 como the_title().
  • paginate_links(): genera los enlaces de paginación. max_num_pages se 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.