it-swarm.com.de

Die Paginierung mit WP_Query ist fehlerhaft - funktioniert für einige Seiten, aber nicht für die anderen

Ich habe einen sehr merkwürdigen Fehler mit Seitenumbrüchen :( Ich versuche, 4 Beiträge pro Seite für eine Kategorie mit dem Slug "lastest-news" anzuzeigen.

Die Paginierungsfunktion scheint korrekt zu funktionieren. Es gibt 33 Beiträge. Die Paginierung wird mit 9 Seiten und Links in folgendem Format korrekt aufgebaut:/category/lastest-news/page //

Das Interessante ist, dass es korrekt funktioniert (Anzeige von 4 Posts pro Seite) ab Seite 1-4 einschließlich. Für die Seiten 5-9 funktioniert dies jedoch überhaupt nicht. Es scheint nicht einmal der Vorlage zu dienen ... der einzige Fehler, den ich entdecken konnte, ist die Seite "Nothing found for Category Lastest-news Page 5".

Ich würde verstehen, wenn es überhaupt nicht funktioniert, aber für zufällig 4 Seiten und nicht mehr?

Ich würde mich über jede Hilfe wirklich sehr freuen! Ich habe über 4 Stunden damit verbracht herauszufinden, was los ist und es nervt mich.

Danke für die Hilfe :)

Ich verwende den folgenden Code für die Abfrage:

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

Ich verwende die Paginierungsfunktion aus diesem Beitrag: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

Hier ist die Funktion (die gut zu funktionieren scheint):

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 führt auf jeder Seite eine eigene Abfrage durch. Sie sollten diese Abfrage ändern, anstatt eine neue zu erstellen. Was jetzt passiert ist, dass WordPress eine Abfrage mit den Standardbeiträgen pro Seite von 10 macht, aber Sie machen nichts mit diesen Ergebnissen und machen Ihre eigene Abfrage. Dies funktioniert ... bis WordPress über Post # 33 hinausgeht, der sich auf Seite 4 befindet.

  1. WordPress fragt 1-10, Ihre Vorlage fragt 1-4
  2. WordPress-Abfragen 11-20, Ihre Vorlage-Abfragen 5-8
  3. WordPress fragt 21-30 ab, Ihre Vorlage fragt 9-12 ab
  4. WordPress-Abfragen 31-40, Ihre Vorlage-Abfragen 13-16
  5. WordPress fragt 41-50 ab, aber es werden keine Ergebnisse angezeigt, sodass 404 angezeigt wird. Ihre Vorlage wird nicht geladen.

Ändern Sie stattdessen die Standardabfrage, die WordPress ausführt, indem Sie diese in Ihren functions.php oder in ein Plugin einfügen:

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

Basierend auf der Antwort von Jan Fabry habe ich die Syntax ein wenig geändert. Es läuft gut. Danke Jan für die Erklärung !!!

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