La paginación con WP_Query es buggy: funciona para algunas páginas, pero no para las otras
-
16-10-2019 - |
Pregunta
Estoy teniendo un error muy peculiar con la paginación :( Estoy intentando mostrar 4 publicaciones por página para una categoría con Slug "Last-News".
La función de paginación parece funcionar correctamente. Hay 33 publicaciones. La paginación se construye correctamente con 9 páginas y enlaces de formato siguiente:/categoría/último news/page //
Lo interesante es que funciona correctamente (mostrando 4 publicaciones por página) desde la página 1-4, incluido. Sin embargo, para las páginas 5-9 no funciona en absoluto. Ni siquiera parece servir a la plantilla ... el único error que podría detectar es de la página que dice "Nada que se encuentre para la categoría de la última página 5".
Entendería si no funciona en absoluto, pero para 4 páginas al azar y no más.
¡Realmente apreciaría realmente cualquier ayuda! He pasado unas más de 4 horas tratando de averiguar qué está mal y me está molestando.
Gracias por la ayuda :)
Estoy usando el siguiente código para la consulta:
<?php
$page = get_query_var('paged');
$posts_on_page = new WP_Query("posts_per_page=4&category_name=lastest-news&paged=".$page);
//loop to display every one of 4 posts
//pagination
pagination($posts_on_page->max_num_pages);
?>
Estoy usando la función de paginación de esta publicación: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin
Aquí está la función (que parece funcionar bien):
function pagination($pages = '', $range = 2){
$showitems = ($range * 2)+1;
global $paged;
if(empty($paged)) $paged = 1;
if($pages == '')
{
global $wp_query;
$pages = $wp_query->max_num_pages;
if(!$pages)
{
$pages = 1;
}
}
if(1 != $pages)
{
echo "<div class='pagination'>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>«</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹</a>";
for ($i=1; $i <= $pages; $i++)
{
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
{
echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
}
}
if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>»</a>";
echo "</div>\n";
}
}
Solución
WordPress hace su propia consulta en cada página. Debe modificar esa consulta en lugar de crear una nueva. Lo que sucede ahora es que WordPress hace una consulta con las publicaciones estándar por página de 10, pero no hace nada con estos resultados y hace su propia consulta. Esto funciona ... hasta que WordPress vaya más allá de la publicación #33, que está en la página número 4.
- Consultas de WordPress 1-10, sus consultas de plantilla 1-4
- Consultas de WordPress 11-20, sus consultas de plantilla 5-8
- Consultas de WordPress 21-30, sus consultas de plantilla 9-12
- Consultas de WordPress 31-40, sus consultas de plantilla 13-16
- WordPress consulta 41-50, pero no obtiene resultados, por lo que da 404. Su plantilla no se carga.
Entonces, en su lugar, debe modificar la consulta estándar que WordPress ejecutará, colocando esto en su functions.php
o en un complemento:
add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
if ( $wp_query->is_category && 'latest-news' == $wp_query->get_queried_object()->slug ) {
$wp_query->set( 'posts_per_page', 4 );
}
}
Otros consejos
Basado en @Jan Fabry Responder He cambiado un poco la sintaxis. Funciona bien. Gracias Jan por la explicación !!!
add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
if ($wp_query->query_vars['category_name'] == 'latest-news'){
$wp_query->query_vars['posts_per_page'] = 4;
}
}