it-swarm.dev

L'impaginazione con WP_Query è buggata: funziona per alcune pagine, ma non per le altre

Sto avendo un bug molto particolare con l'impaginazione :( Sto cercando di visualizzare 4 post per pagina per una categoria con slug "lastest-news".

La funzione di impaginazione sembra funzionare correttamente. Ci sono 33 post. L'impaginazione viene costruita correttamente con 9 pagine e link del seguente formato:/category/lastest-news/page //

La cosa interessante è che funziona correttamente (visualizzando 4 messaggi per pagina) da pagina 1-4 inclusi. Tuttavia, per le pagine 5-9 non funziona affatto. Non sembra nemmeno servire il modello ... l'unico errore che ho potuto individuare è la pagina che dice "Niente trovato per Categoria Lastest-news".

Capirei se non funzionerà affatto, ma per 4 pagine a caso e non di più?

Apprezzerei davvero qualsiasi aiuto! Ho passato circa 4 ore a cercare di capire cosa c'è che non va e mi disturba.

Grazie per l'aiuto :)

Sto usando il seguente codice per la query:

<?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);
?>

Sto usando la funzione di impaginazione da questo post: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

Ecco la funzione (che sembra funzionare bene):

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";
 }
}
4
dashaluna

WordPress fa la propria query su ogni pagina. Dovresti modificare quella query invece di crearne una nuova. Quello che succede ora è che WordPress fa una query con i post standard per pagina di 10, ma non fai nulla con questi risultati e fai la tua query. Funziona ... fino a quando WordPress va oltre il post # 33, che si trova sul numero di pagina 4.

  1. Domande WordPress 1-10, le tue query modello 1-4
  2. Domande WordPress 11-20, le query modello 5-8
  3. Query WordPress 21-30, le query modello 9-12
  4. Domande WordPress 31-40, le query modello 13-16
  5. WordPress interroga 41-50, ma non ottiene risultati, quindi fornisce 404. Il tuo modello non viene caricato.

Quindi, invece, dovresti modificare la query standard che WordPress eseguirà, inserendola nel tuo functions.php o in un plugin:

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 );
    }
}
6
Jan Fabry

In base alla risposta di @Jan Fabry, ho modificato la sintassi un po '. Funziona bene. Grazie Jan per la spiegazione !!!

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;
  }
}
1
dashaluna