La paginación con WP_Query es buggy: funciona para algunas páginas, pero no para las otras

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7687

  •  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)."'>&laquo;</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo;</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)."'>&rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>&raquo;</a>";
     echo "</div>\n";
 }
}
¿Fue útil?

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.

  1. Consultas de WordPress 1-10, sus consultas de plantilla 1-4
  2. Consultas de WordPress 11-20, sus consultas de plantilla 5-8
  3. Consultas de WordPress 21-30, sus consultas de plantilla 9-12
  4. Consultas de WordPress 31-40, sus consultas de plantilla 13-16
  5. 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;
  }
}
Licenciado bajo: CC-BY-SA con atribución
scroll top