No se puede hacer funcionar paginate_links con una consulta personalizada
He creado una sección de noticias en mi sitio WordPress con los plugins advanced custom fields y custom post type ui. En la página personalizada de vista general de noticias (no los posts estándar de WordPress) quería limitar el número de noticias por página a seis y proporcionar una navegación con paginate_links. He construido el siguiente fragmento:
<section class="news-main" role="main">
<?php
$args = array(
'post_type' => 'news',
'posts_per_page' => '6'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$pagination = array(
'base' => '%_%',
'format' => '?page=%#%',
'total' => $the_query->max_num_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Siguiente >>' )
);
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<article class="news-snippet">
<header class="news-box">
<h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
<a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
</header>
<div class="news-wrap">
<p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
<p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Más →</a></p>
</div>
</article>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p>No hay entradas</p>
<?php endif; ?>
<nav>
<?php echo paginate_links( $pagination );
$wp_query = NULL;
$wp_query = $temp_query; ?>
</nav>
</section>
Primero se definen los argumentos para wp_query, luego se establece $the_query
con WP_Query, después la variable $wp_query
se guarda en una variable temporal, se reinicia con NULL y luego se establece en la variable $the_query
. En el último paso se establece el array de configuración para paginate_links
. Luego está el bucle para mostrar los posts de noticias. Después del bucle se llama a la función paginate_links y finalmente el $wp_query
se reinicia y se vuelve a escribir el contenido de la variable temporal $temp_query
.
Si tengo, digamos, 15 entradas de blog, mi salida se ve así:
Si paso el mouse sobre el número tres, el final del slug se ve así:
El problema es que los enlaces anterior y siguiente no se muestran aunque están configurados. Mientras que el problema principal es el slug dado - si hago clic en el número tres, llego a una página 404. "page 3" donde me redirige es desconocido para WordPress. Gracias de antemano Ralf
Actualización:
$args = array(
'post_type' => 'news',
'posts_per_page' => '1'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
$pagination = array(
'base' => '%_%',
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $current_page,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Siguiente >>' )
);
}
Actualización 2:
Ok, con los siguientes cambios en la primera parte del código conseguí que la navegación funcione
$args = array(
'post_type' => 'news',
'posts_per_page' => '3',
'paged' => get_query_var( 'paged' )
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$pagination = array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $the_paged,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Anterior' ),
'next_text' => __( 'Siguiente >>' )
);
}
La única pregunta que me queda (lo único que todavía no funciona bien) es si es posible que el primer enlace tenga link en lugar de link/?paged=1
En cuanto al número de páginas mostradas, revisa los argumentos para paginate_links
, específicamente end_size
y mid_size
.
Respecto al error 404 - El problema es que no existe una página 3. El que una página muestre contenido o cargue la plantilla 404 depende de los resultados de la consulta principal, no de tu consulta personalizada que ejecutas en la plantilla. Si se trata de un tipo de contenido page
, intenta establecer la variable de consulta paged
en lugar de page
.

Gracias, sí, la numeración ahora funciona correctamente, necesitaba algunos ajustes en la configuración, así como en los enlaces de anterior y siguiente. Básicamente, la paginación ya se ve bien, pero no es funcional en absoluto. Si hago clic ahora en el dos, llego a ?paged=2 y ya no aparece la plantilla 404. Pero por otro lado, todavía se muestran los artículos de la página inicial y el número uno permanece con la clase current en lugar del paged 2 en el que estoy. Además, el enlace Anterior no aparece.

Y sobre tu sospecha de que todo depende de la consulta principal en lugar de la consulta personalizada que ejecuto, pensé que con $wp_query = $the_query;
había "transferido" mi consulta personalizada a la consulta principal y la había hecho accesible a la función paginate_links.

He añadido una actualización al post inicial con un fragmento de código actualizado para las partes PHP relacionadas con paginate_links (intenté incluir paged, pero todavía no funciona :/ ).

el que se devuelva o no un error 404 ocurre antes de que se cargue tu plantilla, ese código nunca se ejecuta si las variables de consulta no son correctas. y estás viendo los primeros 6 posts en cada página porque no estableces paged
en los argumentos de tu consulta personalizada.

ahhhhhhhhhhhh ya veo. fui un poco lento - no había entendido y me di cuenta de que se puede usar paged
directamente en la consulta personalizada, pero tiene perfecto sentido. qué tonto fui :( Ok, ahora la visualización de artículos funciona perfectamente. Lo único que queda por arreglar es que la navegación con paginate_links
refleje los cambios. Pero tendré que probar y experimentar mañana por la mañana. Ahora ya es tarde. ¡Gracias!
