Impaginazione con WP_Query è buggy - lavorare per alcune pagine, ma non gli altri
-
16-10-2019 - |
Domanda
Sto avendo un bug molto particolare con impaginazione :( Sto cercando di visualizzare 4 posti per pagina per una categoria con lumaca "lastest-news".
La funzione di impaginazione sembra funzionare correttamente. Ci sono 33 messaggi. L'impaginazione viene costruito correttamente con 9 pagine e link di seguente formato: categoria / / lastest-news / page //
La cosa interessante è che funziona correttamente (la visualizzazione di 4 messaggi per pagina) dalla pagina 1-4 compreso. Tuttavia, per le pagine 5-9 non funziona affatto. Non sembra nemmeno di servire il modello ... l'unico errore che ho potuto individuare sia della pagina che dice "Nulla trovati per Categoria Lastest-news Page 5".
Vorrei capire se non funziona affatto, ma per il modo casuale 4 pagine e non più?
Vorrei davvero davvero apprezzare alcun aiuto! Ho spendere circa oltre 4 ore cercando di capire ciò che è sbagliato e mi rode.
Grazie per un aiuto:)
Sto utilizzando 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
Questa è 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)."'>«</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";
}
}
Soluzione
WordPress fa il suo propria query in ogni pagina. È necessario modificare la query, invece di crearne uno nuovo. Quello che succede ora è che WordPress fa una query con i messaggi normali per pagina di 10, ma non si fa nulla con questi risultati e fare la propria query. Questo funziona ... fino WordPress va oltre post # 33, che è il numero di pagina 4.
- WordPress interroga 1-10, il modello di query 1-4
- WordPress interroga 11-20, il modello di query 5-8
- WordPress interroga 21-30, il modello interroga 9-12
- WordPress interroga 31-40, il modello interroga 13-16
- WordPress interroga 41-50, ma ottiene alcun risultato, in modo che dà 404. Il modello non viene caricato.
Così, invece si dovrebbe modificare la query standard che WordPress eseguirà, ponendo questo nella vostra 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 );
}
}
Altri suggerimenti
In base a @Jan Fabry risposta ho modificare 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;
}
}