La paginación en WP_query no muestra los enlaces de navegación
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('« Entradas más recientes') ?>
<?php next_posts_link('Entradas antiguas »') ?>
</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('« Entradas más recientes') ?>
<?php next_posts_link('Entradas antiguas »') ?>
</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 »', $query->max_num_pages ); ?>
Todavía no veo el enlace de paginación.

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( '« Entradas más nuevas' );
next_posts_link( 'Entradas más antiguas »', $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;

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 ¿Has leído la pregunta que enlacé en mi comentario? Especialmente la parte relacionada con »Hackear el objeto de consulta principal«.

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

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
}
