La paginación en WP_query no muestra los enlaces de navegación

4 sept 2014, 16:23:55
Vistas: 29.2K
Votos: 6

Estoy teniendo problemas para agregar paginación a una página. Estoy usando WP_query y me gustaría mostrar 4 entradas por página. La consulta básica parece funcionar bien, pero debo estar omitiendo algo relacionado con la paginación.

// La consulta para 4 entradas
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = new WP_Query();
$query->query('showposts=4'.'&paged='.$paged);

if ( $query->have_posts() ) : 
    while ( $query->have_posts() ) : $query->the_post(); ?>
    <div class="post">
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      <p class="author">por <?php the_author(); ?></p>
    </div>
    <?php endwhile; ?>
    <!-- fin del bucle -->
    <nav>
        <?php previous_posts_link('&laquo; Entradas más recientes') ?>
        <?php next_posts_link('Entradas antiguas &raquo;') ?>
    </nav>

        <?php wp_reset_postdata();

        // Si no hay resultados
        else : ?>
            <p><?php _e( 'Lo sentimos, ninguna entrada coincide con tus criterios.' ); ?></p>
        <?php endif; ?>

He establecido la variable para la paginación en la parte superior así:

$query->query('showposts=4'.'&paged='.$paged);

Estoy incluyendo la navegación de paginación así:

<nav>
    <?php previous_posts_link('&laquo; Entradas más recientes') ?>
    <?php next_posts_link('Entradas antiguas &raquo;') ?>
</nav>

Pero solo obtengo HTML vacío <nav></nav> - sin errores, y no puedo descubrir qué me falta.

Edición: Según la sugerencia, he actualizado como:

        $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
        $args = array(
            'posts_per_page' => 4,
            'paged'          => $paged,
        );
        $query = new WP_Query( $args );

y actualicé el enlace del botón a:

<?php next_posts_link( 'Entradas antiguas &raquo;', $query->max_num_pages ); ?>

Todavía no veo el enlace de paginación.

2
Comentarios

Prueba esto: next_posts_link('Older posts &raquo;', $query->max_num_pages)

Howdy_McGee Howdy_McGee
4 sept 2014 16:50:45

Quizás quieras echar un vistazo a ¿Cómo solucionar la paginación para loops personalizados?.

Nicolai Grossherr Nicolai Grossherr
4 sept 2014 17:17:42
Todas las respuestas a la pregunta 2
7
13

Por favor, no utilices showposts, fue reemplazado por posts_per_page hace mucho tiempo.

Personalmente, añadiría los argumentos a WP_Query como se muestra a continuación, además la paginación debería funcionar de la siguiente manera:

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
    'posts_per_page' => 4,
    'paged'          => $paged,
);
$the_query = new WP_Query( $args );

global $wp_query;
// Guardar el objeto de consulta por defecto en una variable temporal
$tmp_query = $wp_query;
// Ahora borrarlo completamente
$wp_query = null;
// Re-popular la variable global con nuestra consulta personalizada
$wp_query = $the_query;

if ( $the_query->have_posts() ) : 
    while ( $the_query->have_posts() ) : $the_query->the_post();
        // código del loop
    endwhile;

    previous_posts_link( '&laquo; Entradas más nuevas' );
    next_posts_link( 'Entradas más antiguas &raquo;', $the_query->max_num_pages );
    wp_reset_postdata();

else :
    // código si no se encuentran entradas
endif;

// Restaurar el objeto de consulta original
$wp_query = null;
$wp_query = $tmp_query;

Que es lo mismo que la Q&A ¿Cómo arreglar la paginación para loops personalizados? que te enlacé por @ChipBennett.

Otra nota, si esto está en una plantilla de página que funciona como página de inicio estática, debes usar la variable de consulta page en lugar de paged:

$paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;
4 sept 2014 16:53:31
Comentarios

Hola. Esto está dentro de una página estándar, no una página frontal estática. Lamentablemente el código que has proporcionado no funciona :(

Francesca Francesca
4 sept 2014 17:43:11

Tu código debería funcionar +1

Pieter Goosen Pieter Goosen
4 sept 2014 17:53:46

@Francesca ¿Has leído la pregunta que enlacé en mi comentario? Especialmente la parte relacionada con »Hackear el objeto de consulta principal«.

Nicolai Grossherr Nicolai Grossherr
4 sept 2014 17:57:06

Gracias, esto sí funciona. Disculpas por no haber visto tu edición.

Francesca Francesca
4 sept 2014 18:47:02

Un placer. No hay problema, además al principio no había añadido el »hack de la consulta principal«, que es la razón por la que ahora funciona. @Francesca

Nicolai Grossherr Nicolai Grossherr
4 sept 2014 18:50:30

Ya no funciona. Muestra tantos errores.

sheetal sheetal
4 may 2018 10:13:33

@sheetal Funciona, solo me equivoqué con los nombres de las variables, ya lo arreglé.

Nicolai Grossherr Nicolai Grossherr
5 may 2018 12:49:10
Mostrar los 2 comentarios restantes
0

Una buena práctica es obtener el valor posts_per_page de WordPress. Puedes cambiar este valor en el menú de administración de WordPress.

$page = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
if(!$page)
    $page = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;

$posts_per_page = get_option( 'posts_per_page' );

$query = new WP_Query( array(
    'posts_per_page' => $posts_per_page,
    'paged'          => $page,
    'post_status'    => 'publish',
    'orderby'        => 'title',
    'order'          => 'ASC',
) );

while ( $query->have_posts() ) {
    $query->the_post();

    // Código para la salida
}
17 ago 2017 09:00:03